Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Unified Diff: tools/gn/operators_unittest.cc

Issue 2187523003: Allow creation and modification of scopes in GN. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/operators.cc ('k') | tools/gn/parse_tree.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/operators_unittest.cc
diff --git a/tools/gn/operators_unittest.cc b/tools/gn/operators_unittest.cc
index dd31b8261e2f1c1a0f4c420b68a8f35ec1d6caba..e2c396c4b684c23ed0326f749d167b3dc2418dc9 100644
--- a/tools/gn/operators_unittest.cc
+++ b/tools/gn/operators_unittest.cc
@@ -35,6 +35,30 @@ std::unique_ptr<ListNode> ListWithLiteral(const Token& token) {
return list;
}
+// This parse node is for passing to tests. It returns a canned value for
+// Execute().
+class TestParseNode : public ParseNode {
+ public:
+ TestParseNode(const Value& v) : value_(v) {
+ }
+
+ Value Execute(Scope* scope, Err* err) const override {
+ return value_;
+ }
+ LocationRange GetRange() const override {
+ return LocationRange();
+ }
+ Err MakeErrorDescribing(const std::string& msg,
+ const std::string& help) const override {
+ return Err(this, msg);
+ }
+ void Print(std::ostream& out, int indent) const override {
+ }
+
+ private:
+ Value value_;
+};
+
} // namespace
TEST(Operators, SourcesAppend) {
@@ -158,6 +182,56 @@ TEST(Operators, ListAppend) {
EXPECT_TRUE(err.has_error());
}
+TEST(Operators, ListRemove) {
+ Err err;
+ TestWithScope setup;
+
+ const char foo_str[] = "foo";
+ const char bar_str[] = "bar";
+ Value test_list(nullptr, Value::LIST);
+ test_list.list_value().push_back(Value(nullptr, foo_str));
+ test_list.list_value().push_back(Value(nullptr, bar_str));
+ test_list.list_value().push_back(Value(nullptr, foo_str));
+
+ // Set up "var" with an the test list.
+ const char var_str[] = "var";
+ setup.scope()->SetValue(var_str, test_list, nullptr);
+
+ // Set up the operator.
+ BinaryOpNode node;
+ const char token_value[] = "-=";
+ Token op(Location(), Token::MINUS_EQUALS, token_value);
+ node.set_op(op);
+
+ // Do -= on the var.
+ Token identifier_token(Location(), Token::IDENTIFIER, var_str);
+ node.set_left(
+ std::unique_ptr<ParseNode>(new IdentifierNode(identifier_token)));
+
+ // Subtract a list consisting of "foo".
+ Value foo_list(nullptr, Value::LIST);
+ foo_list.list_value().push_back(Value(nullptr, foo_str));
+ std::unique_ptr<ParseNode> outer_list(new TestParseNode(foo_list));
+ node.set_right(std::move(outer_list));
+
+ Value result = ExecuteBinaryOperator(
+ setup.scope(), &node, node.left(), node.right(), &err);
+ EXPECT_FALSE(err.has_error());
+
+ // -= returns an empty value to reduce the possibility of writing confusing
+ // cases like foo = bar += 1.
+ EXPECT_EQ(Value::NONE, result.type());
+
+ // The "var" variable should have been updated. Both instances of "foo" are
+ // deleted.
+ const Value* new_value = setup.scope()->GetValue(var_str);
+ ASSERT_TRUE(new_value);
+ ASSERT_EQ(Value::LIST, new_value->type());
+ ASSERT_EQ(1u, new_value->list_value().size());
+ ASSERT_EQ(Value::STRING, new_value->list_value()[0].type());
+ EXPECT_EQ("bar", new_value->list_value()[0].string_value());
+}
+
TEST(Operators, ShortCircuitAnd) {
Err err;
TestWithScope setup;
« no previous file with comments | « tools/gn/operators.cc ('k') | tools/gn/parse_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698