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