OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
6 #include "tools/gn/input_file.h" | 6 #include "tools/gn/input_file.h" |
7 #include "tools/gn/parse_tree.h" | 7 #include "tools/gn/parse_tree.h" |
8 #include "tools/gn/scope.h" | 8 #include "tools/gn/scope.h" |
| 9 #include "tools/gn/template.h" |
9 #include "tools/gn/test_with_scope.h" | 10 #include "tools/gn/test_with_scope.h" |
10 | 11 |
11 namespace { | 12 namespace { |
12 | 13 |
13 bool HasStringValueEqualTo(const Scope* scope, | 14 bool HasStringValueEqualTo(const Scope* scope, |
14 const char* name, | 15 const char* name, |
15 const char* expected_value) { | 16 const char* expected_value) { |
16 const Value* value = scope->GetValue(name); | 17 const Value* value = scope->GetValue(name); |
17 if (!value) | 18 if (!value) |
18 return false; | 19 return false; |
19 if (value->type() != Value::STRING) | 20 if (value->type() != Value::STRING) |
20 return false; | 21 return false; |
21 return value->string_value() == expected_value; | 22 return value->string_value() == expected_value; |
22 } | 23 } |
23 | 24 |
24 } // namespace | 25 } // namespace |
25 | 26 |
26 TEST(Scope, NonRecursiveMergeTo) { | 27 TEST(Scope, NonRecursiveMergeTo) { |
27 TestWithScope setup; | 28 TestWithScope setup; |
28 | 29 |
29 // Make a pretend parse node with proper tracking that we can blame for the | 30 // Make a pretend parse node with proper tracking that we can blame for the |
30 // given value. | 31 // given value. |
31 InputFile input_file(SourceFile("//foo")); | 32 InputFile input_file(SourceFile("//foo")); |
32 Token assignment_token(Location(&input_file, 1, 1), Token::STRING, | 33 Token assignment_token(Location(&input_file, 1, 1), Token::STRING, |
33 "\"hello\""); | 34 "\"hello\""); |
34 LiteralNode assignment; | 35 LiteralNode assignment; |
35 assignment.set_value(assignment_token); | 36 assignment.set_value(assignment_token); |
36 | 37 |
| 38 // Add some values to the scope. |
37 Value old_value(&assignment, "hello"); | 39 Value old_value(&assignment, "hello"); |
38 setup.scope()->SetValue("v", old_value, &assignment); | 40 setup.scope()->SetValue("v", old_value, &assignment); |
39 base::StringPiece private_var_name("_private"); | 41 base::StringPiece private_var_name("_private"); |
40 setup.scope()->SetValue(private_var_name, old_value, &assignment); | 42 setup.scope()->SetValue(private_var_name, old_value, &assignment); |
41 | 43 |
| 44 // Add some templates to the scope. |
| 45 FunctionCallNode templ_definition; |
| 46 scoped_refptr<Template> templ(new Template(setup.scope(), &templ_definition)); |
| 47 setup.scope()->AddTemplate("templ", templ.get()); |
| 48 scoped_refptr<Template> private_templ( |
| 49 new Template(setup.scope(), &templ_definition)); |
| 50 setup.scope()->AddTemplate("_templ", private_templ.get()); |
| 51 |
42 // Detect collisions of values' values. | 52 // Detect collisions of values' values. |
43 { | 53 { |
44 Scope new_scope(setup.settings()); | 54 Scope new_scope(setup.settings()); |
45 Value new_value(&assignment, "goodbye"); | 55 Value new_value(&assignment, "goodbye"); |
46 new_scope.SetValue("v", new_value, &assignment); | 56 new_scope.SetValue("v", new_value, &assignment); |
47 | 57 |
48 Err err; | 58 Err err; |
49 EXPECT_FALSE(setup.scope()->NonRecursiveMergeTo( | 59 EXPECT_FALSE(setup.scope()->NonRecursiveMergeTo( |
50 &new_scope, Scope::MergeOptions(), | 60 &new_scope, Scope::MergeOptions(), |
51 &assignment, "error", &err)); | 61 &assignment, "error", &err)); |
52 EXPECT_TRUE(err.has_error()); | 62 EXPECT_TRUE(err.has_error()); |
53 } | 63 } |
54 | 64 |
| 65 // Template name collisions. |
| 66 { |
| 67 Scope new_scope(setup.settings()); |
| 68 |
| 69 scoped_refptr<Template> new_templ( |
| 70 new Template(&new_scope, &templ_definition)); |
| 71 new_scope.AddTemplate("templ", new_templ.get()); |
| 72 |
| 73 Err err; |
| 74 EXPECT_FALSE(setup.scope()->NonRecursiveMergeTo( |
| 75 &new_scope, Scope::MergeOptions(), &assignment, "error", &err)); |
| 76 EXPECT_TRUE(err.has_error()); |
| 77 } |
| 78 |
55 // The clobber flag should just overwrite colliding values. | 79 // The clobber flag should just overwrite colliding values. |
56 { | 80 { |
57 Scope new_scope(setup.settings()); | 81 Scope new_scope(setup.settings()); |
58 Value new_value(&assignment, "goodbye"); | 82 Value new_value(&assignment, "goodbye"); |
59 new_scope.SetValue("v", new_value, &assignment); | 83 new_scope.SetValue("v", new_value, &assignment); |
60 | 84 |
61 Err err; | 85 Err err; |
62 Scope::MergeOptions options; | 86 Scope::MergeOptions options; |
63 options.clobber_existing = true; | 87 options.clobber_existing = true; |
64 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( | 88 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( |
65 &new_scope, options, &assignment, "error", &err)); | 89 &new_scope, options, &assignment, "error", &err)); |
66 EXPECT_FALSE(err.has_error()); | 90 EXPECT_FALSE(err.has_error()); |
67 | 91 |
68 const Value* found_value = new_scope.GetValue("v"); | 92 const Value* found_value = new_scope.GetValue("v"); |
69 ASSERT_TRUE(found_value); | 93 ASSERT_TRUE(found_value); |
70 EXPECT_TRUE(old_value == *found_value); | 94 EXPECT_TRUE(old_value == *found_value); |
71 } | 95 } |
72 | 96 |
| 97 // Clobber flag for templates. |
| 98 { |
| 99 Scope new_scope(setup.settings()); |
| 100 |
| 101 scoped_refptr<Template> new_templ( |
| 102 new Template(&new_scope, &templ_definition)); |
| 103 new_scope.AddTemplate("templ", new_templ.get()); |
| 104 Scope::MergeOptions options; |
| 105 options.clobber_existing = true; |
| 106 |
| 107 Err err; |
| 108 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( |
| 109 &new_scope, options, &assignment, "error", &err)); |
| 110 EXPECT_FALSE(err.has_error()); |
| 111 |
| 112 const Template* found_value = new_scope.GetTemplate("templ"); |
| 113 ASSERT_TRUE(found_value); |
| 114 EXPECT_TRUE(templ.get() == found_value); |
| 115 } |
| 116 |
73 // Don't flag values that technically collide but have the same value. | 117 // Don't flag values that technically collide but have the same value. |
74 { | 118 { |
75 Scope new_scope(setup.settings()); | 119 Scope new_scope(setup.settings()); |
76 Value new_value(&assignment, "hello"); | 120 Value new_value(&assignment, "hello"); |
77 new_scope.SetValue("v", new_value, &assignment); | 121 new_scope.SetValue("v", new_value, &assignment); |
78 | 122 |
79 Err err; | 123 Err err; |
80 Scope::MergeOptions options; | |
81 options.clobber_existing = true; | |
82 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( | 124 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( |
83 &new_scope, options, &assignment, "error", &err)); | 125 &new_scope, Scope::MergeOptions(), &assignment, "error", &err)); |
84 EXPECT_FALSE(err.has_error()); | 126 EXPECT_FALSE(err.has_error()); |
85 } | 127 } |
86 | 128 |
87 // Copy private values. | 129 // Templates that technically collide but are the same. |
88 { | 130 { |
89 Scope new_scope(setup.settings()); | 131 Scope new_scope(setup.settings()); |
90 | 132 |
| 133 scoped_refptr<Template> new_templ( |
| 134 new Template(&new_scope, &templ_definition)); |
| 135 new_scope.AddTemplate("templ", templ.get()); |
| 136 |
| 137 Err err; |
| 138 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( |
| 139 &new_scope, Scope::MergeOptions(), &assignment, "error", &err)); |
| 140 EXPECT_FALSE(err.has_error()); |
| 141 } |
| 142 |
| 143 // Copy private values and templates. |
| 144 { |
| 145 Scope new_scope(setup.settings()); |
| 146 |
91 Err err; | 147 Err err; |
92 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( | 148 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( |
93 &new_scope, Scope::MergeOptions(), &assignment, "error", &err)); | 149 &new_scope, Scope::MergeOptions(), &assignment, "error", &err)); |
94 EXPECT_FALSE(err.has_error()); | 150 EXPECT_FALSE(err.has_error()); |
95 EXPECT_TRUE(new_scope.GetValue(private_var_name)); | 151 EXPECT_TRUE(new_scope.GetValue(private_var_name)); |
| 152 EXPECT_TRUE(new_scope.GetTemplate("_templ")); |
96 } | 153 } |
97 | 154 |
98 // Skip private values. | 155 // Skip private values and templates. |
99 { | 156 { |
100 Scope new_scope(setup.settings()); | 157 Scope new_scope(setup.settings()); |
101 | 158 |
102 Err err; | 159 Err err; |
103 Scope::MergeOptions options; | 160 Scope::MergeOptions options; |
104 options.skip_private_vars = true; | 161 options.skip_private_vars = true; |
105 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( | 162 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( |
106 &new_scope, options, &assignment, "error", &err)); | 163 &new_scope, options, &assignment, "error", &err)); |
107 EXPECT_FALSE(err.has_error()); | 164 EXPECT_FALSE(err.has_error()); |
108 EXPECT_FALSE(new_scope.GetValue(private_var_name)); | 165 EXPECT_FALSE(new_scope.GetValue(private_var_name)); |
| 166 EXPECT_FALSE(new_scope.GetTemplate("_templ")); |
109 } | 167 } |
110 | 168 |
111 // Don't mark used. | 169 // Don't mark used. |
112 { | 170 { |
113 Scope new_scope(setup.settings()); | 171 Scope new_scope(setup.settings()); |
114 | 172 |
115 Err err; | 173 Err err; |
116 Scope::MergeOptions options; | 174 Scope::MergeOptions options; |
117 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( | 175 EXPECT_TRUE(setup.scope()->NonRecursiveMergeTo( |
118 &new_scope, options, &assignment, "error", &err)); | 176 &new_scope, options, &assignment, "error", &err)); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 | 286 |
229 TEST(Scope, RemovePrivateIdentifiers) { | 287 TEST(Scope, RemovePrivateIdentifiers) { |
230 TestWithScope setup; | 288 TestWithScope setup; |
231 setup.scope()->SetValue("a", Value(NULL, true), NULL); | 289 setup.scope()->SetValue("a", Value(NULL, true), NULL); |
232 setup.scope()->SetValue("_b", Value(NULL, true), NULL); | 290 setup.scope()->SetValue("_b", Value(NULL, true), NULL); |
233 | 291 |
234 setup.scope()->RemovePrivateIdentifiers(); | 292 setup.scope()->RemovePrivateIdentifiers(); |
235 EXPECT_TRUE(setup.scope()->GetValue("a")); | 293 EXPECT_TRUE(setup.scope()->GetValue("a")); |
236 EXPECT_FALSE(setup.scope()->GetValue("_b")); | 294 EXPECT_FALSE(setup.scope()->GetValue("_b")); |
237 } | 295 } |
OLD | NEW |