1 // Copyright (c) 2012 The Chromium 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.
5 #include "tools/json_schema_compiler/test/choices.h"
7 #include "base/strings/string_piece.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "tools/json_schema_compiler/test/test_util.h"
13 using namespace test::api::choices
;
14 using json_schema_compiler::test_util::Dictionary
;
15 using json_schema_compiler::test_util::List
;
16 using json_schema_compiler::test_util::ReadJson
;
17 using json_schema_compiler::test_util::Vector
;
19 TEST(JsonSchemaCompilerChoicesTest
, TakesIntegersParamsCreate
) {
21 scoped_ptr
<TakesIntegers::Params
> params(
22 TakesIntegers::Params::Create(*List(new base::FundamentalValue(true))));
26 scoped_ptr
<TakesIntegers::Params
> params(
27 TakesIntegers::Params::Create(*List(new base::FundamentalValue(6))));
29 EXPECT_FALSE(params
->nums
.as_integers
);
30 EXPECT_EQ(6, *params
->nums
.as_integer
);
33 scoped_ptr
<TakesIntegers::Params
> params(TakesIntegers::Params::Create(
34 *List(List(new base::FundamentalValue(2),
35 new base::FundamentalValue(6),
36 new base::FundamentalValue(8)).release())));
38 ASSERT_TRUE(params
->nums
.as_integers
);
39 EXPECT_EQ(Vector(2, 6, 8), *params
->nums
.as_integers
);
43 TEST(JsonSchemaCompilerChoicesTest
, ObjectWithChoicesParamsCreate
) {
45 scoped_ptr
<ObjectWithChoices::Params
> params(
46 ObjectWithChoices::Params::Create(*List(
47 Dictionary("strings", new base::StringValue("asdf")).release())));
49 EXPECT_FALSE(params
->string_info
.strings
.as_strings
);
50 EXPECT_EQ("asdf", *params
->string_info
.strings
.as_string
);
51 EXPECT_FALSE(params
->string_info
.integers
);
54 scoped_ptr
<ObjectWithChoices::Params
> params(
55 ObjectWithChoices::Params::Create(*List(
56 Dictionary("strings", new base::StringValue("asdf"),
57 "integers", new base::FundamentalValue(6)).release())));
59 EXPECT_FALSE(params
->string_info
.strings
.as_strings
);
60 EXPECT_EQ("asdf", *params
->string_info
.strings
.as_string
);
61 ASSERT_TRUE(params
->string_info
.integers
);
62 EXPECT_FALSE(params
->string_info
.integers
->as_integers
);
63 EXPECT_EQ(6, *params
->string_info
.integers
->as_integer
);
67 // TODO(kalman): Clean up the rest of these tests to use the
68 // Vector/List/Dictionary helpers.
70 TEST(JsonSchemaCompilerChoicesTest
, ObjectWithChoicesParamsCreateFail
) {
72 scoped_ptr
<base::DictionaryValue
> object_param(new base::DictionaryValue());
73 object_param
->SetWithoutPathExpansion("strings",
74 new base::FundamentalValue(5));
75 scoped_ptr
<base::ListValue
> params_value(new base::ListValue());
76 params_value
->Append(object_param
.release());
77 scoped_ptr
<ObjectWithChoices::Params
> params(
78 ObjectWithChoices::Params::Create(*params_value
));
79 EXPECT_FALSE(params
.get());
82 scoped_ptr
<base::DictionaryValue
> object_param(new base::DictionaryValue());
83 object_param
->SetWithoutPathExpansion("strings",
84 new base::StringValue("asdf"));
85 object_param
->SetWithoutPathExpansion("integers",
86 new base::StringValue("asdf"));
87 scoped_ptr
<base::ListValue
> params_value(new base::ListValue());
88 params_value
->Append(object_param
.release());
89 scoped_ptr
<ObjectWithChoices::Params
> params(
90 ObjectWithChoices::Params::Create(*params_value
));
91 EXPECT_FALSE(params
.get());
94 scoped_ptr
<base::DictionaryValue
> object_param(new base::DictionaryValue());
95 object_param
->SetWithoutPathExpansion("integers",
96 new base::FundamentalValue(6));
97 scoped_ptr
<base::ListValue
> params_value(new base::ListValue());
98 params_value
->Append(object_param
.release());
99 scoped_ptr
<ObjectWithChoices::Params
> params(
100 ObjectWithChoices::Params::Create(*params_value
));
101 EXPECT_FALSE(params
.get());
105 TEST(JsonSchemaCompilerChoicesTest
, PopulateChoiceType
) {
106 std::vector
<std::string
> strings
= Vector(std::string("list"),
108 std::string("strings"));
110 base::ListValue
* strings_value
= new base::ListValue();
111 for (size_t i
= 0; i
< strings
.size(); ++i
)
112 strings_value
->Append(new base::StringValue(strings
[i
]));
114 base::DictionaryValue value
;
115 value
.SetInteger("integers", 4);
116 value
.Set("strings", strings_value
);
119 ASSERT_TRUE(ChoiceType::Populate(value
, &out
));
120 ASSERT_TRUE(out
.integers
.as_integer
.get());
121 EXPECT_FALSE(out
.integers
.as_integers
.get());
122 EXPECT_EQ(4, *out
.integers
.as_integer
);
124 EXPECT_FALSE(out
.strings
->as_string
.get());
125 ASSERT_TRUE(out
.strings
->as_strings
.get());
126 EXPECT_EQ(strings
, *out
.strings
->as_strings
);
129 TEST(JsonSchemaCompilerChoicesTest
, ChoiceTypeToValue
) {
130 base::ListValue
* strings_value
= new base::ListValue();
131 strings_value
->Append(new base::StringValue("list"));
132 strings_value
->Append(new base::StringValue("of"));
133 strings_value
->Append(new base::StringValue("strings"));
135 base::DictionaryValue value
;
136 value
.SetInteger("integers", 5);
137 value
.Set("strings", strings_value
);
140 ASSERT_TRUE(ChoiceType::Populate(value
, &out
));
142 EXPECT_TRUE(value
.Equals(out
.ToValue().get()));
145 TEST(JsonSchemaCompilerChoicesTest
, ReturnChoices
) {
147 ReturnChoices::Results::Result results
;
148 results
.as_integers
.reset(new std::vector
<int>(Vector(1, 2)));
150 scoped_ptr
<base::Value
> results_value
= results
.ToValue();
151 ASSERT_TRUE(results_value
);
153 base::ListValue expected
;
154 expected
.AppendInteger(1);
155 expected
.AppendInteger(2);
157 EXPECT_TRUE(expected
.Equals(results_value
.get()));
160 ReturnChoices::Results::Result results
;
161 results
.as_integer
.reset(new int(5));
163 scoped_ptr
<base::Value
> results_value
= results
.ToValue();
164 ASSERT_TRUE(results_value
);
166 base::FundamentalValue
expected(5);
168 EXPECT_TRUE(expected
.Equals(results_value
.get()));
172 TEST(JsonSchemaCompilerChoicesTest
, NestedChoices
) {
173 // These test both ToValue and FromValue for every legitimate configuration of
176 // The plain integer choice.
177 scoped_ptr
<base::Value
> value
= ReadJson("42");
178 scoped_ptr
<NestedChoice
> obj
= NestedChoice::FromValue(*value
);
181 ASSERT_TRUE(obj
->as_integer
);
182 EXPECT_FALSE(obj
->as_choice1
);
183 EXPECT_FALSE(obj
->as_choice2
);
184 EXPECT_EQ(42, *obj
->as_integer
);
186 EXPECT_TRUE(base::Value::Equals(value
.get(), obj
->ToValue().get()));
190 // The string choice within the first choice.
191 scoped_ptr
<base::Value
> value
= ReadJson("\"foo\"");
192 scoped_ptr
<NestedChoice
> obj
= NestedChoice::FromValue(*value
);
195 EXPECT_FALSE(obj
->as_integer
);
196 ASSERT_TRUE(obj
->as_choice1
);
197 EXPECT_FALSE(obj
->as_choice2
);
198 ASSERT_TRUE(obj
->as_choice1
->as_string
);
199 EXPECT_FALSE(obj
->as_choice1
->as_boolean
);
200 EXPECT_EQ("foo", *obj
->as_choice1
->as_string
);
202 EXPECT_TRUE(base::Value::Equals(value
.get(), obj
->ToValue().get()));
206 // The boolean choice within the first choice.
207 scoped_ptr
<base::Value
> value
= ReadJson("true");
208 scoped_ptr
<NestedChoice
> obj
= NestedChoice::FromValue(*value
);
211 EXPECT_FALSE(obj
->as_integer
);
212 ASSERT_TRUE(obj
->as_choice1
);
213 EXPECT_FALSE(obj
->as_choice2
);
214 EXPECT_FALSE(obj
->as_choice1
->as_string
);
215 ASSERT_TRUE(obj
->as_choice1
->as_boolean
);
216 EXPECT_TRUE(*obj
->as_choice1
->as_boolean
);
218 EXPECT_TRUE(base::Value::Equals(value
.get(), obj
->ToValue().get()));
222 // The double choice within the second choice.
223 scoped_ptr
<base::Value
> value
= ReadJson("42.0");
224 scoped_ptr
<NestedChoice
> obj
= NestedChoice::FromValue(*value
);
227 EXPECT_FALSE(obj
->as_integer
);
228 EXPECT_FALSE(obj
->as_choice1
);
229 ASSERT_TRUE(obj
->as_choice2
);
230 ASSERT_TRUE(obj
->as_choice2
->as_double
);
231 EXPECT_FALSE(obj
->as_choice2
->as_choice_type
);
232 EXPECT_FALSE(obj
->as_choice2
->as_choice_types
);
233 EXPECT_EQ(42.0, *obj
->as_choice2
->as_double
);
235 EXPECT_TRUE(base::Value::Equals(value
.get(), obj
->ToValue().get()));
239 // The ChoiceType choice within the second choice.
240 scoped_ptr
<base::Value
> value
= ReadJson(
241 "{\"integers\": [1, 2], \"strings\": \"foo\"}");
242 scoped_ptr
<NestedChoice
> obj
= NestedChoice::FromValue(*value
);
245 EXPECT_FALSE(obj
->as_integer
);
246 EXPECT_FALSE(obj
->as_choice1
);
247 ASSERT_TRUE(obj
->as_choice2
);
248 EXPECT_FALSE(obj
->as_choice2
->as_double
);
249 ASSERT_TRUE(obj
->as_choice2
->as_choice_type
);
250 EXPECT_FALSE(obj
->as_choice2
->as_choice_types
);
252 ChoiceType
* choice_type
= obj
->as_choice2
->as_choice_type
.get();
253 ASSERT_TRUE(choice_type
->integers
.as_integers
);
254 EXPECT_FALSE(choice_type
->integers
.as_integer
);
255 EXPECT_EQ(Vector(1, 2), *choice_type
->integers
.as_integers
);
256 ASSERT_TRUE(choice_type
->strings
);
257 EXPECT_FALSE(choice_type
->strings
->as_strings
);
258 ASSERT_TRUE(choice_type
->strings
->as_string
);
259 EXPECT_EQ("foo", *choice_type
->strings
->as_string
);
262 EXPECT_TRUE(base::Value::Equals(value
.get(), obj
->ToValue().get()));
266 // The array of ChoiceTypes within the second choice.
267 scoped_ptr
<base::Value
> value
= ReadJson(
269 " {\"integers\": [1, 2], \"strings\": \"foo\"},"
270 " {\"integers\": 3, \"strings\": [\"bar\", \"baz\"]}"
272 scoped_ptr
<NestedChoice
> obj
= NestedChoice::FromValue(*value
);
275 EXPECT_FALSE(obj
->as_integer
);
276 EXPECT_FALSE(obj
->as_choice1
);
277 ASSERT_TRUE(obj
->as_choice2
);
278 EXPECT_FALSE(obj
->as_choice2
->as_double
);
279 EXPECT_FALSE(obj
->as_choice2
->as_choice_type
);
280 ASSERT_TRUE(obj
->as_choice2
->as_choice_types
);
282 std::vector
<linked_ptr
<ChoiceType
> >* choice_types
=
283 obj
->as_choice2
->as_choice_types
.get();
284 // Bleh too much effort to test everything.
285 ASSERT_EQ(2u, choice_types
->size());
288 EXPECT_TRUE(base::Value::Equals(value
.get(), obj
->ToValue().get()));