1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file. 4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/err.h" 7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/input_conversion.h" 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "tools/gn/input_file.h" 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "tools/gn/parse_tree.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "tools/gn/scheduler.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "tools/gn/test_with_scope.h" 12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/value.h" 13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// InputConversion needs a global scheduler object. 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass InputConversionTest : public testing::Test { 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InputConversionTest() {} 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const Settings* settings() { return setup_.settings(); } 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestWithScope setup_; 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Scheduler scheduler_; 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, String) { 32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err err; 33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string input("\nfoo bar \n"); 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), input, NULL, 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "string"), &err); 36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_FALSE(err.has_error()); 37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(Value::STRING, result.type()); 38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(input, result.string_value()); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Test with trimming. 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result = ConvertInputToValue(settings(), input, NULL, 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "trim string"), &err); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(err.has_error()); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(Value::STRING, result.type()); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("foo bar", result.string_value()); 46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, ListLines) { 49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err err; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string input("\nfoo\nbar \n\n"); 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), input, NULL, 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "list lines"), &err); 53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_FALSE(err.has_error()); 54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(Value::LIST, result.type()); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(4u, result.list_value().size()); 56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("", result.list_value()[0].string_value()); 57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("foo", result.list_value()[1].string_value()); 58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("bar", result.list_value()[2].string_value()); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("", result.list_value()[3].string_value()); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Test with trimming. 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result = ConvertInputToValue(settings(), input, NULL, 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "trim list lines"), &err); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(err.has_error()); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(Value::LIST, result.type()); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(2u, result.list_value().size()); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("foo", result.list_value()[0].string_value()); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("bar", result.list_value()[1].string_value()); 69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, ValueString) { 72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err err; 73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string input("\"str\""); 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), input, NULL, 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "value"), &err); 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_FALSE(err.has_error()); 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(Value::STRING, result.type()); 78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("str", result.string_value()); 79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, ValueInt) { 82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err err; 83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string input("\n\n 6 \n "); 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), input, NULL, 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "value"), &err); 86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_FALSE(err.has_error()); 87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(Value::INTEGER, result.type()); 88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(6, result.int_value()); 89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, ValueList) { 92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err err; 93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string input("\n [ \"a\", 5]"); 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), input, NULL, 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "value"), &err); 96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_FALSE(err.has_error()); 97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ASSERT_EQ(Value::LIST, result.type()); 98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ASSERT_EQ(2u, result.list_value().size()); 99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("a", result.list_value()[0].string_value()); 100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(5, result.list_value()[1].int_value()); 101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, ValueDict) { 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Err err; 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string input("\n a = 5 b = \"foo\" c = a + 2"); 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), input, NULL, 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "scope"), &err); 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_FALSE(err.has_error()); 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_EQ(Value::SCOPE, result.type()); 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const Value* a_value = result.scope_value()->GetValue("a"); 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(a_value); 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(5, a_value->int_value()); 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const Value* b_value = result.scope_value()->GetValue("b"); 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(b_value); 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ("foo", b_value->string_value()); 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const Value* c_value = result.scope_value()->GetValue("c"); 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(c_value); 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(7, c_value->int_value()); 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Tests that when we get Values out of the input conversion, the resulting 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // values have an origin set to something corresponding to the input. 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ParseNode* a_origin = a_value->origin(); 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(a_origin); 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LocationRange a_range = a_origin->GetRange(); 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(2, a_range.begin().line_number()); 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(6, a_range.begin().char_offset()); 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const InputFile* a_file = a_range.begin().file(); 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(input, a_file->contents()); 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, ValueEmpty) { 136d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err err; 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), "", NULL, 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "value"), &err); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(err.has_error()); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(Value::NONE, result.type()); 141d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 142d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, ValueError) { 144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Err err; 145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::string input("\n [ \"a\", 5\nfoo bar"); 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), input, NULL, 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "value"), &err); 148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_TRUE(err.has_error()); 149d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Blocks not allowed. 151d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch input = "{ foo = 5 }"; 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result = ConvertInputToValue(settings(), input, NULL, 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "value"), &err); 154d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_TRUE(err.has_error()); 155d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 156d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Function calls not allowed. 157d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch input = "print(5)"; 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result = ConvertInputToValue(settings(), input, NULL, 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value(NULL, "value"), &err); 160d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_TRUE(err.has_error()); 161d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Passing none or the empty string for input conversion should ignore the 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// result. 165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(InputConversionTest, Ignore) { 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Err err; 167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Value result = ConvertInputToValue(settings(), "foo", NULL, Value(), &err); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(err.has_error()); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(Value::NONE, result.type()); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch result = ConvertInputToValue(settings(), "foo", NULL, Value(NULL, ""), &err); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(err.has_error()); 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(Value::NONE, result.type()); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 175