blob: 64f4600878f1431325c51c633677eaa59452c36b [file] [log] [blame]
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -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 <algorithm>
6#include <limits>
7#include <memory>
8#include <vector>
9
10#include <base/json/json_reader.h>
11#include <base/json/json_writer.h>
12#include <base/values.h>
13#include <gtest/gtest.h>
14
15#include "buffet/commands/object_schema.h"
16#include "buffet/commands/prop_types.h"
17
18namespace {
19// Helper method to create base::Value from a string as a smart pointer.
20// For ease of definition in C++ code, double-quotes in the source definition
21// are replaced with apostrophes.
22std::unique_ptr<base::Value> CreateValue(const char* json) {
23 std::string json2(json);
24 // Convert apostrophes to double-quotes so JSONReader can parse the string.
25 std::replace(json2.begin(), json2.end(), '\'', '"');
26 return std::unique_ptr<base::Value>(base::JSONReader::Read(json2));
27}
28
29// Helper method to create a JSON dictionary object from a string.
30std::unique_ptr<base::DictionaryValue> CreateDictionaryValue(const char* json) {
31 std::string json2(json);
32 std::replace(json2.begin(), json2.end(), '\'', '"');
33 base::Value* value = base::JSONReader::Read(json2);
34 base::DictionaryValue* dict;
35 value->GetAsDictionary(&dict);
36 return std::unique_ptr<base::DictionaryValue>(dict);
37}
38
39// Converts a JSON value to a string. It also converts double-quotes to
40// apostrophes for easy comparisons in C++ source code.
41std::string ValueToString(const base::Value* value) {
42 std::string json;
43 base::JSONWriter::Write(value, &json);
44 std::replace(json.begin(), json.end(), '"', '\'');
45 return json;
46}
47
48} // namespace
49
50TEST(CommandSchema, IntPropType_Empty) {
51 buffet::IntPropType prop;
52 EXPECT_TRUE(prop.GetConstraints().empty());
53 EXPECT_FALSE(prop.HasOverriddenAttributes());
54 EXPECT_FALSE(prop.IsBasedOnSchema());
55}
56
57TEST(CommandSchema, IntPropType_Types) {
58 buffet::IntPropType prop;
59 EXPECT_EQ(nullptr, prop.GetBoolean());
60 EXPECT_EQ(&prop, prop.GetInt());
61 EXPECT_EQ(nullptr, prop.GetDouble());
62 EXPECT_EQ(nullptr, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -070063 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -070064}
65
66TEST(CommandSchema, IntPropType_ToJson) {
67 buffet::IntPropType prop;
68 EXPECT_EQ("'integer'", ValueToString(prop.ToJson(false, nullptr).get()));
69 EXPECT_EQ("{'type':'integer'}",
70 ValueToString(prop.ToJson(true, nullptr).get()));
71 buffet::IntPropType param2;
72 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
73 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
74 param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(),
75 &prop, nullptr);
76 EXPECT_EQ("{'minimum':3}",
77 ValueToString(param2.ToJson(false, nullptr).get()));
78 param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(),
79 &prop, nullptr);
80 EXPECT_EQ("{'maximum':-7}",
81 ValueToString(param2.ToJson(false, nullptr).get()));
82 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(),
83 &prop, nullptr);
84 EXPECT_EQ("{'maximum':5,'minimum':0}",
85 ValueToString(param2.ToJson(false, nullptr).get()));
86 param2.FromJson(CreateDictionaryValue("{'enum':[1,2,3]}").get(), &prop,
87 nullptr);
88 EXPECT_EQ("[1,2,3]",
89 ValueToString(param2.ToJson(false, nullptr).get()));
90}
91
92TEST(CommandSchema, IntPropType_FromJson) {
93 buffet::IntPropType prop;
94 prop.AddMinMaxConstraint(2, 8);
95 buffet::IntPropType param2;
96 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
97 EXPECT_FALSE(param2.HasOverriddenAttributes());
98 EXPECT_TRUE(param2.IsBasedOnSchema());
99 EXPECT_EQ(2, prop.GetMinValue());
100 EXPECT_EQ(8, prop.GetMaxValue());
101 prop.AddMinMaxConstraint(-2, 30);
102 param2.FromJson(CreateDictionaryValue("{'minimum':7}").get(),
103 &prop, nullptr);
104 EXPECT_TRUE(param2.HasOverriddenAttributes());
105 EXPECT_TRUE(param2.IsBasedOnSchema());
106 EXPECT_EQ(7, param2.GetMinValue());
107 EXPECT_EQ(30, param2.GetMaxValue());
108 param2.FromJson(CreateDictionaryValue("{'maximum':17}").get(),
109 &prop, nullptr);
110 EXPECT_TRUE(param2.HasOverriddenAttributes());
111 EXPECT_TRUE(param2.IsBasedOnSchema());
112 EXPECT_EQ(-2, param2.GetMinValue());
113 EXPECT_EQ(17, param2.GetMaxValue());
114 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':6}").get(),
115 &prop, nullptr);
116 EXPECT_TRUE(param2.HasOverriddenAttributes());
117 EXPECT_TRUE(param2.IsBasedOnSchema());
118 EXPECT_EQ(0, param2.GetMinValue());
119 EXPECT_EQ(6, param2.GetMaxValue());
120}
121
122TEST(CommandSchema, IntPropType_Validate) {
123 buffet::IntPropType prop;
124 prop.AddMinMaxConstraint(2, 4);
125 buffet::ErrorPtr error;
126 EXPECT_FALSE(prop.ValidateValue(CreateValue("-1").get(), &error));
127 EXPECT_EQ("out_of_range", error->GetCode());
128 error.reset();
129 EXPECT_FALSE(prop.ValidateValue(CreateValue("0").get(), &error));
130 EXPECT_EQ("out_of_range", error->GetCode());
131 error.reset();
132 EXPECT_FALSE(prop.ValidateValue(CreateValue("1").get(), &error));
133 EXPECT_EQ("out_of_range", error->GetCode());
134 error.reset();
135 EXPECT_TRUE(prop.ValidateValue(CreateValue("2").get(), &error));
136 EXPECT_EQ(nullptr, error.get());
137 EXPECT_TRUE(prop.ValidateValue(CreateValue("3").get(), &error));
138 EXPECT_EQ(nullptr, error.get());
139 EXPECT_TRUE(prop.ValidateValue(CreateValue("4").get(), &error));
140 EXPECT_EQ(nullptr, error.get());
141 EXPECT_FALSE(prop.ValidateValue(CreateValue("5").get(), &error));
142 EXPECT_EQ("out_of_range", error->GetCode());
143 error.reset();
144 EXPECT_FALSE(prop.ValidateValue(CreateValue("true").get(), &error));
145 EXPECT_EQ("type_mismatch", error->GetCode());
146 error.reset();
147 EXPECT_FALSE(prop.ValidateValue(CreateValue("3.0").get(), &error));
148 EXPECT_EQ("type_mismatch", error->GetCode());
149 error.reset();
150 EXPECT_FALSE(prop.ValidateValue(CreateValue("'3'").get(), &error));
151 EXPECT_EQ("type_mismatch", error->GetCode());
152}
153
154///////////////////////////////////////////////////////////////////////////////
155
156TEST(CommandSchema, BoolPropType_Empty) {
157 buffet::BooleanPropType prop;
158 EXPECT_TRUE(prop.GetConstraints().empty());
159 EXPECT_FALSE(prop.HasOverriddenAttributes());
160 EXPECT_FALSE(prop.IsBasedOnSchema());
161}
162
163TEST(CommandSchema, BoolPropType_Types) {
164 buffet::BooleanPropType prop;
165 EXPECT_EQ(nullptr, prop.GetInt());
166 EXPECT_EQ(&prop, prop.GetBoolean());
167 EXPECT_EQ(nullptr, prop.GetDouble());
168 EXPECT_EQ(nullptr, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700169 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700170}
171
172TEST(CommandSchema, BoolPropType_ToJson) {
173 buffet::BooleanPropType prop;
174 EXPECT_EQ("'boolean'", ValueToString(prop.ToJson(false, nullptr).get()));
175 EXPECT_EQ("{'type':'boolean'}",
176 ValueToString(prop.ToJson(true, nullptr).get()));
177 buffet::BooleanPropType param2;
178 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
179 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
180 param2.FromJson(CreateDictionaryValue("{'enum':[true,false]}").get(), &prop,
181 nullptr);
182 EXPECT_EQ("[true,false]", ValueToString(param2.ToJson(false, nullptr).get()));
183 EXPECT_EQ("{'enum':[true,false],'type':'boolean'}",
184 ValueToString(param2.ToJson(true, nullptr).get()));
185}
186
187TEST(CommandSchema, BoolPropType_FromJson) {
188 buffet::BooleanPropType prop;
189 prop.FromJson(CreateDictionaryValue("{'enum':[true]}").get(), &prop,
190 nullptr);
191 buffet::BooleanPropType param2;
192 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
193 EXPECT_FALSE(param2.HasOverriddenAttributes());
194 EXPECT_TRUE(param2.IsBasedOnSchema());
195 EXPECT_EQ(std::vector<bool>{true}, prop.GetOneOfValues());
196}
197
198TEST(CommandSchema, BoolPropType_Validate) {
199 buffet::BooleanPropType prop;
200 prop.FromJson(CreateDictionaryValue("{'enum':[true]}").get(), &prop,
201 nullptr);
202 buffet::ErrorPtr error;
203 EXPECT_FALSE(prop.ValidateValue(CreateValue("false").get(), &error));
204 EXPECT_EQ("out_of_range", error->GetCode());
205 error.reset();
206 EXPECT_TRUE(prop.ValidateValue(CreateValue("true").get(), &error));
207 error.reset();
208 EXPECT_FALSE(prop.ValidateValue(CreateValue("1").get(), &error));
209 EXPECT_EQ("type_mismatch", error->GetCode());
210 error.reset();
211 EXPECT_FALSE(prop.ValidateValue(CreateValue("3.0").get(), &error));
212 EXPECT_EQ("type_mismatch", error->GetCode());
213 error.reset();
214 EXPECT_FALSE(prop.ValidateValue(CreateValue("'3'").get(), &error));
215 EXPECT_EQ("type_mismatch", error->GetCode());
216}
217
218///////////////////////////////////////////////////////////////////////////////
219
220TEST(CommandSchema, DoublePropType_Empty) {
221 buffet::DoublePropType prop;
222 EXPECT_DOUBLE_EQ(std::numeric_limits<double>::lowest(), prop.GetMinValue());
223 EXPECT_DOUBLE_EQ((std::numeric_limits<double>::max)(), prop.GetMaxValue());
224 EXPECT_FALSE(prop.HasOverriddenAttributes());
225 EXPECT_FALSE(prop.IsBasedOnSchema());
226}
227
228TEST(CommandSchema, DoublePropType_Types) {
229 buffet::DoublePropType prop;
230 EXPECT_EQ(nullptr, prop.GetInt());
231 EXPECT_EQ(nullptr, prop.GetBoolean());
232 EXPECT_EQ(&prop, prop.GetDouble());
233 EXPECT_EQ(nullptr, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700234 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700235}
236
237TEST(CommandSchema, DoublePropType_ToJson) {
238 buffet::DoublePropType prop;
239 EXPECT_EQ("'number'", ValueToString(prop.ToJson(false, nullptr).get()));
240 EXPECT_EQ("{'type':'number'}",
241 ValueToString(prop.ToJson(true, nullptr).get()));
242 buffet::DoublePropType param2;
243 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
244 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
245 param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(), &prop,
246 nullptr);
247 EXPECT_EQ("{'minimum':3.0}",
248 ValueToString(param2.ToJson(false, nullptr).get()));
249 param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(), &prop,
250 nullptr);
251 EXPECT_EQ("{'maximum':-7.0}",
252 ValueToString(param2.ToJson(false, nullptr).get()));
253 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(),
254 &prop, nullptr);
255 EXPECT_EQ("{'maximum':5.0,'minimum':0.0}",
256 ValueToString(param2.ToJson(false, nullptr).get()));
257}
258
259TEST(CommandSchema, DoublePropType_FromJson) {
260 buffet::DoublePropType prop;
261 prop.AddMinMaxConstraint(2.5, 8.7);
262 buffet::DoublePropType param2;
263 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
264 EXPECT_FALSE(param2.HasOverriddenAttributes());
265 EXPECT_TRUE(param2.IsBasedOnSchema());
266 EXPECT_DOUBLE_EQ(2.5, prop.GetMinValue());
267 EXPECT_DOUBLE_EQ(8.7, prop.GetMaxValue());
268 prop.AddMinMaxConstraint(-2.2, 30.4);
269 param2.FromJson(CreateDictionaryValue("{'minimum':7}").get(), &prop,
270 nullptr);
271 EXPECT_TRUE(param2.HasOverriddenAttributes());
272 EXPECT_TRUE(param2.IsBasedOnSchema());
273 EXPECT_DOUBLE_EQ(7.0, param2.GetMinValue());
274 EXPECT_DOUBLE_EQ(30.4, param2.GetMaxValue());
275 param2.FromJson(CreateDictionaryValue("{'maximum':17.2}").get(), &prop,
276 nullptr);
277 EXPECT_TRUE(param2.HasOverriddenAttributes());
278 EXPECT_TRUE(param2.IsBasedOnSchema());
279 EXPECT_DOUBLE_EQ(-2.2, param2.GetMinValue());
280 EXPECT_DOUBLE_EQ(17.2, param2.GetMaxValue());
281 param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':6.1}").get(),
282 &prop, nullptr);
283 EXPECT_TRUE(param2.HasOverriddenAttributes());
284 EXPECT_TRUE(param2.IsBasedOnSchema());
285 EXPECT_DOUBLE_EQ(0.0, param2.GetMinValue());
286 EXPECT_DOUBLE_EQ(6.1, param2.GetMaxValue());
287}
288
289TEST(CommandSchema, DoublePropType_Validate) {
290 buffet::DoublePropType prop;
291 prop.AddMinMaxConstraint(-1.2, 1.3);
292 buffet::ErrorPtr error;
293 EXPECT_FALSE(prop.ValidateValue(CreateValue("-2").get(), &error));
294 EXPECT_EQ("out_of_range", error->GetCode());
295 error.reset();
296 EXPECT_FALSE(prop.ValidateValue(CreateValue("-1.3").get(), &error));
297 EXPECT_EQ("out_of_range", error->GetCode());
298 error.reset();
299 EXPECT_TRUE(prop.ValidateValue(CreateValue("-1.2").get(), &error));
300 EXPECT_EQ(nullptr, error.get());
301 EXPECT_TRUE(prop.ValidateValue(CreateValue("0.0").get(), &error));
302 EXPECT_EQ(nullptr, error.get());
303 EXPECT_TRUE(prop.ValidateValue(CreateValue("1.3").get(), &error));
304 EXPECT_EQ(nullptr, error.get());
305 EXPECT_FALSE(prop.ValidateValue(CreateValue("1.31").get(), &error));
306 EXPECT_EQ("out_of_range", error->GetCode());
307 error.reset();
308 EXPECT_FALSE(prop.ValidateValue(CreateValue("true").get(), &error));
309 EXPECT_EQ("type_mismatch", error->GetCode());
310 error.reset();
311 EXPECT_FALSE(prop.ValidateValue(CreateValue("'0.0'").get(), &error));
312 EXPECT_EQ("type_mismatch", error->GetCode());
313}
314
315///////////////////////////////////////////////////////////////////////////////
316
317TEST(CommandSchema, StringPropType_Empty) {
318 buffet::StringPropType prop;
319 EXPECT_EQ(0, prop.GetMinLength());
320 EXPECT_EQ((std::numeric_limits<int>::max)(), prop.GetMaxLength());
321 EXPECT_FALSE(prop.HasOverriddenAttributes());
322 EXPECT_FALSE(prop.IsBasedOnSchema());
323}
324
325TEST(CommandSchema, StringPropType_Types) {
326 buffet::StringPropType prop;
327 EXPECT_EQ(nullptr, prop.GetInt());
328 EXPECT_EQ(nullptr, prop.GetBoolean());
329 EXPECT_EQ(nullptr, prop.GetDouble());
330 EXPECT_EQ(&prop, prop.GetString());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700331 EXPECT_EQ(nullptr, prop.GetObject());
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700332}
333
334TEST(CommandSchema, StringPropType_ToJson) {
335 buffet::StringPropType prop;
336 EXPECT_EQ("'string'", ValueToString(prop.ToJson(false, nullptr).get()));
337 EXPECT_EQ("{'type':'string'}",
338 ValueToString(prop.ToJson(true, nullptr).get()));
339 buffet::StringPropType param2;
340 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
341 EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get()));
342 param2.FromJson(CreateDictionaryValue("{'minLength':3}").get(), &prop,
343 nullptr);
344 EXPECT_EQ("{'minLength':3}",
345 ValueToString(param2.ToJson(false, nullptr).get()));
346 param2.FromJson(CreateDictionaryValue("{'maxLength':7}").get(), &prop,
347 nullptr);
348 EXPECT_EQ("{'maxLength':7}",
349 ValueToString(param2.ToJson(false, nullptr).get()));
350 param2.FromJson(CreateDictionaryValue("{'minLength':0,'maxLength':5}").get(),
351 &prop, nullptr);
352 EXPECT_EQ("{'maxLength':5,'minLength':0}",
353 ValueToString(param2.ToJson(false, nullptr).get()));
354}
355
356TEST(CommandSchema, StringPropType_FromJson) {
357 buffet::StringPropType prop;
358 prop.AddLengthConstraint(2, 8);
359 buffet::StringPropType param2;
360 param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
361 EXPECT_FALSE(param2.HasOverriddenAttributes());
362 EXPECT_TRUE(param2.IsBasedOnSchema());
363 EXPECT_EQ(2, prop.GetMinLength());
364 EXPECT_EQ(8, prop.GetMaxLength());
365 prop.AddLengthConstraint(3, 5);
366 param2.FromJson(CreateDictionaryValue("{'minLength':4}").get(), &prop,
367 nullptr);
368 EXPECT_TRUE(param2.HasOverriddenAttributes());
369 EXPECT_TRUE(param2.IsBasedOnSchema());
370 EXPECT_EQ(4, param2.GetMinLength());
371 EXPECT_EQ(5, param2.GetMaxLength());
372 param2.FromJson(CreateDictionaryValue("{'maxLength':8}").get(), &prop,
373 nullptr);
374 EXPECT_TRUE(param2.HasOverriddenAttributes());
375 EXPECT_TRUE(param2.IsBasedOnSchema());
376 EXPECT_EQ(3, param2.GetMinLength());
377 EXPECT_EQ(8, param2.GetMaxLength());
378 param2.FromJson(CreateDictionaryValue(
379 "{'minLength':1,'maxLength':7}").get(), &prop, nullptr);
380 EXPECT_TRUE(param2.HasOverriddenAttributes());
381 EXPECT_TRUE(param2.IsBasedOnSchema());
382 EXPECT_EQ(1, param2.GetMinLength());
383 EXPECT_EQ(7, param2.GetMaxLength());
384}
385
386TEST(CommandSchema, StringPropType_Validate) {
387 buffet::StringPropType prop;
388 prop.AddLengthConstraint(1, 3);
389 buffet::ErrorPtr error;
390 EXPECT_FALSE(prop.ValidateValue(CreateValue("''").get(), &error));
391 EXPECT_EQ("out_of_range", error->GetCode());
392 error.reset();
393 prop.AddLengthConstraint(2, 3);
394 EXPECT_FALSE(prop.ValidateValue(CreateValue("''").get(), &error));
395 EXPECT_EQ("out_of_range", error->GetCode());
396 error.reset();
397 EXPECT_FALSE(prop.ValidateValue(CreateValue("'a'").get(), &error));
398 EXPECT_EQ("out_of_range", error->GetCode());
399 error.reset();
400 EXPECT_TRUE(prop.ValidateValue(CreateValue("'ab'").get(), &error));
401 EXPECT_EQ(nullptr, error.get());
402 EXPECT_TRUE(prop.ValidateValue(CreateValue("'abc'").get(), &error));
403 EXPECT_EQ(nullptr, error.get());
404 EXPECT_FALSE(prop.ValidateValue(CreateValue("'abcd'").get(), &error));
405 EXPECT_EQ("out_of_range", error->GetCode());
406 error.reset();
407
408 prop.FromJson(CreateDictionaryValue("{'enum':['abc','def','xyz!!']}").get(),
409 nullptr, &error);
410 EXPECT_TRUE(prop.ValidateValue(CreateValue("'abc'").get(), &error));
411 EXPECT_TRUE(prop.ValidateValue(CreateValue("'def'").get(), &error));
412 EXPECT_TRUE(prop.ValidateValue(CreateValue("'xyz!!'").get(), &error));
413 EXPECT_FALSE(prop.ValidateValue(CreateValue("'xyz'").get(), &error));
414 EXPECT_EQ("out_of_range", error->GetCode());
415 error.reset();
416}
417
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700418///////////////////////////////////////////////////////////////////////////////
419
420TEST(CommandSchema, ObjectPropType_Empty) {
421 buffet::ObjectPropType prop;
422 EXPECT_TRUE(prop.HasOverriddenAttributes());
423 EXPECT_FALSE(prop.IsBasedOnSchema());
424}
425
426TEST(CommandSchema, ObjectPropType_Types) {
427 buffet::ObjectPropType prop;
428 EXPECT_EQ(nullptr, prop.GetInt());
429 EXPECT_EQ(nullptr, prop.GetBoolean());
430 EXPECT_EQ(nullptr, prop.GetDouble());
431 EXPECT_EQ(nullptr, prop.GetString());
432 EXPECT_EQ(&prop, prop.GetObject());
433}
434
435TEST(CommandSchema, ObjectPropType_ToJson) {
436 buffet::ObjectPropType prop;
437 EXPECT_EQ("{'properties':{}}",
438 ValueToString(prop.ToJson(false, nullptr).get()));
439 EXPECT_EQ("{'properties':{},'type':'object'}",
440 ValueToString(prop.ToJson(true, nullptr).get()));
441 EXPECT_FALSE(prop.IsBasedOnSchema());
442 buffet::ObjectPropType prop2;
443 prop2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
444 EXPECT_EQ("{}", ValueToString(prop2.ToJson(false, nullptr).get()));
445 EXPECT_TRUE(prop2.IsBasedOnSchema());
446
447 auto schema = std::make_shared<buffet::ObjectSchema>();
448 schema->AddProp("expires", std::make_shared<buffet::IntPropType>());
449 auto pw = std::make_shared<buffet::StringPropType>();
450 pw->AddLengthConstraint(6, 100);
451 schema->AddProp("password", pw);
452 prop2.SetObjectSchema(schema);
453 EXPECT_EQ("{'properties':{'expires':'integer',"
454 "'password':{'maxLength':100,'minLength':6}}}",
455 ValueToString(prop2.ToJson(false, nullptr).get()));
456 EXPECT_EQ("{'properties':{'expires':{'type':'integer'},"
457 "'password':{'maxLength':100,'minLength':6,'type':'string'}},"
458 "'type':'object'}",
459 ValueToString(prop2.ToJson(true, nullptr).get()));
460}
461
462TEST(CommandSchema, ObjectPropType_FromJson) {
463 buffet::ObjectPropType base_prop;
464 EXPECT_TRUE(base_prop.FromJson(CreateDictionaryValue(
465 "{'properties':{'name':'string','age':'integer'}}").get(), nullptr,
466 nullptr));
467 auto schema = base_prop.GetObjectSchemaPtr();
468 const buffet::PropType* prop = schema->GetProp("name");
469 EXPECT_EQ(buffet::ValueType::String, prop->GetType());
470 prop = schema->GetProp("age");
471 EXPECT_EQ(buffet::ValueType::Int, prop->GetType());
472}
473
474TEST(CommandSchema, ObjectPropType_Validate) {
475 buffet::ObjectPropType prop;
476 prop.FromJson(CreateDictionaryValue(
477 "{'properties':{'expires':'integer',"
478 "'password':{'maxLength':100,'minLength':6}}}").get(), nullptr,
479 nullptr);
480 buffet::ErrorPtr error;
481 EXPECT_TRUE(prop.ValidateValue(CreateValue(
482 "{'expires':10,'password':'abcdef'}").get(), &error));
483 error.reset();
484
485 EXPECT_FALSE(prop.ValidateValue(CreateValue(
486 "{'expires':10}").get(), &error));
487 EXPECT_EQ("parameter_missing", error->GetCode());
488 error.reset();
489
490 EXPECT_FALSE(prop.ValidateValue(CreateValue(
491 "{'password':'abcdef'}").get(), &error));
492 EXPECT_EQ("parameter_missing", error->GetCode());
493 error.reset();
494
495 EXPECT_FALSE(prop.ValidateValue(CreateValue(
496 "{'expires':10,'password':'abcde'}").get(), &error));
497 EXPECT_EQ("out_of_range", error->GetFirstError()->GetCode());
498 error.reset();
499
500 EXPECT_FALSE(prop.ValidateValue(CreateValue("2").get(), &error));
501 EXPECT_EQ("type_mismatch", error->GetCode());
502 error.reset();
503
504 EXPECT_FALSE(prop.ValidateValue(CreateValue(
505 "{'expires':10,'password':'abcdef','retry':true}").get(), &error));
506 EXPECT_EQ("unexpected_parameter", error->GetCode());
507 error.reset();
508}
509
510TEST(CommandSchema, ObjectPropType_Validate_Enum) {
511 buffet::ObjectPropType prop;
512 EXPECT_TRUE(prop.FromJson(CreateDictionaryValue(
513 "{'properties':{'width':'integer','height':'integer'},"
514 "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}").get(),
515 nullptr, nullptr));
516 buffet::ErrorPtr error;
517 EXPECT_TRUE(prop.ValidateValue(CreateValue(
518 "{'height':20,'width':10}").get(), &error));
519 error.reset();
520
521 EXPECT_TRUE(prop.ValidateValue(CreateValue(
522 "{'height':200,'width':100}").get(), &error));
523 error.reset();
524
525 EXPECT_FALSE(prop.ValidateValue(CreateValue(
526 "{'height':12,'width':10}").get(), &error));
527 EXPECT_EQ("out_of_range", error->GetCode());
528 error.reset();
529}
530
531///////////////////////////////////////////////////////////////////////////////
532
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700533TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeName) {
534 buffet::ObjectSchema schema;
535 const char* schema_str = "{"
536 "'param1':'integer',"
537 "'param2':'number',"
538 "'param3':'string'"
539 "}";
540 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
541 nullptr));
542 EXPECT_EQ(buffet::ValueType::Int, schema.GetProp("param1")->GetType());
543 EXPECT_EQ(buffet::ValueType::Double, schema.GetProp("param2")->GetType());
544 EXPECT_EQ(buffet::ValueType::String, schema.GetProp("param3")->GetType());
545 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
546 EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString());
547 EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString());
548 EXPECT_EQ(nullptr, schema.GetProp("param4"));
549
550 int min_int = (std::numeric_limits<int>::min)();
551 int max_int = (std::numeric_limits<int>::max)();
552 double min_dbl = (std::numeric_limits<double>::lowest)();
553 double max_dbl = (std::numeric_limits<double>::max)();
554 EXPECT_EQ(min_int, schema.GetProp("param1")->GetInt()->GetMinValue());
555 EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue());
556 EXPECT_EQ(min_dbl, schema.GetProp("param2")->GetDouble()->GetMinValue());
557 EXPECT_EQ(max_dbl, schema.GetProp("param2")->GetDouble()->GetMaxValue());
558 EXPECT_EQ(0, schema.GetProp("param3")->GetString()->GetMinLength());
559 EXPECT_EQ(max_int, schema.GetProp("param3")->GetString()->GetMaxLength());
560}
561
562TEST(CommandSchema, ObjectSchema_FromJson_Full_TypeName) {
563 buffet::ObjectSchema schema;
564 const char* schema_str = "{"
565 "'param1':{'type':'integer'},"
566 "'param2':{'type':'number'},"
567 "'param3':{'type':'string'}"
568 "}";
569 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
570 nullptr));
571 EXPECT_EQ(buffet::ValueType::Int, schema.GetProp("param1")->GetType());
572 EXPECT_EQ(buffet::ValueType::Double, schema.GetProp("param2")->GetType());
573 EXPECT_EQ(buffet::ValueType::String, schema.GetProp("param3")->GetType());
574 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
575 EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString());
576 EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString());
577 EXPECT_EQ(nullptr, schema.GetProp("param4"));
578
579 int min_int = (std::numeric_limits<int>::min)();
580 int max_int = (std::numeric_limits<int>::max)();
581 double min_dbl = (std::numeric_limits<double>::lowest)();
582 double max_dbl = (std::numeric_limits<double>::max)();
583 EXPECT_EQ(min_int, schema.GetProp("param1")->GetInt()->GetMinValue());
584 EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue());
585 EXPECT_EQ(min_dbl, schema.GetProp("param2")->GetDouble()->GetMinValue());
586 EXPECT_EQ(max_dbl, schema.GetProp("param2")->GetDouble()->GetMaxValue());
587 EXPECT_EQ(0, schema.GetProp("param3")->GetString()->GetMinLength());
588 EXPECT_EQ(max_int, schema.GetProp("param3")->GetString()->GetMaxLength());
589}
590
591TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeDeduction_Scalar) {
592 buffet::ObjectSchema schema;
593 const char* schema_str = "{"
594 "'param1' :{'minimum':2},"
595 "'param2' :{'maximum':10},"
596 "'param3' :{'maximum':8, 'minimum':2},"
597 "'param4' :{'minimum':2.1},"
598 "'param5' :{'maximum':10.1},"
599 "'param6' :{'maximum':8.1, 'minimum':3.1},"
600 "'param7' :{'maximum':8, 'minimum':3.1},"
601 "'param8' :{'maximum':8.1, 'minimum':3},"
602 "'param9' :{'minLength':2},"
603 "'param10':{'maxLength':10},"
604 "'param11':{'maxLength':8, 'minLength':3}"
605 "}";
606 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
607 nullptr));
608 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
609 EXPECT_EQ("integer", schema.GetProp("param2")->GetTypeAsString());
610 EXPECT_EQ("integer", schema.GetProp("param3")->GetTypeAsString());
611 EXPECT_EQ("number", schema.GetProp("param4")->GetTypeAsString());
612 EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString());
613 EXPECT_EQ("number", schema.GetProp("param6")->GetTypeAsString());
614 EXPECT_EQ("number", schema.GetProp("param7")->GetTypeAsString());
615 EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString());
616 EXPECT_EQ("string", schema.GetProp("param9")->GetTypeAsString());
617 EXPECT_EQ("string", schema.GetProp("param10")->GetTypeAsString());
618 EXPECT_EQ("string", schema.GetProp("param11")->GetTypeAsString());
619
620 int min_int = (std::numeric_limits<int>::min)();
621 int max_int = (std::numeric_limits<int>::max)();
622 double min_dbl = (std::numeric_limits<double>::lowest)();
623 double max_dbl = (std::numeric_limits<double>::max)();
624 EXPECT_EQ(2, schema.GetProp("param1")->GetInt()->GetMinValue());
625 EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue());
626 EXPECT_EQ(min_int, schema.GetProp("param2")->GetInt()->GetMinValue());
627 EXPECT_EQ(10, schema.GetProp("param2")->GetInt()->GetMaxValue());
628 EXPECT_EQ(2, schema.GetProp("param3")->GetInt()->GetMinValue());
629 EXPECT_EQ(8, schema.GetProp("param3")->GetInt()->GetMaxValue());
630 EXPECT_DOUBLE_EQ(2.1, schema.GetProp("param4")->GetDouble()->GetMinValue());
631 EXPECT_DOUBLE_EQ(max_dbl,
632 schema.GetProp("param4")->GetDouble()->GetMaxValue());
633 EXPECT_DOUBLE_EQ(min_dbl,
634 schema.GetProp("param5")->GetDouble()->GetMinValue());
635 EXPECT_DOUBLE_EQ(10.1, schema.GetProp("param5")->GetDouble()->GetMaxValue());
636 EXPECT_DOUBLE_EQ(3.1, schema.GetProp("param6")->GetDouble()->GetMinValue());
637 EXPECT_DOUBLE_EQ(8.1, schema.GetProp("param6")->GetDouble()->GetMaxValue());
638 EXPECT_DOUBLE_EQ(3.1, schema.GetProp("param7")->GetDouble()->GetMinValue());
639 EXPECT_DOUBLE_EQ(8.0, schema.GetProp("param7")->GetDouble()->GetMaxValue());
640 EXPECT_DOUBLE_EQ(3.0, schema.GetProp("param8")->GetDouble()->GetMinValue());
641 EXPECT_DOUBLE_EQ(8.1, schema.GetProp("param8")->GetDouble()->GetMaxValue());
642 EXPECT_EQ(2, schema.GetProp("param9")->GetString()->GetMinLength());
643 EXPECT_EQ(max_int, schema.GetProp("param9")->GetString()->GetMaxLength());
644 EXPECT_EQ(0, schema.GetProp("param10")->GetString()->GetMinLength());
645 EXPECT_EQ(10, schema.GetProp("param10")->GetString()->GetMaxLength());
646 EXPECT_EQ(3, schema.GetProp("param11")->GetString()->GetMinLength());
647 EXPECT_EQ(8, schema.GetProp("param11")->GetString()->GetMaxLength());
648}
649
650TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeDeduction_Array) {
651 buffet::ObjectSchema schema;
652 const char* schema_str = "{"
653 "'param1' :[0,1,2,3],"
654 "'param2' :[0.0,1.1,2.2],"
655 "'param3' :['id1', 'id2'],"
656 "'param4' :{'enum':[1,2,3]},"
657 "'param5' :{'enum':[-1.1,2.2,3]},"
658 "'param6' :{'enum':['id0', 'id1']},"
659 "'param7' :{'type':'integer', 'enum':[1,2,3]},"
660 "'param8' :{'type':'number', 'enum':[1,2,3]},"
661 "'param9' :{'type':'number', 'enum':[]},"
662 "'param10':{'type':'integer', 'enum':[]}"
663 "}";
664 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
665 nullptr));
666 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
667 EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString());
668 EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString());
669 EXPECT_EQ("integer", schema.GetProp("param4")->GetTypeAsString());
670 EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString());
671 EXPECT_EQ("string", schema.GetProp("param6")->GetTypeAsString());
672 EXPECT_EQ("integer", schema.GetProp("param7")->GetTypeAsString());
673 EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString());
674 EXPECT_EQ("number", schema.GetProp("param9")->GetTypeAsString());
675 EXPECT_EQ("integer", schema.GetProp("param10")->GetTypeAsString());
676
677 EXPECT_EQ(4, schema.GetProp("param1")->GetInt()->GetOneOfValues().size());
678 EXPECT_EQ(3, schema.GetProp("param2")->GetDouble()->GetOneOfValues().size());
679 EXPECT_EQ(2, schema.GetProp("param3")->GetString()->GetOneOfValues().size());
680 EXPECT_EQ(3, schema.GetProp("param4")->GetInt()->GetOneOfValues().size());
681 EXPECT_EQ(3, schema.GetProp("param5")->GetDouble()->GetOneOfValues().size());
682 EXPECT_EQ(2, schema.GetProp("param6")->GetString()->GetOneOfValues().size());
683 EXPECT_EQ(3, schema.GetProp("param7")->GetInt()->GetOneOfValues().size());
684 EXPECT_EQ(3, schema.GetProp("param8")->GetDouble()->GetOneOfValues().size());
685 EXPECT_EQ(0, schema.GetProp("param9")->GetDouble()->GetOneOfValues().size());
686 EXPECT_EQ(0, schema.GetProp("param10")->GetInt()->GetOneOfValues().size());
687
688 EXPECT_EQ(std::vector<int>({0, 1, 2, 3}),
689 schema.GetProp("param1")->GetInt()->GetOneOfValues());
690 EXPECT_EQ(std::vector<double>({0.0, 1.1, 2.2}),
691 schema.GetProp("param2")->GetDouble()->GetOneOfValues());
692 EXPECT_EQ(std::vector<std::string>({"id1", "id2"}),
693 schema.GetProp("param3")->GetString()->GetOneOfValues());
694
695 EXPECT_EQ(std::vector<int>({1, 2, 3}),
696 schema.GetProp("param4")->GetInt()->GetOneOfValues());
697 EXPECT_EQ(std::vector<double>({-1.1, 2.2, 3.0}),
698 schema.GetProp("param5")->GetDouble()->GetOneOfValues());
699 EXPECT_EQ(std::vector<std::string>({"id0", "id1"}),
700 schema.GetProp("param6")->GetString()->GetOneOfValues());
701 EXPECT_EQ(std::vector<int>({1, 2, 3}),
702 schema.GetProp("param7")->GetInt()->GetOneOfValues());
703 EXPECT_EQ(std::vector<double>({1.0, 2.0, 3.0}),
704 schema.GetProp("param8")->GetDouble()->GetOneOfValues());
705}
706
707TEST(CommandSchema, ObjectSchema_FromJson_Inheritance) {
708 const char* base_schema_str = "{"
709 "'param0' :{'minimum':1, 'maximum':5},"
710 "'param1' :{'minimum':1, 'maximum':5},"
711 "'param2' :{'minimum':1, 'maximum':5},"
712 "'param3' :{'minimum':1, 'maximum':5},"
713 "'param4' :{'minimum':1, 'maximum':5},"
714 "'param5' :{'minimum':1.1, 'maximum':5.5},"
715 "'param6' :{'minimum':1.1, 'maximum':5.5},"
716 "'param7' :{'minimum':1.1, 'maximum':5.5},"
717 "'param8' :{'minimum':1.1, 'maximum':5.5},"
718 "'param9' :{'minLength':1, 'maxLength':5},"
719 "'param10':{'minLength':1, 'maxLength':5},"
720 "'param11':{'minLength':1, 'maxLength':5},"
721 "'param12':{'minLength':1, 'maxLength':5},"
722 "'param13':[1,2,3],"
723 "'param14':[1,2,3],"
724 "'param15':[1.1,2.2,3.3],"
725 "'param16':[1.1,2.2,3.3],"
726 "'param17':['id1', 'id2'],"
727 "'param18':['id1', 'id2'],"
728 "'param19':{'minimum':1, 'maximum':5}"
729 "}";
730 buffet::ObjectSchema base_schema;
731 EXPECT_TRUE(base_schema.FromJson(CreateDictionaryValue(base_schema_str).get(),
732 nullptr, nullptr));
733 const char* schema_str = "{"
734 "'param1' :{},"
735 "'param2' :{'minimum':2},"
736 "'param3' :{'maximum':9},"
737 "'param4' :{'minimum':2, 'maximum':9},"
738 "'param5' :{},"
739 "'param6' :{'minimum':2.2},"
740 "'param7' :{'maximum':9.9},"
741 "'param8' :{'minimum':2.2, 'maximum':9.9},"
742 "'param9' :{},"
743 "'param10':{'minLength':3},"
744 "'param11':{'maxLength':8},"
745 "'param12':{'minLength':3, 'maxLength':8},"
746 "'param13':{},"
747 "'param14':[1,2,3,4],"
748 "'param15':{},"
749 "'param16':[1.1,2.2,3.3,4.4],"
750 "'param17':{},"
751 "'param18':['id1', 'id3'],"
752 "'param19':{}"
753 "}";
754 buffet::ObjectSchema schema;
755 EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(),
756 &base_schema, nullptr));
757 EXPECT_EQ(nullptr, schema.GetProp("param0"));
758 EXPECT_NE(nullptr, schema.GetProp("param1"));
759 EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString());
760 EXPECT_EQ(1, schema.GetProp("param1")->GetInt()->GetMinValue());
761 EXPECT_EQ(5, schema.GetProp("param1")->GetInt()->GetMaxValue());
762 EXPECT_EQ("integer", schema.GetProp("param2")->GetTypeAsString());
763 EXPECT_EQ(2, schema.GetProp("param2")->GetInt()->GetMinValue());
764 EXPECT_EQ(5, schema.GetProp("param2")->GetInt()->GetMaxValue());
765 EXPECT_EQ("integer", schema.GetProp("param3")->GetTypeAsString());
766 EXPECT_EQ(1, schema.GetProp("param3")->GetInt()->GetMinValue());
767 EXPECT_EQ(9, schema.GetProp("param3")->GetInt()->GetMaxValue());
768 EXPECT_EQ("integer", schema.GetProp("param4")->GetTypeAsString());
769 EXPECT_EQ(2, schema.GetProp("param4")->GetInt()->GetMinValue());
770 EXPECT_EQ(9, schema.GetProp("param4")->GetInt()->GetMaxValue());
771 EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString());
772 EXPECT_EQ(1.1, schema.GetProp("param5")->GetDouble()->GetMinValue());
773 EXPECT_EQ(5.5, schema.GetProp("param5")->GetDouble()->GetMaxValue());
774 EXPECT_EQ("number", schema.GetProp("param6")->GetTypeAsString());
775 EXPECT_EQ(2.2, schema.GetProp("param6")->GetDouble()->GetMinValue());
776 EXPECT_EQ(5.5, schema.GetProp("param6")->GetDouble()->GetMaxValue());
777 EXPECT_EQ("number", schema.GetProp("param7")->GetTypeAsString());
778 EXPECT_EQ(1.1, schema.GetProp("param7")->GetDouble()->GetMinValue());
779 EXPECT_EQ(9.9, schema.GetProp("param7")->GetDouble()->GetMaxValue());
780 EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString());
781 EXPECT_EQ(2.2, schema.GetProp("param8")->GetDouble()->GetMinValue());
782 EXPECT_EQ(9.9, schema.GetProp("param8")->GetDouble()->GetMaxValue());
783 EXPECT_EQ("string", schema.GetProp("param9")->GetTypeAsString());
784 EXPECT_EQ(1, schema.GetProp("param9")->GetString()->GetMinLength());
785 EXPECT_EQ(5, schema.GetProp("param9")->GetString()->GetMaxLength());
786 EXPECT_EQ("string", schema.GetProp("param10")->GetTypeAsString());
787 EXPECT_EQ(3, schema.GetProp("param10")->GetString()->GetMinLength());
788 EXPECT_EQ(5, schema.GetProp("param10")->GetString()->GetMaxLength());
789 EXPECT_EQ("string", schema.GetProp("param11")->GetTypeAsString());
790 EXPECT_EQ(1, schema.GetProp("param11")->GetString()->GetMinLength());
791 EXPECT_EQ(8, schema.GetProp("param11")->GetString()->GetMaxLength());
792 EXPECT_EQ("string", schema.GetProp("param12")->GetTypeAsString());
793 EXPECT_EQ(3, schema.GetProp("param12")->GetString()->GetMinLength());
794 EXPECT_EQ(8, schema.GetProp("param12")->GetString()->GetMaxLength());
795 EXPECT_EQ("integer", schema.GetProp("param13")->GetTypeAsString());
796 EXPECT_EQ(std::vector<int>({1, 2, 3}),
797 schema.GetProp("param13")->GetInt()->GetOneOfValues());
798 EXPECT_EQ("integer", schema.GetProp("param14")->GetTypeAsString());
799 EXPECT_EQ(std::vector<int>({1, 2, 3, 4}),
800 schema.GetProp("param14")->GetInt()->GetOneOfValues());
801 EXPECT_EQ("number", schema.GetProp("param15")->GetTypeAsString());
802 EXPECT_EQ(std::vector<double>({1.1, 2.2, 3.3}),
803 schema.GetProp("param15")->GetDouble()->GetOneOfValues());
804 EXPECT_EQ("number", schema.GetProp("param16")->GetTypeAsString());
805 EXPECT_EQ(std::vector<double>({1.1, 2.2, 3.3, 4.4}),
806 schema.GetProp("param16")->GetDouble()->GetOneOfValues());
807 EXPECT_EQ("string", schema.GetProp("param17")->GetTypeAsString());
808 EXPECT_EQ(std::vector<std::string>({"id1", "id2"}),
809 schema.GetProp("param17")->GetString()->GetOneOfValues());
810 EXPECT_EQ("string", schema.GetProp("param18")->GetTypeAsString());
811 EXPECT_EQ(std::vector<std::string>({"id1", "id3"}),
812 schema.GetProp("param18")->GetString()->GetOneOfValues());
813 EXPECT_EQ("integer", schema.GetProp("param19")->GetTypeAsString());
814 EXPECT_EQ(1, schema.GetProp("param19")->GetInt()->GetMinValue());
815 EXPECT_EQ(5, schema.GetProp("param19")->GetInt()->GetMaxValue());
816}
817
818TEST(CommandSchema, ObjectSchema_FromJson_BaseSchema_Failures) {
819 buffet::ObjectSchema schema;
820 buffet::ErrorPtr error;
821 const char* schema_str = "{"
822 "'param1':{}"
823 "}";
824 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
825 &error));
826 EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode());
827 error.reset();
828
829 schema_str = "{"
830 "'param1':{'type':'foo'}"
831 "}";
832 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
833 &error));
834 EXPECT_EQ("unknown_type", error->GetFirstError()->GetCode());
835 error.reset();
836
837 schema_str = "{"
838 "'param1':[]"
839 "}";
840 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
841 &error));
842 EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode());
843 error.reset();
844
845 schema_str = "{"
846 "'param1':{'minimum':'foo'}"
847 "}";
848 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
849 &error));
850 EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode());
851 error.reset();
852
853 schema_str = "{"
854 "'param1':[1,2.2]"
855 "}";
856 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
857 &error));
858 EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode());
859 error.reset();
Alex Vakulenko5109b202014-06-20 14:49:41 -0700860
861 schema_str = "{"
862 "'param1':{'minimum':1, 'enum':[1,2,3]}" // can't have min/max & enum.
863 "}";
864 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
865 &error));
866 EXPECT_EQ("unexpected_parameter", error->GetFirstError()->GetCode());
867 error.reset();
868
869 schema_str = "{"
870 "'param1':{'maximum':1, 'blah':2}" // 'blah' is unexpected.
871 "}";
872 EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr,
873 &error));
874 EXPECT_EQ("unexpected_parameter", error->GetFirstError()->GetCode());
875 error.reset();
Alex Vakulenkoe439a0f2014-05-21 12:26:47 -0700876}
877