|  | // Copyright 2015 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "tools/gn/args.h" | 
|  |  | 
|  | #include "test/test.h" | 
|  | #include "tools/gn/scheduler.h" | 
|  | #include "tools/gn/test_with_scope.h" | 
|  |  | 
|  | // Assertions for VerifyAllOverridesUsed() and DeclareArgs() with multiple | 
|  | // toolchains. | 
|  | TEST(ArgsTest, VerifyAllOverridesUsed) { | 
|  | TestWithScope setup1, setup2; | 
|  | Args args; | 
|  | Scope::KeyValueMap key_value_map1; | 
|  | Err err; | 
|  | LiteralNode assignment1; | 
|  |  | 
|  | setup1.scope()->SetValue("a", Value(nullptr, true), &assignment1); | 
|  | setup1.scope()->GetCurrentScopeValues(&key_value_map1); | 
|  | EXPECT_TRUE(args.DeclareArgs(key_value_map1, setup1.scope(), &err)); | 
|  |  | 
|  | LiteralNode assignment2; | 
|  | setup2.scope()->SetValue("b", Value(nullptr, true), &assignment2); | 
|  | Scope::KeyValueMap key_value_map2; | 
|  | setup2.scope()->GetCurrentScopeValues(&key_value_map2); | 
|  | EXPECT_TRUE(args.DeclareArgs(key_value_map2, setup2.scope(), &err)); | 
|  |  | 
|  | // Override "a", shouldn't see any errors as "a" was defined. | 
|  | args.AddArgOverride("a", Value(nullptr, true)); | 
|  | EXPECT_TRUE(args.VerifyAllOverridesUsed(&err)); | 
|  |  | 
|  | // Override "a", & "b", shouldn't see any errors as both were defined. | 
|  | args.AddArgOverride("b", Value(nullptr, true)); | 
|  | EXPECT_TRUE(args.VerifyAllOverridesUsed(&err)); | 
|  |  | 
|  | // Override "a", "b" and "c", should fail as "c" was not defined. | 
|  | args.AddArgOverride("c", Value(nullptr, true)); | 
|  | EXPECT_FALSE(args.VerifyAllOverridesUsed(&err)); | 
|  | } | 
|  |  | 
|  | // Ensure that arg overrides get only set after the they were declared. | 
|  | TEST(ArgsTest, VerifyOverrideScope) { | 
|  | TestWithScope setup; | 
|  | Args args; | 
|  | Err err; | 
|  |  | 
|  | args.AddArgOverride("a", Value(nullptr, "avalue")); | 
|  | args.AddArgOverride("current_os", Value(nullptr, "theiros")); | 
|  |  | 
|  | Scope::KeyValueMap toolchain_overrides; | 
|  | toolchain_overrides["b"] = Value(nullptr, "bvalue"); | 
|  | toolchain_overrides["current_os"] = Value(nullptr, "myos"); | 
|  | args.SetupRootScope(setup.scope(), toolchain_overrides); | 
|  |  | 
|  | // Overrides of arguments not yet declared aren't applied yet. | 
|  | EXPECT_EQ(nullptr, setup.scope()->GetValue("a")); | 
|  | EXPECT_EQ(nullptr, setup.scope()->GetValue("b")); | 
|  |  | 
|  | // |current_os| is a system var. and already declared. | 
|  | // Thus it should have our override value. | 
|  | ASSERT_NE(nullptr, setup.scope()->GetValue("current_os")); | 
|  | EXPECT_EQ(Value(nullptr, "myos"), *setup.scope()->GetValue("current_os")); | 
|  |  | 
|  | Scope::KeyValueMap key_value_map1; | 
|  | key_value_map1["a"] = Value(nullptr, "avalue2"); | 
|  | key_value_map1["b"] = Value(nullptr, "bvalue2"); | 
|  | key_value_map1["c"] = Value(nullptr, "cvalue2"); | 
|  | EXPECT_TRUE(args.DeclareArgs(key_value_map1, setup.scope(), &err)); | 
|  |  | 
|  | ASSERT_NE(nullptr, setup.scope()->GetValue("a")); | 
|  | EXPECT_EQ(Value(nullptr, "avalue"), *setup.scope()->GetValue("a")); | 
|  |  | 
|  | ASSERT_NE(nullptr, setup.scope()->GetValue("b")); | 
|  | EXPECT_EQ(Value(nullptr, "bvalue"), *setup.scope()->GetValue("b")); | 
|  |  | 
|  | // This wasn't overwritten, so it should have the default value. | 
|  | ASSERT_NE(nullptr, setup.scope()->GetValue("c")); | 
|  | EXPECT_EQ(Value(nullptr, "cvalue2"), *setup.scope()->GetValue("c")); | 
|  | } |