• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "testing/gtest/include/gtest/gtest.h"
6 #include "tools/gn/functions.h"
7 #include "tools/gn/parse_tree.h"
8 #include "tools/gn/test_with_scope.h"
9 #include "tools/gn/value.h"
10 
TEST(Functions,Defined)11 TEST(Functions, Defined) {
12   TestWithScope setup;
13 
14   FunctionCallNode function_call;
15   Err err;
16 
17   // Test an undefined identifier.
18   Token undefined_token(Location(), Token::IDENTIFIER, "undef");
19   ListNode args_list_identifier_undefined;
20   args_list_identifier_undefined.append_item(
21       scoped_ptr<ParseNode>(new IdentifierNode(undefined_token)));
22   Value result = functions::RunDefined(setup.scope(), &function_call,
23                                        &args_list_identifier_undefined, &err);
24   ASSERT_EQ(Value::BOOLEAN, result.type());
25   EXPECT_FALSE(result.boolean_value());
26 
27   // Define a value that's itself a scope value.
28   const char kDef[] = "def";  // Defined variable name.
29   setup.scope()->SetValue(kDef,
30       Value(NULL, scoped_ptr<Scope>(new Scope(setup.scope()))),
31       NULL);
32 
33   // Test the defined identifier.
34   Token defined_token(Location(), Token::IDENTIFIER, kDef);
35   ListNode args_list_identifier_defined;
36   args_list_identifier_defined.append_item(
37       scoped_ptr<ParseNode>(new IdentifierNode(defined_token)));
38   result = functions::RunDefined(setup.scope(), &function_call,
39                                  &args_list_identifier_defined, &err);
40   ASSERT_EQ(Value::BOOLEAN, result.type());
41   EXPECT_TRUE(result.boolean_value());
42 
43   // Should also work by passing an accessor node so you can do
44   // "defined(def.foo)" to see if foo is defined on the def scope.
45   scoped_ptr<AccessorNode> undef_accessor(new AccessorNode);
46   undef_accessor->set_base(defined_token);
47   undef_accessor->set_member(scoped_ptr<IdentifierNode>(
48       new IdentifierNode(undefined_token)));
49   ListNode args_list_accessor_defined;
50   args_list_accessor_defined.append_item(undef_accessor.PassAs<ParseNode>());
51   result = functions::RunDefined(setup.scope(), &function_call,
52                                  &args_list_accessor_defined, &err);
53   ASSERT_EQ(Value::BOOLEAN, result.type());
54   EXPECT_FALSE(result.boolean_value());
55 }
56