| // Copyright 2018 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 "gn/output_conversion.h" | |
| #include <sstream> | |
| #include "gn/err.h" | |
| #include "gn/input_conversion.h" | |
| #include "gn/scope.h" | |
| #include "gn/template.h" | |
| #include "gn/test_with_scheduler.h" | |
| #include "gn/test_with_scope.h" | |
| #include "gn/value.h" | |
| #include "util/test/test.h" | |
| namespace { | |
| // InputConversion needs a global scheduler object. | |
| class OutputConversionTest : public TestWithScheduler { | |
| public: | |
| OutputConversionTest() = default; | |
| const Settings* settings() { return setup_.settings(); } | |
| Scope* scope() { return setup_.scope(); } | |
| private: | |
| TestWithScope setup_; | |
| }; | |
| } // namespace | |
| TEST_F(OutputConversionTest, ListLines) { | |
| Err err; | |
| Value output(nullptr, Value::LIST); | |
| output.list_value().push_back(Value(nullptr, "")); | |
| output.list_value().push_back(Value(nullptr, "foo")); | |
| output.list_value().push_back(Value(nullptr, "")); | |
| output.list_value().push_back(Value(nullptr, "bar")); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "list lines"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ("\nfoo\n\nbar\n", result.str()); | |
| } | |
| TEST_F(OutputConversionTest, String) { | |
| Err err; | |
| Value output(nullptr, "foo bar"); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "foo bar"); | |
| } | |
| TEST_F(OutputConversionTest, StringInt) { | |
| Err err; | |
| Value output(nullptr, int64_t(6)); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "\"6\""); | |
| } | |
| TEST_F(OutputConversionTest, StringBool) { | |
| Err err; | |
| Value output(nullptr, true); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "\"true\""); | |
| } | |
| TEST_F(OutputConversionTest, StringList) { | |
| Err err; | |
| Value output(nullptr, Value::LIST); | |
| output.list_value().push_back(Value(nullptr, "foo")); | |
| output.list_value().push_back(Value(nullptr, "bar")); | |
| output.list_value().push_back(Value(nullptr, int64_t(6))); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "\"[\"foo\", \"bar\", 6]\""); | |
| } | |
| TEST_F(OutputConversionTest, StringScope) { | |
| Err err; | |
| auto new_scope = std::make_unique<Scope>(settings()); | |
| // Add some values to the scope. | |
| Value value(nullptr, "hello"); | |
| new_scope->SetValue("v", value, nullptr); | |
| std::string_view private_var_name("_private"); | |
| new_scope->SetValue(private_var_name, value, nullptr); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), Value(nullptr, std::move(new_scope)), | |
| Value(nullptr, "string"), result, &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "\"{\n _private = \"hello\"\n v = \"hello\"\n}\""); | |
| } | |
| TEST_F(OutputConversionTest, ValueString) { | |
| Err err; | |
| Value output(nullptr, "foo bar"); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "\"foo bar\""); | |
| } | |
| TEST_F(OutputConversionTest, ValueInt) { | |
| Err err; | |
| Value output(nullptr, int64_t(6)); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "6"); | |
| } | |
| TEST_F(OutputConversionTest, ValueBool) { | |
| Err err; | |
| Value output(nullptr, true); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "true"); | |
| } | |
| TEST_F(OutputConversionTest, ValueList) { | |
| Err err; | |
| Value output(nullptr, Value::LIST); | |
| output.list_value().push_back(Value(nullptr, "foo")); | |
| output.list_value().push_back(Value(nullptr, "bar")); | |
| output.list_value().push_back(Value(nullptr, int64_t(6))); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "[\"foo\", \"bar\", 6]"); | |
| } | |
| TEST_F(OutputConversionTest, ValueScope) { | |
| Err err; | |
| auto new_scope = std::make_unique<Scope>(settings()); | |
| // Add some values to the scope. | |
| Value value(nullptr, "hello"); | |
| new_scope->SetValue("v", value, nullptr); | |
| std::string_view private_var_name("_private"); | |
| new_scope->SetValue(private_var_name, value, nullptr); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), Value(nullptr, std::move(new_scope)), | |
| Value(nullptr, "value"), result, &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "{\n _private = \"hello\"\n v = \"hello\"\n}"); | |
| } | |
| TEST_F(OutputConversionTest, JSON) { | |
| Err err; | |
| auto new_scope = std::make_unique<Scope>(settings()); | |
| // Add some values to the scope. | |
| Value a_value(nullptr, "foo"); | |
| new_scope->SetValue("a", a_value, nullptr); | |
| Value b_value(nullptr, int64_t(6)); | |
| new_scope->SetValue("b", b_value, nullptr); | |
| auto c_scope = std::make_unique<Scope>(settings()); | |
| Value e_value(nullptr, Value::LIST); | |
| e_value.list_value().push_back(Value(nullptr, "bar")); | |
| e_value.list_value().push_back(Value(nullptr, "$")); | |
| auto e_value_scope = std::make_unique<Scope>(settings()); | |
| Value d_value(nullptr, "$"); | |
| e_value_scope->SetValue("d", d_value, nullptr); | |
| Value f_value(nullptr, "baz"); | |
| e_value_scope->SetValue("f", f_value, nullptr); | |
| e_value.list_value().push_back(Value(nullptr, std::move(e_value_scope))); | |
| c_scope->SetValue("e", e_value, nullptr); | |
| new_scope->SetValue("c", Value(nullptr, std::move(c_scope)), nullptr); | |
| std::string expected(R"*({ | |
| "a": "foo", | |
| "b": 6, | |
| "c": { | |
| "e": [ | |
| "bar", | |
| "$", | |
| { | |
| "d": "$", | |
| "f": "baz" | |
| } | |
| ] | |
| } | |
| })*"); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), Value(nullptr, std::move(new_scope)), | |
| Value(nullptr, "json"), result, &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), expected); | |
| } | |
| TEST_F(OutputConversionTest, ValueEmpty) { | |
| Err err; | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), Value(), Value(nullptr, ""), result, &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "<void>"); | |
| } | |
| TEST_F(OutputConversionTest, DefaultValue) { | |
| Err err; | |
| Value output(nullptr, "foo bar"); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, ""), result, &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(result.str(), "foo bar"); | |
| } | |
| TEST_F(OutputConversionTest, DefaultListLines) { | |
| Err err; | |
| Value output(nullptr, Value::LIST); | |
| output.list_value().push_back(Value(nullptr, "")); | |
| output.list_value().push_back(Value(nullptr, "foo")); | |
| output.list_value().push_back(Value(nullptr, "")); | |
| output.list_value().push_back(Value(nullptr, "bar")); | |
| std::ostringstream result; | |
| ConvertValueToOutput(settings(), output, Value(nullptr, ""), result, &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ("\nfoo\n\nbar\n", result.str()); | |
| } | |
| TEST_F(OutputConversionTest, ReverseString) { | |
| Err err; | |
| std::string input("foo bar"); | |
| Value result = ConvertInputToValue(settings(), input, nullptr, | |
| Value(nullptr, "string"), &err); | |
| EXPECT_SUCCESS(err); | |
| std::ostringstream reverse; | |
| ConvertValueToOutput(settings(), result, Value(nullptr, "string"), reverse, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(reverse.str(), input); | |
| } | |
| TEST_F(OutputConversionTest, ReverseListLines) { | |
| Err err; | |
| std::string input("\nfoo\nbar\n\n"); | |
| Value result = ConvertInputToValue(settings(), input, nullptr, | |
| Value(nullptr, "list lines"), &err); | |
| EXPECT_SUCCESS(err); | |
| std::ostringstream reverse; | |
| ConvertValueToOutput(settings(), result, Value(nullptr, "list lines"), | |
| reverse, &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(reverse.str(), input); | |
| } | |
| TEST_F(OutputConversionTest, ReverseValueString) { | |
| Err err; | |
| std::string input("\"str\""); | |
| Value result = ConvertInputToValue(settings(), input, nullptr, | |
| Value(nullptr, "value"), &err); | |
| EXPECT_SUCCESS(err); | |
| std::ostringstream reverse; | |
| ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(reverse.str(), input); | |
| } | |
| TEST_F(OutputConversionTest, ReverseValueInt) { | |
| Err err; | |
| std::string input("6"); | |
| Value result = ConvertInputToValue(settings(), input, nullptr, | |
| Value(nullptr, "value"), &err); | |
| EXPECT_SUCCESS(err); | |
| std::ostringstream reverse; | |
| ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(reverse.str(), input); | |
| } | |
| TEST_F(OutputConversionTest, ReverseValueList) { | |
| Err err; | |
| std::string input("[\"a\", 5]"); | |
| Value result = ConvertInputToValue(settings(), input, nullptr, | |
| Value(nullptr, "value"), &err); | |
| EXPECT_SUCCESS(err); | |
| std::ostringstream reverse; | |
| ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(reverse.str(), input); | |
| } | |
| TEST_F(OutputConversionTest, ReverseValueDict) { | |
| Err err; | |
| std::string input(" a = 5\n b = \"foo\"\n c = 7\n"); | |
| Value result = ConvertInputToValue(settings(), input, nullptr, | |
| Value(nullptr, "scope"), &err); | |
| EXPECT_SUCCESS(err); | |
| std::ostringstream reverse; | |
| ConvertValueToOutput(settings(), result, Value(nullptr, "scope"), reverse, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(reverse.str(), input); | |
| } | |
| TEST_F(OutputConversionTest, ReverseValueEmpty) { | |
| Err err; | |
| Value result = ConvertInputToValue(settings(), "", nullptr, | |
| Value(nullptr, "value"), &err); | |
| EXPECT_SUCCESS(err); | |
| std::ostringstream reverse; | |
| ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, | |
| &err); | |
| EXPECT_SUCCESS(err); | |
| EXPECT_EQ(reverse.str(), ""); | |
| } |