Home | History | Annotate | Download | only in gn
      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 
     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