Index: tools/gn/functions_unittest.cc |
diff --git a/tools/gn/functions_unittest.cc b/tools/gn/functions_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..74ca6054a0b081ea3907315f0eefe27380e8ea38 |
--- /dev/null |
+++ b/tools/gn/functions_unittest.cc |
@@ -0,0 +1,55 @@ |
+// Copyright 2014 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 "testing/gtest/include/gtest/gtest.h" |
+#include "tools/gn/functions.h" |
+#include "tools/gn/parse_tree.h" |
+#include "tools/gn/test_with_scope.h" |
+#include "tools/gn/value.h" |
+ |
+TEST(Functions, Defined) { |
+ TestWithScope setup; |
+ |
+ //InputFile input_file(SourceFile("//foo")); |
+ FunctionCallNode function_call; |
+ Err err; |
+ |
+ // Test an undefined identifier. |
+ Token undefined_token(Location(), Token::IDENTIFIER, "undef"); |
+ ListNode args_list_identifier_undefined; |
+ args_list_identifier_undefined.append_item( |
+ scoped_ptr<ParseNode>(new IdentifierNode(undefined_token))); |
+ Value result = functions::RunDefined(setup.scope(), &function_call, |
+ &args_list_identifier_undefined, &err); |
+ ASSERT_EQ(Value::BOOLEAN, result.type()); |
+ EXPECT_FALSE(result.boolean_value()); |
+ |
+ // Define a value that's itself a scope value. |
+ const char kDef[] = "def"; // Defined variable name. |
+ Scope nested(setup.scope()); |
+ setup.scope()->SetValue(kDef, Value(NULL, &nested), NULL); |
+ |
+ // Test the defined identifier. |
+ Token defined_token(Location(), Token::IDENTIFIER, kDef); |
+ ListNode args_list_identifier_defined; |
+ args_list_identifier_defined.append_item( |
+ scoped_ptr<ParseNode>(new IdentifierNode(defined_token))); |
+ result = functions::RunDefined(setup.scope(), &function_call, |
+ &args_list_identifier_defined, &err); |
+ ASSERT_EQ(Value::BOOLEAN, result.type()); |
+ EXPECT_TRUE(result.boolean_value()); |
+ |
+ // Should also work by passing an accessor node so you can do |
+ // "defined(def.foo)" to see if foo is defined on the def scope. |
+ scoped_ptr<AccessorNode> undef_accessor(new AccessorNode); |
+ undef_accessor->set_base(defined_token); |
+ undef_accessor->set_member(scoped_ptr<IdentifierNode>( |
+ new IdentifierNode(undefined_token))); |
+ ListNode args_list_accessor_defined; |
+ args_list_accessor_defined.append_item(undef_accessor.PassAs<ParseNode>()); |
+ result = functions::RunDefined(setup.scope(), &function_call, |
+ &args_list_accessor_defined, &err); |
+ ASSERT_EQ(Value::BOOLEAN, result.type()); |
+ EXPECT_FALSE(result.boolean_value()); |
+} |