|  | // Copyright 2014 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 <stdint.h> | 
|  |  | 
|  | #include "tools/gn/test_with_scope.h" | 
|  | #include "tools/gn/value.h" | 
|  | #include "util/test/test.h" | 
|  |  | 
|  | TEST(Value, ToString) { | 
|  | Value strval(nullptr, "hi\" $me\\you\\$\\\""); | 
|  | EXPECT_EQ("hi\" $me\\you\\$\\\"", strval.ToString(false)); | 
|  | EXPECT_EQ("\"hi\\\" \\$me\\you\\\\\\$\\\\\\\"\"", strval.ToString(true)); | 
|  |  | 
|  | // crbug.com/470217 | 
|  | Value strval2(nullptr, "\\foo\\\\bar\\"); | 
|  | EXPECT_EQ("\"\\foo\\\\\\bar\\\\\"", strval2.ToString(true)); | 
|  |  | 
|  | // Void type. | 
|  | EXPECT_EQ("<void>", Value().ToString(false)); | 
|  |  | 
|  | // Test lists, bools, and ints. | 
|  | Value listval(nullptr, Value::LIST); | 
|  | listval.list_value().push_back(Value(nullptr, "hi\"me")); | 
|  | listval.list_value().push_back(Value(nullptr, true)); | 
|  | listval.list_value().push_back(Value(nullptr, false)); | 
|  | listval.list_value().push_back(Value(nullptr, static_cast<int64_t>(42))); | 
|  | // Printing lists always causes embedded strings to be quoted (ignoring the | 
|  | // quote flag), or else they wouldn't make much sense. | 
|  | EXPECT_EQ("[\"hi\\\"me\", true, false, 42]", listval.ToString(false)); | 
|  | EXPECT_EQ("[\"hi\\\"me\", true, false, 42]", listval.ToString(true)); | 
|  |  | 
|  | // Scopes. | 
|  | TestWithScope setup; | 
|  | Scope* scope = new Scope(setup.settings()); | 
|  | Value scopeval(nullptr, std::unique_ptr<Scope>(scope)); | 
|  | EXPECT_EQ("{ }", scopeval.ToString(false)); | 
|  |  | 
|  | // Test that an empty scope equals an empty scope. | 
|  | EXPECT_TRUE(scopeval == scopeval); | 
|  |  | 
|  | scope->SetValue("a", Value(nullptr, static_cast<int64_t>(42)), nullptr); | 
|  | scope->SetValue("b", Value(nullptr, "hello, world"), nullptr); | 
|  | EXPECT_EQ("{\n  a = 42\n  b = \"hello, world\"\n}", scopeval.ToString(false)); | 
|  | EXPECT_TRUE(scopeval == scopeval); | 
|  |  | 
|  | Scope* inner_scope = new Scope(setup.settings()); | 
|  | Value inner_scopeval(nullptr, std::unique_ptr<Scope>(inner_scope)); | 
|  | inner_scope->SetValue("d", Value(nullptr, static_cast<int64_t>(42)), nullptr); | 
|  | scope->SetValue("c", inner_scopeval, nullptr); | 
|  |  | 
|  | // Test inner scope equality. | 
|  | EXPECT_TRUE(scopeval == scopeval); | 
|  |  | 
|  | // Nested scopes should not be equal. | 
|  | Scope* nested_scope = new Scope(scope); | 
|  | Value nested_scopeval(nullptr, std::unique_ptr<Scope>(nested_scope)); | 
|  | EXPECT_FALSE(nested_scopeval == nested_scopeval); | 
|  | } |