add test for RootNodes(); fix comment
authorEvan Martin <martine@danga.com>
Sun, 1 May 2011 02:30:30 +0000 (19:30 -0700)
committerEvan Martin <martine@danga.com>
Sun, 1 May 2011 02:51:45 +0000 (19:51 -0700)
src/graph_test.cc
src/ninja.h
src/ninja_jumble.cc

index 7e0eac0..7b28e87 100644 (file)
@@ -97,3 +97,19 @@ TEST_F(GraphTest, PathWithCurrentDirectory) {
 
   EXPECT_FALSE(GetNode("out.o")->dirty_);
 }
+
+TEST_F(GraphTest, RootNodes) {
+  ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
+"build out1: cat in1\n"
+"build mid1: cat in1\n"
+"build out2: cat mid1\n"
+"build out3 out4: cat mid1\n"));
+
+  string err;
+  vector<Node*> root_nodes = state_.RootNodes(&err);
+  EXPECT_EQ(4, root_nodes.size());
+  for (size_t i = 0; i < root_nodes.size(); ++i) {
+    string name = root_nodes[i]->file_->path_;
+    EXPECT_EQ("out", name.substr(0, 3));
+  }
+}
index 1ff4e32..180f90c 100644 (file)
@@ -88,7 +88,7 @@ struct State {
   Node* LookupNode(const string& path);
   void AddIn(Edge* edge, const string& path);
   void AddOut(Edge* edge, const string& path);
-  /// @return the root node(s) of the graph. (Root nodes have no input edges).
+  /// @return the root node(s) of the graph. (Root nodes have no output edges).
   /// @param error where to write the error message if somethings went wrong.
   vector<Node*> RootNodes(string* error);
 
index e6a0de6..cb0ca5e 100644 (file)
@@ -183,20 +183,20 @@ void State::AddOut(Edge* edge, const string& path) {
   node->in_edge_ = edge;
 }
 
-vector<Node*> State::RootNodes(string* error)
-{
-  assert(error);
+vector<Node*> State::RootNodes(string* err) {
   vector<Node*> root_nodes;
   // Search for nodes with no output.
-  for (vector<Edge*>::iterator e = edges_.begin(); e != edges_.end(); ++e)
-    for (vector<Node*>::iterator outs = (*e)->outputs_.begin();
-         outs != (*e)->outputs_.end();
-         ++outs)
-      if ((*outs)->out_edges_.size() == 0)
-        root_nodes.push_back(*outs);
-  if (!edges_.empty() && root_nodes.empty()) {
-    *error = "could not determine root nodes of build graph";
+  for (vector<Edge*>::iterator e = edges_.begin(); e != edges_.end(); ++e) {
+    for (vector<Node*>::iterator out = (*e)->outputs_.begin();
+         out != (*e)->outputs_.end(); ++out) {
+      if ((*out)->out_edges_.empty())
+        root_nodes.push_back(*out);
+    }
   }
+
+  if (!edges_.empty() && root_nodes.empty())
+    *err = "could not determine root nodes of build graph";
+
   assert(edges_.empty() || !root_nodes.empty());
   return root_nodes;
 }