blob: 6918186cddf05a5894381262879bd802f79562ca [file] [log] [blame]
Alex Vakulenko66ec2922014-06-17 15:30:22 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <memory>
6#include <string>
7#include <vector>
8
9#include <base/json/json_reader.h>
10#include <base/json/json_writer.h>
11#include <base/values.h>
12#include <gtest/gtest.h>
13
14#include "buffet/commands/object_schema.h"
15#include "buffet/commands/prop_types.h"
16#include "buffet/commands/prop_values.h"
17#include "buffet/commands/schema_utils.h"
18
19namespace {
20// Helper method to create base::Value from a string as a smart pointer.
21// For ease of definition in C++ code, double-quotes in the source definition
22// are replaced with apostrophes.
23std::unique_ptr<base::Value> CreateValue(const char* json) {
24 std::string json2(json);
25 // Convert apostrophes to double-quotes so JSONReader can parse the string.
26 std::replace(json2.begin(), json2.end(), '\'', '"');
27 return std::unique_ptr<base::Value>(base::JSONReader::Read(json2));
28}
29
30// Helper method to create a JSON dictionary object from a string.
31std::unique_ptr<base::DictionaryValue> CreateDictionaryValue(const char* json) {
32 std::string json2(json);
33 std::replace(json2.begin(), json2.end(), '\'', '"');
34 base::Value* value = base::JSONReader::Read(json2);
35 base::DictionaryValue* dict;
36 value->GetAsDictionary(&dict);
37 return std::unique_ptr<base::DictionaryValue>(dict);
38}
39
40// Converts a JSON value to a string. It also converts double-quotes to
41// apostrophes for easy comparisons in C++ source code.
42std::string ValueToString(const base::Value* value) {
43 std::string json;
44 base::JSONWriter::Write(value, &json);
45 std::replace(json.begin(), json.end(), '"', '\'');
46 return json;
47}
48
49} // namespace
50
51TEST(CommandSchemaUtils, TypedValueToJson_Scalar) {
52 EXPECT_EQ("true",
53 ValueToString(buffet::TypedValueToJson(true, nullptr).get()));
54 EXPECT_EQ("false",
55 ValueToString(buffet::TypedValueToJson(false, nullptr).get()));
56
57 EXPECT_EQ("0", ValueToString(buffet::TypedValueToJson(0, nullptr).get()));
58 EXPECT_EQ("-10", ValueToString(buffet::TypedValueToJson(-10, nullptr).get()));
59 EXPECT_EQ("20", ValueToString(buffet::TypedValueToJson(20, nullptr).get()));
60
61 EXPECT_EQ("0.0", ValueToString(buffet::TypedValueToJson(0.0, nullptr).get()));
62 EXPECT_EQ("1.2", ValueToString(buffet::TypedValueToJson(1.2, nullptr).get()));
63
64 EXPECT_EQ("'abc'",
65 ValueToString(buffet::TypedValueToJson(std::string("abc"),
66 nullptr).get()));
67
68 std::vector<bool> bool_array{true, false};
69 EXPECT_EQ("[true,false]",
70 ValueToString(buffet::TypedValueToJson(bool_array, nullptr).get()));
71
72 std::vector<int> int_array{1, 2, 5};
73 EXPECT_EQ("[1,2,5]",
74 ValueToString(buffet::TypedValueToJson(int_array, nullptr).get()));
75
76 std::vector<double> dbl_array{1.1, 2.2};
77 EXPECT_EQ("[1.1,2.2]",
78 ValueToString(buffet::TypedValueToJson(dbl_array, nullptr).get()));
79
80 std::vector<std::string> str_array{"a", "bc"};
81 EXPECT_EQ("['a','bc']",
82 ValueToString(buffet::TypedValueToJson(str_array, nullptr).get()));
83}
84
85TEST(CommandSchemaUtils, TypedValueToJson_Object) {
86 buffet::IntPropType int_type;
87 buffet::native_types::Object object;
88
89 object.insert(std::make_pair("width", int_type.CreateValue(640)));
90 object.insert(std::make_pair("height", int_type.CreateValue(480)));
91 EXPECT_EQ("{'height':480,'width':640}",
92 ValueToString(buffet::TypedValueToJson(object, nullptr).get()));
93}
94
95TEST(CommandSchemaUtils, TypedValueFromJson_Bool) {
96 bool value;
97
98 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("true").get(), nullptr,
99 &value, nullptr));
100 EXPECT_TRUE(value);
101
102 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("false").get(), nullptr,
103 &value, nullptr));
104 EXPECT_FALSE(value);
105
106 buffet::ErrorPtr error;
107 EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("0").get(), nullptr,
108 &value, &error));
109 EXPECT_EQ("type_mismatch", error->GetCode());
110 error.reset();
111}
112
113TEST(CommandSchemaUtils, TypedValueFromJson_Int) {
114 int value;
115
116 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("0").get(), nullptr,
117 &value, nullptr));
118 EXPECT_EQ(0, value);
119
120 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("23").get(), nullptr,
121 &value, nullptr));
122 EXPECT_EQ(23, value);
123
124 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("-1234").get(), nullptr,
125 &value, nullptr));
126 EXPECT_EQ(-1234, value);
127
128 buffet::ErrorPtr error;
129 EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
130 &value, &error));
131 EXPECT_EQ("type_mismatch", error->GetCode());
132 error.reset();
133}
134
135TEST(CommandSchemaUtils, TypedValueFromJson_Double) {
136 double value;
137
138 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("0").get(), nullptr,
139 &value, nullptr));
140 EXPECT_DOUBLE_EQ(0.0, value);
141 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("0.0").get(), nullptr,
142 &value, nullptr));
143 EXPECT_DOUBLE_EQ(0.0, value);
144
145 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("23").get(), nullptr,
146 &value, nullptr));
147 EXPECT_EQ(23.0, value);
148 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("23.1").get(), nullptr,
149 &value, nullptr));
150 EXPECT_EQ(23.1, value);
151
152 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("-1.23E+02").get(),
153 nullptr, &value, nullptr));
154 EXPECT_EQ(-123.0, value);
155
156 buffet::ErrorPtr error;
157 EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
158 &value, &error));
159 EXPECT_EQ("type_mismatch", error->GetCode());
160 error.reset();
161}
162
163TEST(CommandSchemaUtils, TypedValueFromJson_String) {
164 std::string value;
165
166 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("''").get(), nullptr,
167 &value, nullptr));
168 EXPECT_EQ("", value);
169
170 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("'23'").get(), nullptr,
171 &value, nullptr));
172 EXPECT_EQ("23", value);
173
174 EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
175 &value, nullptr));
176 EXPECT_EQ("abc", value);
177
178 buffet::ErrorPtr error;
179 EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("12").get(), nullptr,
180 &value, &error));
181 EXPECT_EQ("type_mismatch", error->GetCode());
182 error.reset();
183}
184
185TEST(CommandSchemaUtils, TypedValueFromJson_Object) {
186 buffet::native_types::Object value;
187 buffet::ObjectSchema schema;
188
189 auto age_prop = std::make_shared<buffet::IntPropType>();
190 age_prop->AddMinMaxConstraint(0, 150);
191 schema.AddProp("age", age_prop);
192
193 auto name_prop = std::make_shared<buffet::StringPropType>();
194 name_prop->AddLengthConstraint(1, 30);
195 schema.AddProp("name", name_prop);
196
197 EXPECT_TRUE(buffet::TypedValueFromJson(
198 CreateValue("{'age':20,'name':'Bob'}").get(), &schema, &value, nullptr));
199 buffet::native_types::Object value2;
200 value2.insert(std::make_pair("age", age_prop->CreateValue(20)));
201 value2.insert(std::make_pair("name",
202 name_prop->CreateValue(std::string("Bob"))));
203 EXPECT_EQ(value2, value);
204
205 buffet::ErrorPtr error;
206 EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
207 &value, &error));
208 EXPECT_EQ("type_mismatch", error->GetCode());
209 error.reset();
210}