#include <stdint.h>
#include "gn/test_with_scope.h"
#include "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));
Value strval2(nullptr, "\\foo\\\\bar\\");
EXPECT_EQ("\"\\foo\\\\\\bar\\\\\"", strval2.ToString(true));
EXPECT_EQ("<void>", Value().ToString(false));
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)));
EXPECT_EQ("[\"hi\\\"me\", true, false, 42]", listval.ToString(false));
EXPECT_EQ("[\"hi\\\"me\", true, false, 42]", listval.ToString(true));
TestWithScope setup;
Scope* scope = new Scope(setup.settings());
Value scopeval(nullptr, std::unique_ptr<Scope>(scope));
EXPECT_EQ("{ }", scopeval.ToString(false));
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);
EXPECT_TRUE(scopeval == scopeval);
Scope* nested_scope = new Scope(scope);
Value nested_scopeval(nullptr, std::unique_ptr<Scope>(nested_scope));
EXPECT_FALSE(nested_scopeval == nested_scopeval);
}