diff options
Diffstat (limited to 'gn/src/gn/args_unittest.cc')
-rw-r--r-- | gn/src/gn/args_unittest.cc | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/gn/src/gn/args_unittest.cc b/gn/src/gn/args_unittest.cc new file mode 100644 index 00000000000..650db6daa27 --- /dev/null +++ b/gn/src/gn/args_unittest.cc @@ -0,0 +1,81 @@ +// 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 "gn/args.h" + +#include "gn/scheduler.h" +#include "gn/test_with_scope.h" +#include "util/test/test.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")); +} |