| // Copyright 2014 The Chromium OS 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 "buffet/commands/object_schema.h" |
| |
| #include <algorithm> |
| #include <limits> |
| #include <memory> |
| #include <vector> |
| |
| #include <base/json/json_reader.h> |
| #include <base/json/json_writer.h> |
| #include <base/values.h> |
| #include <gtest/gtest.h> |
| |
| #include "buffet/commands/prop_constraints.h" |
| #include "buffet/commands/prop_types.h" |
| #include "buffet/commands/schema_constants.h" |
| #include "buffet/commands/unittest_utils.h" |
| |
| using buffet::unittests::CreateValue; |
| using buffet::unittests::CreateDictionaryValue; |
| using buffet::unittests::ValueToString; |
| |
| namespace { |
| |
| template<typename T> |
| std::vector<T> GetArrayValues(const buffet::native_types::Array& arr) { |
| std::vector<T> values; |
| values.reserve(arr.size()); |
| for (const auto& prop_value : arr) { |
| values.push_back(prop_value->GetValueAsAny().Get<T>()); |
| } |
| return values; |
| } |
| |
| template<typename T> |
| std::vector<T> GetOneOfValues(const buffet::PropType* prop_type) { |
| auto one_of = static_cast<const buffet::ConstraintOneOf*>( |
| prop_type->GetConstraint(buffet::ConstraintType::OneOf)); |
| if (!one_of) |
| return {}; |
| |
| return GetArrayValues<T>(one_of->set_.value); |
| } |
| |
| } // anonymous namespace |
| |
| TEST(CommandSchema, IntPropType_Empty) { |
| buffet::IntPropType prop; |
| EXPECT_TRUE(prop.GetConstraints().empty()); |
| EXPECT_FALSE(prop.HasOverriddenAttributes()); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| EXPECT_EQ(nullptr, prop.GetDefaultValue()); |
| } |
| |
| TEST(CommandSchema, IntPropType_Types) { |
| buffet::IntPropType prop; |
| EXPECT_EQ(nullptr, prop.GetBoolean()); |
| EXPECT_EQ(&prop, prop.GetInt()); |
| EXPECT_EQ(nullptr, prop.GetDouble()); |
| EXPECT_EQ(nullptr, prop.GetString()); |
| EXPECT_EQ(nullptr, prop.GetObject()); |
| EXPECT_EQ(nullptr, prop.GetArray()); |
| } |
| |
| TEST(CommandSchema, IntPropType_ToJson) { |
| buffet::IntPropType prop; |
| EXPECT_EQ("'integer'", ValueToString(prop.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'type':'integer'}", |
| ValueToString(prop.ToJson(true, nullptr).get())); |
| buffet::IntPropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'minimum':3}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'maximum':-7}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'maximum':5,'minimum':0}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'enum':[1,2,3]}").get(), &prop, |
| nullptr); |
| EXPECT_EQ("[1,2,3]", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'default':123}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'default':123}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| } |
| |
| TEST(CommandSchema, IntPropType_FromJson) { |
| buffet::IntPropType prop; |
| prop.AddMinMaxConstraint(2, 8); |
| buffet::IntPropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_FALSE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(2, prop.GetMinValue()); |
| EXPECT_EQ(8, prop.GetMaxValue()); |
| prop.AddMinMaxConstraint(-2, 30); |
| param2.FromJson(CreateDictionaryValue("{'minimum':7}").get(), |
| &prop, nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(7, param2.GetMinValue()); |
| EXPECT_EQ(30, param2.GetMaxValue()); |
| param2.FromJson(CreateDictionaryValue("{'maximum':17}").get(), |
| &prop, nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(-2, param2.GetMinValue()); |
| EXPECT_EQ(17, param2.GetMaxValue()); |
| |
| ASSERT_TRUE(param2.FromJson(CreateDictionaryValue("{'default':3}").get(), |
| &prop, nullptr)); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| ASSERT_NE(nullptr, param2.GetDefaultValue()); |
| EXPECT_EQ(3, param2.GetDefaultValue()->GetInt()->GetValue()); |
| } |
| |
| TEST(CommandSchema, IntPropType_Validate) { |
| buffet::IntPropType prop; |
| prop.AddMinMaxConstraint(2, 4); |
| chromeos::ErrorPtr error; |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("-1").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("0").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("1").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("2").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("3").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("4").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("5").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("true").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("3.0").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("'3'").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| } |
| |
| TEST(CommandSchema, IntPropType_CreateValue) { |
| buffet::IntPropType prop; |
| chromeos::ErrorPtr error; |
| auto val = prop.CreateValue(2, &error); |
| ASSERT_NE(nullptr, val.get()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_EQ(2, val->GetValueAsAny().Get<int>()); |
| |
| val = prop.CreateValue("blah", &error); |
| EXPECT_EQ(nullptr, val.get()); |
| ASSERT_NE(nullptr, error.get()); |
| EXPECT_EQ(buffet::errors::commands::kTypeMismatch, error->GetCode()); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST(CommandSchema, BoolPropType_Empty) { |
| buffet::BooleanPropType prop; |
| EXPECT_TRUE(prop.GetConstraints().empty()); |
| EXPECT_FALSE(prop.HasOverriddenAttributes()); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| EXPECT_EQ(nullptr, prop.GetDefaultValue()); |
| } |
| |
| TEST(CommandSchema, BoolPropType_Types) { |
| buffet::BooleanPropType prop; |
| EXPECT_EQ(nullptr, prop.GetInt()); |
| EXPECT_EQ(&prop, prop.GetBoolean()); |
| EXPECT_EQ(nullptr, prop.GetDouble()); |
| EXPECT_EQ(nullptr, prop.GetString()); |
| EXPECT_EQ(nullptr, prop.GetObject()); |
| EXPECT_EQ(nullptr, prop.GetArray()); |
| } |
| |
| TEST(CommandSchema, BoolPropType_ToJson) { |
| buffet::BooleanPropType prop; |
| EXPECT_EQ("'boolean'", ValueToString(prop.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'type':'boolean'}", |
| ValueToString(prop.ToJson(true, nullptr).get())); |
| buffet::BooleanPropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'enum':[true,false]}").get(), &prop, |
| nullptr); |
| EXPECT_EQ("[true,false]", ValueToString(param2.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'enum':[true,false],'type':'boolean'}", |
| ValueToString(param2.ToJson(true, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'default':true}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'default':true}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| } |
| |
| TEST(CommandSchema, BoolPropType_FromJson) { |
| buffet::BooleanPropType prop; |
| prop.FromJson(CreateDictionaryValue("{'enum':[true]}").get(), &prop, |
| nullptr); |
| buffet::BooleanPropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_FALSE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(std::vector<bool>{true}, GetOneOfValues<bool>(&prop)); |
| |
| buffet::BooleanPropType prop_base; |
| buffet::BooleanPropType param3; |
| ASSERT_TRUE(param3.FromJson(CreateDictionaryValue("{'default':false}").get(), |
| &prop_base, nullptr)); |
| EXPECT_TRUE(param3.HasOverriddenAttributes()); |
| ASSERT_NE(nullptr, param3.GetDefaultValue()); |
| EXPECT_FALSE(param3.GetDefaultValue()->GetBoolean()->GetValue()); |
| } |
| |
| TEST(CommandSchema, BoolPropType_Validate) { |
| buffet::BooleanPropType prop; |
| prop.FromJson(CreateDictionaryValue("{'enum':[true]}").get(), &prop, |
| nullptr); |
| chromeos::ErrorPtr error; |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("false").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("true").get(), &error)); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("1").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("3.0").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("'3'").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| } |
| |
| TEST(CommandSchema, BoolPropType_CreateValue) { |
| buffet::BooleanPropType prop; |
| chromeos::ErrorPtr error; |
| auto val = prop.CreateValue(true, &error); |
| ASSERT_NE(nullptr, val.get()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_TRUE(val->GetValueAsAny().Get<bool>()); |
| |
| val = prop.CreateValue("blah", &error); |
| EXPECT_EQ(nullptr, val.get()); |
| ASSERT_NE(nullptr, error.get()); |
| EXPECT_EQ(buffet::errors::commands::kTypeMismatch, error->GetCode()); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST(CommandSchema, DoublePropType_Empty) { |
| buffet::DoublePropType prop; |
| EXPECT_DOUBLE_EQ(std::numeric_limits<double>::lowest(), prop.GetMinValue()); |
| EXPECT_DOUBLE_EQ((std::numeric_limits<double>::max)(), prop.GetMaxValue()); |
| EXPECT_FALSE(prop.HasOverriddenAttributes()); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| EXPECT_EQ(nullptr, prop.GetDefaultValue()); |
| } |
| |
| TEST(CommandSchema, DoublePropType_Types) { |
| buffet::DoublePropType prop; |
| EXPECT_EQ(nullptr, prop.GetInt()); |
| EXPECT_EQ(nullptr, prop.GetBoolean()); |
| EXPECT_EQ(&prop, prop.GetDouble()); |
| EXPECT_EQ(nullptr, prop.GetString()); |
| EXPECT_EQ(nullptr, prop.GetObject()); |
| EXPECT_EQ(nullptr, prop.GetArray()); |
| } |
| |
| TEST(CommandSchema, DoublePropType_ToJson) { |
| buffet::DoublePropType prop; |
| EXPECT_EQ("'number'", ValueToString(prop.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'type':'number'}", |
| ValueToString(prop.ToJson(true, nullptr).get())); |
| buffet::DoublePropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'minimum':3}").get(), &prop, |
| nullptr); |
| EXPECT_EQ("{'minimum':3.0}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'maximum':-7}").get(), &prop, |
| nullptr); |
| EXPECT_EQ("{'maximum':-7.0}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':5}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'maximum':5.0,'minimum':0.0}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'default':12.3}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'default':12.3}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| } |
| |
| TEST(CommandSchema, DoublePropType_FromJson) { |
| buffet::DoublePropType prop; |
| prop.AddMinMaxConstraint(2.5, 8.7); |
| buffet::DoublePropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_FALSE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_DOUBLE_EQ(2.5, prop.GetMinValue()); |
| EXPECT_DOUBLE_EQ(8.7, prop.GetMaxValue()); |
| prop.AddMinMaxConstraint(-2.2, 30.4); |
| param2.FromJson(CreateDictionaryValue("{'minimum':7}").get(), &prop, |
| nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_DOUBLE_EQ(7.0, param2.GetMinValue()); |
| EXPECT_DOUBLE_EQ(30.4, param2.GetMaxValue()); |
| param2.FromJson(CreateDictionaryValue("{'maximum':17.2}").get(), &prop, |
| nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_DOUBLE_EQ(-2.2, param2.GetMinValue()); |
| EXPECT_DOUBLE_EQ(17.2, param2.GetMaxValue()); |
| param2.FromJson(CreateDictionaryValue("{'minimum':0,'maximum':6.1}").get(), |
| &prop, nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_DOUBLE_EQ(0.0, param2.GetMinValue()); |
| EXPECT_DOUBLE_EQ(6.1, param2.GetMaxValue()); |
| |
| ASSERT_TRUE(param2.FromJson(CreateDictionaryValue("{'default':-1.234}").get(), |
| &prop, nullptr)); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| ASSERT_NE(nullptr, param2.GetDefaultValue()); |
| EXPECT_DOUBLE_EQ(-1.234, param2.GetDefaultValue()->GetDouble()->GetValue()); |
| } |
| |
| TEST(CommandSchema, DoublePropType_Validate) { |
| buffet::DoublePropType prop; |
| prop.AddMinMaxConstraint(-1.2, 1.3); |
| chromeos::ErrorPtr error; |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("-2").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("-1.3").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("-1.2").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("0.0").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("1.3").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("1.31").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("true").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("'0.0'").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| } |
| |
| TEST(CommandSchema, DoublePropType_CreateValue) { |
| buffet::DoublePropType prop; |
| chromeos::ErrorPtr error; |
| auto val = prop.CreateValue(2.0, &error); |
| ASSERT_NE(nullptr, val.get()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_DOUBLE_EQ(2.0, val->GetValueAsAny().Get<double>()); |
| |
| val = prop.CreateValue("blah", &error); |
| EXPECT_EQ(nullptr, val.get()); |
| ASSERT_NE(nullptr, error.get()); |
| EXPECT_EQ(buffet::errors::commands::kTypeMismatch, error->GetCode()); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST(CommandSchema, StringPropType_Empty) { |
| buffet::StringPropType prop; |
| EXPECT_EQ(0, prop.GetMinLength()); |
| EXPECT_EQ((std::numeric_limits<int>::max)(), prop.GetMaxLength()); |
| EXPECT_FALSE(prop.HasOverriddenAttributes()); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| EXPECT_EQ(nullptr, prop.GetDefaultValue()); |
| } |
| |
| TEST(CommandSchema, StringPropType_Types) { |
| buffet::StringPropType prop; |
| EXPECT_EQ(nullptr, prop.GetInt()); |
| EXPECT_EQ(nullptr, prop.GetBoolean()); |
| EXPECT_EQ(nullptr, prop.GetDouble()); |
| EXPECT_EQ(&prop, prop.GetString()); |
| EXPECT_EQ(nullptr, prop.GetObject()); |
| EXPECT_EQ(nullptr, prop.GetArray()); |
| } |
| |
| TEST(CommandSchema, StringPropType_ToJson) { |
| buffet::StringPropType prop; |
| EXPECT_EQ("'string'", ValueToString(prop.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'type':'string'}", |
| ValueToString(prop.ToJson(true, nullptr).get())); |
| buffet::StringPropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_EQ("{}", ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'minLength':3}").get(), &prop, |
| nullptr); |
| EXPECT_EQ("{'minLength':3}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'maxLength':7}").get(), &prop, |
| nullptr); |
| EXPECT_EQ("{'maxLength':7}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'minLength':0,'maxLength':5}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'maxLength':5,'minLength':0}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| param2.FromJson(CreateDictionaryValue("{'default':'abcd'}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'default':'abcd'}", |
| ValueToString(param2.ToJson(false, nullptr).get())); |
| } |
| |
| TEST(CommandSchema, StringPropType_FromJson) { |
| buffet::StringPropType prop; |
| prop.AddLengthConstraint(2, 8); |
| buffet::StringPropType param2; |
| param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_FALSE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(2, prop.GetMinLength()); |
| EXPECT_EQ(8, prop.GetMaxLength()); |
| prop.AddLengthConstraint(3, 5); |
| param2.FromJson(CreateDictionaryValue("{'minLength':4}").get(), &prop, |
| nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(4, param2.GetMinLength()); |
| EXPECT_EQ(5, param2.GetMaxLength()); |
| param2.FromJson(CreateDictionaryValue("{'maxLength':8}").get(), &prop, |
| nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(3, param2.GetMinLength()); |
| EXPECT_EQ(8, param2.GetMaxLength()); |
| param2.FromJson(CreateDictionaryValue( |
| "{'minLength':1,'maxLength':7}").get(), &prop, nullptr); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| EXPECT_TRUE(param2.IsBasedOnSchema()); |
| EXPECT_EQ(1, param2.GetMinLength()); |
| EXPECT_EQ(7, param2.GetMaxLength()); |
| |
| ASSERT_TRUE(param2.FromJson(CreateDictionaryValue("{'default':'foo'}").get(), |
| &prop, nullptr)); |
| EXPECT_TRUE(param2.HasOverriddenAttributes()); |
| ASSERT_NE(nullptr, param2.GetDefaultValue()); |
| EXPECT_EQ("foo", param2.GetDefaultValue()->GetString()->GetValue()); |
| } |
| |
| TEST(CommandSchema, StringPropType_Validate) { |
| buffet::StringPropType prop; |
| prop.AddLengthConstraint(1, 3); |
| chromeos::ErrorPtr error; |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("''").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| prop.AddLengthConstraint(2, 3); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("''").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("'a'").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("'ab'").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("'abc'").get(), &error)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("'abcd'").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| |
| prop.FromJson(CreateDictionaryValue("{'enum':['abc','def','xyz!!']}").get(), |
| nullptr, &error); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("'abc'").get(), &error)); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("'def'").get(), &error)); |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("'xyz!!'").get(), &error)); |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("'xyz'").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| } |
| |
| TEST(CommandSchema, StringPropType_CreateValue) { |
| buffet::StringPropType prop; |
| chromeos::ErrorPtr error; |
| auto val = prop.CreateValue(std::string{"blah"}, &error); |
| ASSERT_NE(nullptr, val.get()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_EQ("blah", val->GetValueAsAny().Get<std::string>()); |
| |
| val = prop.CreateValue(4, &error); |
| EXPECT_EQ(nullptr, val.get()); |
| ASSERT_NE(nullptr, error.get()); |
| EXPECT_EQ(buffet::errors::commands::kTypeMismatch, error->GetCode()); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST(CommandSchema, ObjectPropType_Empty) { |
| buffet::ObjectPropType prop; |
| EXPECT_TRUE(prop.HasOverriddenAttributes()); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| EXPECT_EQ(nullptr, prop.GetDefaultValue()); |
| } |
| |
| TEST(CommandSchema, ObjectPropType_Types) { |
| buffet::ObjectPropType prop; |
| EXPECT_EQ(nullptr, prop.GetInt()); |
| EXPECT_EQ(nullptr, prop.GetBoolean()); |
| EXPECT_EQ(nullptr, prop.GetDouble()); |
| EXPECT_EQ(nullptr, prop.GetString()); |
| EXPECT_EQ(&prop, prop.GetObject()); |
| EXPECT_EQ(nullptr, prop.GetArray()); |
| } |
| |
| TEST(CommandSchema, ObjectPropType_ToJson) { |
| buffet::ObjectPropType prop; |
| EXPECT_EQ("{'additionalProperties':false,'properties':{}}", |
| ValueToString(prop.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'additionalProperties':false,'properties':{},'type':'object'}", |
| ValueToString(prop.ToJson(true, nullptr).get())); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| buffet::ObjectPropType prop2; |
| prop2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_EQ("{}", ValueToString(prop2.ToJson(false, nullptr).get())); |
| EXPECT_TRUE(prop2.IsBasedOnSchema()); |
| |
| auto schema = buffet::ObjectSchema::Create(); |
| schema->AddProp("expires", buffet::PropType::Create(buffet::ValueType::Int)); |
| auto pw = buffet::PropType::Create(buffet::ValueType::String); |
| pw->GetString()->AddLengthConstraint(6, 100); |
| schema->AddProp("password", std::move(pw)); |
| prop2.SetObjectSchema(std::move(schema)); |
| EXPECT_EQ("{'additionalProperties':false,'properties':{'expires':'integer'," |
| "'password':{'maxLength':100,'minLength':6}}}", |
| ValueToString(prop2.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'additionalProperties':false,'properties':{" |
| "'expires':{'type':'integer'}," |
| "'password':{'maxLength':100,'minLength':6,'type':'string'}}," |
| "'type':'object'}", |
| ValueToString(prop2.ToJson(true, nullptr).get())); |
| |
| buffet::ObjectPropType prop3; |
| ASSERT_TRUE(prop3.FromJson(CreateDictionaryValue( |
| "{'default':{'expires':3,'password':'abracadabra'}}").get(), &prop2, |
| nullptr)); |
| EXPECT_EQ("{'default':{'expires':3,'password':'abracadabra'}}", |
| ValueToString(prop3.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'additionalProperties':false," |
| "'default':{'expires':3,'password':'abracadabra'}," |
| "'properties':{'expires':{'type':'integer'}," |
| "'password':{'maxLength':100,'minLength':6,'type':'string'}}," |
| "'type':'object'}", |
| ValueToString(prop3.ToJson(true, nullptr).get())); |
| |
| buffet::ObjectPropType prop4; |
| ASSERT_TRUE(prop4.FromJson(CreateDictionaryValue( |
| "{'additionalProperties':true," |
| "'default':{'expires':3,'password':'abracadabra'}}").get(), &prop2, |
| nullptr)); |
| EXPECT_EQ("{'additionalProperties':true," |
| "'default':{'expires':3,'password':'abracadabra'}," |
| "'properties':{'expires':'integer'," |
| "'password':{'maxLength':100,'minLength':6}}}", |
| ValueToString(prop4.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'additionalProperties':true," |
| "'default':{'expires':3,'password':'abracadabra'}," |
| "'properties':{'expires':{'type':'integer'}," |
| "'password':{'maxLength':100,'minLength':6,'type':'string'}}," |
| "'type':'object'}", |
| ValueToString(prop4.ToJson(true, nullptr).get())); |
| } |
| |
| TEST(CommandSchema, ObjectPropType_FromJson) { |
| buffet::ObjectPropType base_prop; |
| EXPECT_TRUE(base_prop.FromJson(CreateDictionaryValue( |
| "{'properties':{'name':'string','age':'integer'}}").get(), nullptr, |
| nullptr)); |
| auto schema = base_prop.GetObject()->GetObjectSchemaPtr(); |
| const buffet::PropType* prop = schema->GetProp("name"); |
| EXPECT_EQ(buffet::ValueType::String, prop->GetType()); |
| prop = schema->GetProp("age"); |
| EXPECT_EQ(buffet::ValueType::Int, prop->GetType()); |
| |
| buffet::ObjectPropType prop2; |
| ASSERT_TRUE(prop2.FromJson(CreateDictionaryValue( |
| "{'properties':{'name':'string','age':'integer'}," |
| "'default':{'name':'Bob','age':33}}").get(), nullptr, nullptr)); |
| ASSERT_NE(nullptr, prop2.GetDefaultValue()); |
| const buffet::ObjectValue* defval = prop2.GetDefaultValue()->GetObject(); |
| ASSERT_NE(nullptr, defval); |
| buffet::native_types::Object objval = defval->GetValue(); |
| EXPECT_EQ("Bob", objval["name"]->GetString()->GetValue()); |
| EXPECT_EQ(33, objval["age"]->GetInt()->GetValue()); |
| } |
| |
| TEST(CommandSchema, ObjectPropType_Validate) { |
| buffet::ObjectPropType prop; |
| prop.FromJson(CreateDictionaryValue( |
| "{'properties':{'expires':'integer'," |
| "'password':{'maxLength':100,'minLength':6}}}").get(), nullptr, |
| nullptr); |
| chromeos::ErrorPtr error; |
| EXPECT_TRUE(prop.ValidateValue(CreateValue( |
| "{'expires':10,'password':'abcdef'}").get(), &error)); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue( |
| "{'expires':10}").get(), &error)); |
| EXPECT_EQ("parameter_missing", error->GetCode()); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue( |
| "{'password':'abcdef'}").get(), &error)); |
| EXPECT_EQ("parameter_missing", error->GetCode()); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue( |
| "{'expires':10,'password':'abcde'}").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("2").get(), &error)); |
| EXPECT_EQ("type_mismatch", error->GetCode()); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue( |
| "{'expires':10,'password':'abcdef','retry':true}").get(), &error)); |
| EXPECT_EQ("unexpected_parameter", error->GetCode()); |
| error.reset(); |
| } |
| |
| TEST(CommandSchema, ObjectPropType_Validate_Enum) { |
| buffet::ObjectPropType prop; |
| EXPECT_TRUE(prop.FromJson(CreateDictionaryValue( |
| "{'properties':{'width':'integer','height':'integer'}," |
| "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}").get(), |
| nullptr, nullptr)); |
| chromeos::ErrorPtr error; |
| EXPECT_TRUE(prop.ValidateValue(CreateValue( |
| "{'height':20,'width':10}").get(), &error)); |
| error.reset(); |
| |
| EXPECT_TRUE(prop.ValidateValue(CreateValue( |
| "{'height':200,'width':100}").get(), &error)); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue( |
| "{'height':12,'width':10}").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| } |
| |
| TEST(CommandSchema, ObjectPropType_CreateValue) { |
| buffet::ObjectPropType prop; |
| buffet::IntPropType int_type; |
| ASSERT_TRUE(prop.FromJson(CreateDictionaryValue( |
| "{'properties':{'width':'integer','height':'integer'}," |
| "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}").get(), |
| nullptr, nullptr)); |
| buffet::native_types::Object obj{ |
| {"width", int_type.CreateValue(10, nullptr)}, |
| {"height", int_type.CreateValue(20, nullptr)}, |
| }; |
| |
| chromeos::ErrorPtr error; |
| auto val = prop.CreateValue(obj, &error); |
| ASSERT_NE(nullptr, val.get()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_EQ(obj, val->GetValueAsAny().Get<buffet::native_types::Object>()); |
| |
| val = prop.CreateValue("blah", &error); |
| EXPECT_EQ(nullptr, val.get()); |
| ASSERT_NE(nullptr, error.get()); |
| EXPECT_EQ(buffet::errors::commands::kTypeMismatch, error->GetCode()); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST(CommandSchema, ArrayPropType_Empty) { |
| buffet::ArrayPropType prop; |
| EXPECT_FALSE(prop.HasOverriddenAttributes()); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| EXPECT_EQ(nullptr, prop.GetDefaultValue()); |
| EXPECT_EQ(nullptr, prop.GetItemTypePtr()); |
| prop.SetItemType(buffet::PropType::Create(buffet::ValueType::Int)); |
| EXPECT_TRUE(prop.HasOverriddenAttributes()); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| EXPECT_NE(nullptr, prop.GetItemTypePtr()); |
| } |
| |
| TEST(CommandSchema, ArrayPropType_Types) { |
| buffet::ArrayPropType prop; |
| EXPECT_EQ(nullptr, prop.GetInt()); |
| EXPECT_EQ(nullptr, prop.GetBoolean()); |
| EXPECT_EQ(nullptr, prop.GetDouble()); |
| EXPECT_EQ(nullptr, prop.GetString()); |
| EXPECT_EQ(nullptr, prop.GetObject()); |
| EXPECT_EQ(&prop, prop.GetArray()); |
| } |
| |
| TEST(CommandSchema, ArrayPropType_ToJson) { |
| buffet::ArrayPropType prop; |
| prop.SetItemType(buffet::PropType::Create(buffet::ValueType::Int)); |
| EXPECT_EQ("{'items':'integer'}", |
| ValueToString(prop.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'items':{'type':'integer'},'type':'array'}", |
| ValueToString(prop.ToJson(true, nullptr).get())); |
| EXPECT_FALSE(prop.IsBasedOnSchema()); |
| buffet::ArrayPropType prop2; |
| prop2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr); |
| EXPECT_EQ("{}", ValueToString(prop2.ToJson(false, nullptr).get())); |
| EXPECT_TRUE(prop2.IsBasedOnSchema()); |
| prop2.FromJson(CreateDictionaryValue("{'default':[1,2,3]}").get(), |
| &prop, nullptr); |
| EXPECT_EQ("{'default':[1,2,3]}", |
| ValueToString(prop2.ToJson(false, nullptr).get())); |
| EXPECT_EQ("{'default':[1,2,3],'items':{'type':'integer'},'type':'array'}", |
| ValueToString(prop2.ToJson(true, nullptr).get())); |
| } |
| |
| TEST(CommandSchema, ArrayPropType_FromJson) { |
| buffet::ArrayPropType prop; |
| EXPECT_TRUE(prop.FromJson( |
| CreateDictionaryValue("{'items':'integer'}").get(), nullptr, nullptr)); |
| EXPECT_EQ(buffet::ValueType::Int, prop.GetItemTypePtr()->GetType()); |
| |
| buffet::ArrayPropType prop2; |
| ASSERT_TRUE(prop2.FromJson(CreateDictionaryValue( |
| "{'items':'string','default':['foo', 'bar', 'baz']}").get(), nullptr, |
| nullptr)); |
| ASSERT_NE(nullptr, prop2.GetDefaultValue()); |
| const buffet::ArrayValue* defval = prop2.GetDefaultValue()->GetArray(); |
| ASSERT_NE(nullptr, defval); |
| EXPECT_EQ((std::vector<std::string>{"foo", "bar", "baz"}), |
| GetArrayValues<std::string>(defval->GetValue())); |
| } |
| |
| TEST(CommandSchema, ArrayPropType_Validate) { |
| buffet::ArrayPropType prop; |
| prop.FromJson(CreateDictionaryValue( |
| "{'items':{'minimum':2.3, 'maximum':10.5}}").get(), nullptr, |
| nullptr); |
| |
| chromeos::ErrorPtr error; |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("[3,4,10.5]").get(), &error)); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("[2]").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| EXPECT_EQ("Value 2 is out of range. It must not be less than 2.3", |
| error->GetMessage()); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("[4, 5, 20]").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| EXPECT_EQ("Value 20 is out of range. It must not be greater than 10.5", |
| error->GetMessage()); |
| error.reset(); |
| } |
| |
| TEST(CommandSchema, ArrayPropType_Validate_Enum) { |
| buffet::ArrayPropType prop; |
| prop.FromJson(CreateDictionaryValue( |
| "{'items':'integer', 'enum':[[1], [2,3], [4,5,6]]}").get(), nullptr, |
| nullptr); |
| |
| chromeos::ErrorPtr error; |
| EXPECT_TRUE(prop.ValidateValue(CreateValue("[2,3]").get(), &error)); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("[2]").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| EXPECT_EQ("Value [2] is invalid. Expected one of [[1],[2,3],[4,5,6]]", |
| error->GetMessage()); |
| error.reset(); |
| |
| EXPECT_FALSE(prop.ValidateValue(CreateValue("[2,3,4]").get(), &error)); |
| EXPECT_EQ("out_of_range", error->GetCode()); |
| error.reset(); |
| } |
| |
| TEST(CommandSchema, ArrayPropType_CreateValue) { |
| buffet::ArrayPropType prop; |
| ASSERT_TRUE(prop.FromJson(CreateDictionaryValue( |
| "{'items':{'properties':{'width':'integer','height':'integer'}}}").get(), |
| nullptr, nullptr)); |
| |
| chromeos::ErrorPtr error; |
| buffet::native_types::Array arr; |
| |
| auto val = prop.CreateValue(arr, &error); |
| ASSERT_NE(nullptr, val.get()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_EQ(arr, val->GetValueAsAny().Get<buffet::native_types::Array>()); |
| EXPECT_EQ("[]", ValueToString(val->ToJson(nullptr).get())); |
| |
| buffet::IntPropType int_type; |
| buffet::ObjectPropType obj_type; |
| ASSERT_TRUE(obj_type.FromJson(CreateDictionaryValue( |
| "{'properties':{'width':'integer','height':'integer'}}").get(), |
| nullptr, nullptr)); |
| arr.push_back(obj_type.CreateValue(buffet::native_types::Object{ |
| {"width", int_type.CreateValue(10, nullptr)}, |
| {"height", int_type.CreateValue(20, nullptr)}, |
| }, nullptr)); |
| arr.push_back(obj_type.CreateValue(buffet::native_types::Object{ |
| {"width", int_type.CreateValue(17, nullptr)}, |
| {"height", int_type.CreateValue(18, nullptr)}, |
| }, nullptr)); |
| |
| val = prop.CreateValue(arr, &error); |
| ASSERT_NE(nullptr, val.get()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_EQ(arr, val->GetValueAsAny().Get<buffet::native_types::Array>()); |
| EXPECT_EQ("[{'height':20,'width':10},{'height':18,'width':17}]", |
| ValueToString(val->ToJson(nullptr).get())); |
| |
| val = prop.CreateValue("blah", &error); |
| EXPECT_EQ(nullptr, val.get()); |
| ASSERT_NE(nullptr, error.get()); |
| EXPECT_EQ(buffet::errors::commands::kTypeMismatch, error->GetCode()); |
| } |
| |
| TEST(CommandSchema, ArrayPropType_NestedArrays_NotSupported) { |
| buffet::ArrayPropType prop; |
| chromeos::ErrorPtr error; |
| EXPECT_FALSE(prop.FromJson(CreateDictionaryValue( |
| "{'items':{'items':'integer'}}").get(), nullptr, &error)); |
| EXPECT_EQ(buffet::errors::commands::kInvalidObjectSchema, error->GetCode()); |
| error.reset(); |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeName) { |
| buffet::ObjectSchema schema; |
| const char* schema_str = "{" |
| "'param1':'integer'," |
| "'param2':'number'," |
| "'param3':'string'" |
| "}"; |
| EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| nullptr)); |
| EXPECT_EQ(buffet::ValueType::Int, schema.GetProp("param1")->GetType()); |
| EXPECT_EQ(buffet::ValueType::Double, schema.GetProp("param2")->GetType()); |
| EXPECT_EQ(buffet::ValueType::String, schema.GetProp("param3")->GetType()); |
| EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString()); |
| EXPECT_EQ(nullptr, schema.GetProp("param4")); |
| |
| int min_int = (std::numeric_limits<int>::min)(); |
| int max_int = (std::numeric_limits<int>::max)(); |
| double min_dbl = (std::numeric_limits<double>::lowest)(); |
| double max_dbl = (std::numeric_limits<double>::max)(); |
| EXPECT_EQ(min_int, schema.GetProp("param1")->GetInt()->GetMinValue()); |
| EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue()); |
| EXPECT_EQ(min_dbl, schema.GetProp("param2")->GetDouble()->GetMinValue()); |
| EXPECT_EQ(max_dbl, schema.GetProp("param2")->GetDouble()->GetMaxValue()); |
| EXPECT_EQ(0, schema.GetProp("param3")->GetString()->GetMinLength()); |
| EXPECT_EQ(max_int, schema.GetProp("param3")->GetString()->GetMaxLength()); |
| } |
| |
| TEST(CommandSchema, ObjectSchema_FromJson_Full_TypeName) { |
| buffet::ObjectSchema schema; |
| const char* schema_str = "{" |
| "'param1':{'type':'integer'}," |
| "'param2':{'type':'number'}," |
| "'param3':{'type':'string'}," |
| "'param4':{'type':'array', 'items':'integer'}," |
| "'param5':{'type':'object', 'properties':{'p1':'integer'}}" |
| "}"; |
| EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| nullptr)); |
| EXPECT_EQ(buffet::ValueType::Int, schema.GetProp("param1")->GetType()); |
| EXPECT_EQ(buffet::ValueType::Double, schema.GetProp("param2")->GetType()); |
| EXPECT_EQ(buffet::ValueType::String, schema.GetProp("param3")->GetType()); |
| EXPECT_EQ(buffet::ValueType::Array, schema.GetProp("param4")->GetType()); |
| EXPECT_EQ(buffet::ValueType::Object, schema.GetProp("param5")->GetType()); |
| EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString()); |
| EXPECT_EQ("array", schema.GetProp("param4")->GetTypeAsString()); |
| EXPECT_EQ("object", schema.GetProp("param5")->GetTypeAsString()); |
| EXPECT_EQ(nullptr, schema.GetProp("param77")); |
| |
| int min_int = (std::numeric_limits<int>::min)(); |
| int max_int = (std::numeric_limits<int>::max)(); |
| double min_dbl = (std::numeric_limits<double>::lowest)(); |
| double max_dbl = (std::numeric_limits<double>::max)(); |
| EXPECT_EQ(min_int, schema.GetProp("param1")->GetInt()->GetMinValue()); |
| EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue()); |
| EXPECT_EQ(min_dbl, schema.GetProp("param2")->GetDouble()->GetMinValue()); |
| EXPECT_EQ(max_dbl, schema.GetProp("param2")->GetDouble()->GetMaxValue()); |
| EXPECT_EQ(0, schema.GetProp("param3")->GetString()->GetMinLength()); |
| EXPECT_EQ(max_int, schema.GetProp("param3")->GetString()->GetMaxLength()); |
| } |
| |
| TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeDeduction_Scalar) { |
| buffet::ObjectSchema schema; |
| const char* schema_str = "{" |
| "'param1' :{'minimum':2}," |
| "'param2' :{'maximum':10}," |
| "'param3' :{'maximum':8, 'minimum':2}," |
| "'param4' :{'minimum':2.1}," |
| "'param5' :{'maximum':10.1}," |
| "'param6' :{'maximum':8.1, 'minimum':3.1}," |
| "'param7' :{'maximum':8, 'minimum':3.1}," |
| "'param8' :{'maximum':8.1, 'minimum':3}," |
| "'param9' :{'minLength':2}," |
| "'param10':{'maxLength':10}," |
| "'param11':{'maxLength':8, 'minLength':3}," |
| "'param12':{'default':12}," |
| "'param13':{'default':13.5}," |
| "'param14':{'default':true}," |
| "'param15':{'default':false}," |
| "'param16':{'default':'foobar'}," |
| "'param17':{'default':[1,2,3]}," |
| "'param18':{'items':'number', 'default':[]}" |
| "}"; |
| EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| nullptr)); |
| EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString()); |
| EXPECT_EQ("integer", schema.GetProp("param2")->GetTypeAsString()); |
| EXPECT_EQ("integer", schema.GetProp("param3")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param4")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param6")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param7")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param9")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param10")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param11")->GetTypeAsString()); |
| EXPECT_EQ("integer", schema.GetProp("param12")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param13")->GetTypeAsString()); |
| EXPECT_EQ("boolean", schema.GetProp("param14")->GetTypeAsString()); |
| EXPECT_EQ("boolean", schema.GetProp("param15")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param16")->GetTypeAsString()); |
| EXPECT_EQ("array", schema.GetProp("param17")->GetTypeAsString()); |
| auto prop17 = schema.GetProp("param17"); |
| EXPECT_EQ("integer", |
| prop17->GetArray()->GetItemTypePtr()->GetTypeAsString()); |
| EXPECT_EQ("array", schema.GetProp("param18")->GetTypeAsString()); |
| auto prop18 = schema.GetProp("param18"); |
| EXPECT_EQ("number", |
| prop18->GetArray()->GetItemTypePtr()->GetTypeAsString()); |
| |
| int min_int = (std::numeric_limits<int>::min)(); |
| int max_int = (std::numeric_limits<int>::max)(); |
| double min_dbl = (std::numeric_limits<double>::lowest)(); |
| double max_dbl = (std::numeric_limits<double>::max)(); |
| EXPECT_EQ(2, schema.GetProp("param1")->GetInt()->GetMinValue()); |
| EXPECT_EQ(max_int, schema.GetProp("param1")->GetInt()->GetMaxValue()); |
| EXPECT_EQ(min_int, schema.GetProp("param2")->GetInt()->GetMinValue()); |
| EXPECT_EQ(10, schema.GetProp("param2")->GetInt()->GetMaxValue()); |
| EXPECT_EQ(2, schema.GetProp("param3")->GetInt()->GetMinValue()); |
| EXPECT_EQ(8, schema.GetProp("param3")->GetInt()->GetMaxValue()); |
| EXPECT_DOUBLE_EQ(2.1, schema.GetProp("param4")->GetDouble()->GetMinValue()); |
| EXPECT_DOUBLE_EQ(max_dbl, |
| schema.GetProp("param4")->GetDouble()->GetMaxValue()); |
| EXPECT_DOUBLE_EQ(min_dbl, |
| schema.GetProp("param5")->GetDouble()->GetMinValue()); |
| EXPECT_DOUBLE_EQ(10.1, schema.GetProp("param5")->GetDouble()->GetMaxValue()); |
| EXPECT_DOUBLE_EQ(3.1, schema.GetProp("param6")->GetDouble()->GetMinValue()); |
| EXPECT_DOUBLE_EQ(8.1, schema.GetProp("param6")->GetDouble()->GetMaxValue()); |
| EXPECT_DOUBLE_EQ(3.1, schema.GetProp("param7")->GetDouble()->GetMinValue()); |
| EXPECT_DOUBLE_EQ(8.0, schema.GetProp("param7")->GetDouble()->GetMaxValue()); |
| EXPECT_DOUBLE_EQ(3.0, schema.GetProp("param8")->GetDouble()->GetMinValue()); |
| EXPECT_DOUBLE_EQ(8.1, schema.GetProp("param8")->GetDouble()->GetMaxValue()); |
| EXPECT_EQ(2, schema.GetProp("param9")->GetString()->GetMinLength()); |
| EXPECT_EQ(max_int, schema.GetProp("param9")->GetString()->GetMaxLength()); |
| EXPECT_EQ(0, schema.GetProp("param10")->GetString()->GetMinLength()); |
| EXPECT_EQ(10, schema.GetProp("param10")->GetString()->GetMaxLength()); |
| EXPECT_EQ(3, schema.GetProp("param11")->GetString()->GetMinLength()); |
| EXPECT_EQ(8, schema.GetProp("param11")->GetString()->GetMaxLength()); |
| const buffet::PropValue* val = schema.GetProp("param12")->GetDefaultValue(); |
| EXPECT_EQ(12, val->GetInt()->GetValue()); |
| val = schema.GetProp("param13")->GetDefaultValue(); |
| EXPECT_DOUBLE_EQ(13.5, val->GetDouble()->GetValue()); |
| val = schema.GetProp("param14")->GetDefaultValue(); |
| EXPECT_TRUE(val->GetBoolean()->GetValue()); |
| val = schema.GetProp("param15")->GetDefaultValue(); |
| EXPECT_FALSE(val->GetBoolean()->GetValue()); |
| val = schema.GetProp("param16")->GetDefaultValue(); |
| EXPECT_EQ("foobar", val->GetString()->GetValue()); |
| val = schema.GetProp("param17")->GetDefaultValue(); |
| EXPECT_EQ((std::vector<int>{1, 2, 3}), |
| GetArrayValues<int>(val->GetArray()->GetValue())); |
| val = schema.GetProp("param18")->GetDefaultValue(); |
| EXPECT_TRUE(val->GetArray()->GetValue().empty()); |
| } |
| |
| TEST(CommandSchema, ObjectSchema_FromJson_Shorthand_TypeDeduction_Array) { |
| buffet::ObjectSchema schema; |
| const char* schema_str = "{" |
| "'param1' :[0,1,2,3]," |
| "'param2' :[0.0,1.1,2.2]," |
| "'param3' :['id1', 'id2']," |
| "'param4' :{'enum':[1,2,3]}," |
| "'param5' :{'enum':[-1.1,2.2,3]}," |
| "'param6' :{'enum':['id0', 'id1']}," |
| "'param7' :{'type':'integer', 'enum':[1,2,3]}," |
| "'param8' :{'type':'number', 'enum':[1,2,3]}," |
| "'param9' :{'type':'number', 'enum':[]}," |
| "'param10':{'type':'integer', 'enum':[]}," |
| "'param11':[[0,1],[2,3]]," |
| "'param12':[['foo','bar']]," |
| "'param13':{'enum':[['id0', 'id1']]}" |
| "}"; |
| EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| nullptr)); |
| EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param2")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param3")->GetTypeAsString()); |
| EXPECT_EQ("integer", schema.GetProp("param4")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString()); |
| EXPECT_EQ("string", schema.GetProp("param6")->GetTypeAsString()); |
| EXPECT_EQ("integer", schema.GetProp("param7")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString()); |
| EXPECT_EQ("number", schema.GetProp("param9")->GetTypeAsString()); |
| EXPECT_EQ("integer", schema.GetProp("param10")->GetTypeAsString()); |
| |
| auto prop_type11 = schema.GetProp("param11"); |
| EXPECT_EQ("array", prop_type11->GetTypeAsString()); |
| EXPECT_EQ("integer", |
| prop_type11->GetArray()->GetItemTypePtr()->GetTypeAsString()); |
| |
| auto prop_type12 = schema.GetProp("param12"); |
| EXPECT_EQ("array", prop_type12->GetTypeAsString()); |
| EXPECT_EQ("string", |
| prop_type12->GetArray()->GetItemTypePtr()->GetTypeAsString()); |
| |
| auto prop_type13 = schema.GetProp("param13"); |
| EXPECT_EQ("array", prop_type12->GetTypeAsString()); |
| EXPECT_EQ("string", |
| prop_type13->GetArray()->GetItemTypePtr()->GetTypeAsString()); |
| |
| EXPECT_EQ((std::vector<int>{0, 1, 2, 3}), |
| GetOneOfValues<int>(schema.GetProp("param1"))); |
| EXPECT_EQ((std::vector<double>{0.0, 1.1, 2.2}), |
| GetOneOfValues<double>(schema.GetProp("param2"))); |
| EXPECT_EQ((std::vector<std::string>{"id1", "id2"}), |
| GetOneOfValues<std::string>(schema.GetProp("param3"))); |
| |
| EXPECT_EQ((std::vector<int>{1, 2, 3}), |
| GetOneOfValues<int>(schema.GetProp("param4"))); |
| EXPECT_EQ((std::vector<double>{-1.1, 2.2, 3.0}), |
| GetOneOfValues<double>(schema.GetProp("param5"))); |
| EXPECT_EQ((std::vector<std::string>{"id0", "id1"}), |
| GetOneOfValues<std::string>(schema.GetProp("param6"))); |
| EXPECT_EQ((std::vector<int>{1, 2, 3}), |
| GetOneOfValues<int>(schema.GetProp("param7"))); |
| EXPECT_EQ((std::vector<double>{1.0, 2.0, 3.0}), |
| GetOneOfValues<double>(schema.GetProp("param8"))); |
| EXPECT_TRUE(GetOneOfValues<double>(schema.GetProp("param9")).empty()); |
| EXPECT_TRUE(GetOneOfValues<int>(schema.GetProp("param10")).empty()); |
| } |
| |
| TEST(CommandSchema, ObjectSchema_FromJson_Inheritance) { |
| const char* base_schema_str = "{" |
| "'param0' :{'minimum':1, 'maximum':5}," |
| "'param1' :{'minimum':1, 'maximum':5}," |
| "'param2' :{'minimum':1, 'maximum':5}," |
| "'param3' :{'minimum':1, 'maximum':5}," |
| "'param4' :{'minimum':1, 'maximum':5}," |
| "'param5' :{'minimum':1.1, 'maximum':5.5}," |
| "'param6' :{'minimum':1.1, 'maximum':5.5}," |
| "'param7' :{'minimum':1.1, 'maximum':5.5}," |
| "'param8' :{'minimum':1.1, 'maximum':5.5}," |
| "'param9' :{'minLength':1, 'maxLength':5}," |
| "'param10':{'minLength':1, 'maxLength':5}," |
| "'param11':{'minLength':1, 'maxLength':5}," |
| "'param12':{'minLength':1, 'maxLength':5}," |
| "'param13':[1,2,3]," |
| "'param14':[1,2,3]," |
| "'param15':[1.1,2.2,3.3]," |
| "'param16':[1.1,2.2,3.3]," |
| "'param17':['id1', 'id2']," |
| "'param18':['id1', 'id2']," |
| "'param19':{'minimum':1, 'maximum':5}," |
| "'param20':{'default':49}," |
| "'param21':{'default':49}," |
| "'param22':'integer'" |
| "}"; |
| buffet::ObjectSchema base_schema; |
| EXPECT_TRUE(base_schema.FromJson(CreateDictionaryValue(base_schema_str).get(), |
| nullptr, nullptr)); |
| const char* schema_str = "{" |
| "'param1' :{}," |
| "'param2' :{'minimum':2}," |
| "'param3' :{'maximum':9}," |
| "'param4' :{'minimum':2, 'maximum':9}," |
| "'param5' :{}," |
| "'param6' :{'minimum':2.2}," |
| "'param7' :{'maximum':9.9}," |
| "'param8' :{'minimum':2.2, 'maximum':9.9}," |
| "'param9' :{}," |
| "'param10':{'minLength':3}," |
| "'param11':{'maxLength':8}," |
| "'param12':{'minLength':3, 'maxLength':8}," |
| "'param13':{}," |
| "'param14':[1,2,3,4]," |
| "'param15':{}," |
| "'param16':[1.1,2.2,3.3,4.4]," |
| "'param17':{}," |
| "'param18':['id1', 'id3']," |
| "'param19':{}," |
| "'param20':{}," |
| "'param21':{'default':8}," |
| "'param22':{'default':123}" |
| "}"; |
| buffet::ObjectSchema schema; |
| EXPECT_TRUE(schema.FromJson(CreateDictionaryValue(schema_str).get(), |
| &base_schema, nullptr)); |
| EXPECT_EQ(nullptr, schema.GetProp("param0")); |
| EXPECT_NE(nullptr, schema.GetProp("param1")); |
| EXPECT_EQ("integer", schema.GetProp("param1")->GetTypeAsString()); |
| EXPECT_EQ(1, schema.GetProp("param1")->GetInt()->GetMinValue()); |
| EXPECT_EQ(5, schema.GetProp("param1")->GetInt()->GetMaxValue()); |
| EXPECT_EQ("integer", schema.GetProp("param2")->GetTypeAsString()); |
| EXPECT_EQ(2, schema.GetProp("param2")->GetInt()->GetMinValue()); |
| EXPECT_EQ(5, schema.GetProp("param2")->GetInt()->GetMaxValue()); |
| EXPECT_EQ("integer", schema.GetProp("param3")->GetTypeAsString()); |
| EXPECT_EQ(1, schema.GetProp("param3")->GetInt()->GetMinValue()); |
| EXPECT_EQ(9, schema.GetProp("param3")->GetInt()->GetMaxValue()); |
| EXPECT_EQ("integer", schema.GetProp("param4")->GetTypeAsString()); |
| EXPECT_EQ(2, schema.GetProp("param4")->GetInt()->GetMinValue()); |
| EXPECT_EQ(9, schema.GetProp("param4")->GetInt()->GetMaxValue()); |
| EXPECT_EQ("number", schema.GetProp("param5")->GetTypeAsString()); |
| EXPECT_EQ(1.1, schema.GetProp("param5")->GetDouble()->GetMinValue()); |
| EXPECT_EQ(5.5, schema.GetProp("param5")->GetDouble()->GetMaxValue()); |
| EXPECT_EQ("number", schema.GetProp("param6")->GetTypeAsString()); |
| EXPECT_EQ(2.2, schema.GetProp("param6")->GetDouble()->GetMinValue()); |
| EXPECT_EQ(5.5, schema.GetProp("param6")->GetDouble()->GetMaxValue()); |
| EXPECT_EQ("number", schema.GetProp("param7")->GetTypeAsString()); |
| EXPECT_EQ(1.1, schema.GetProp("param7")->GetDouble()->GetMinValue()); |
| EXPECT_EQ(9.9, schema.GetProp("param7")->GetDouble()->GetMaxValue()); |
| EXPECT_EQ("number", schema.GetProp("param8")->GetTypeAsString()); |
| EXPECT_EQ(2.2, schema.GetProp("param8")->GetDouble()->GetMinValue()); |
| EXPECT_EQ(9.9, schema.GetProp("param8")->GetDouble()->GetMaxValue()); |
| EXPECT_EQ("string", schema.GetProp("param9")->GetTypeAsString()); |
| EXPECT_EQ(1, schema.GetProp("param9")->GetString()->GetMinLength()); |
| EXPECT_EQ(5, schema.GetProp("param9")->GetString()->GetMaxLength()); |
| EXPECT_EQ("string", schema.GetProp("param10")->GetTypeAsString()); |
| EXPECT_EQ(3, schema.GetProp("param10")->GetString()->GetMinLength()); |
| EXPECT_EQ(5, schema.GetProp("param10")->GetString()->GetMaxLength()); |
| EXPECT_EQ("string", schema.GetProp("param11")->GetTypeAsString()); |
| EXPECT_EQ(1, schema.GetProp("param11")->GetString()->GetMinLength()); |
| EXPECT_EQ(8, schema.GetProp("param11")->GetString()->GetMaxLength()); |
| EXPECT_EQ("string", schema.GetProp("param12")->GetTypeAsString()); |
| EXPECT_EQ(3, schema.GetProp("param12")->GetString()->GetMinLength()); |
| EXPECT_EQ(8, schema.GetProp("param12")->GetString()->GetMaxLength()); |
| EXPECT_EQ("integer", schema.GetProp("param13")->GetTypeAsString()); |
| EXPECT_EQ((std::vector<int>{1, 2, 3}), |
| GetOneOfValues<int>(schema.GetProp("param13"))); |
| EXPECT_EQ("integer", schema.GetProp("param14")->GetTypeAsString()); |
| EXPECT_EQ((std::vector<int>{1, 2, 3, 4}), |
| GetOneOfValues<int>(schema.GetProp("param14"))); |
| EXPECT_EQ("number", schema.GetProp("param15")->GetTypeAsString()); |
| EXPECT_EQ((std::vector<double>{1.1, 2.2, 3.3}), |
| GetOneOfValues<double>(schema.GetProp("param15"))); |
| EXPECT_EQ("number", schema.GetProp("param16")->GetTypeAsString()); |
| EXPECT_EQ((std::vector<double>{1.1, 2.2, 3.3, 4.4}), |
| GetOneOfValues<double>(schema.GetProp("param16"))); |
| EXPECT_EQ("string", schema.GetProp("param17")->GetTypeAsString()); |
| EXPECT_EQ((std::vector<std::string>{"id1", "id2"}), |
| GetOneOfValues<std::string>(schema.GetProp("param17"))); |
| EXPECT_EQ("string", schema.GetProp("param18")->GetTypeAsString()); |
| EXPECT_EQ((std::vector<std::string>{"id1", "id3"}), |
| GetOneOfValues<std::string>(schema.GetProp("param18"))); |
| EXPECT_EQ("integer", schema.GetProp("param19")->GetTypeAsString()); |
| EXPECT_EQ(1, schema.GetProp("param19")->GetInt()->GetMinValue()); |
| EXPECT_EQ(5, schema.GetProp("param19")->GetInt()->GetMaxValue()); |
| EXPECT_EQ(49, |
| schema.GetProp("param20")->GetDefaultValue()->GetInt()->GetValue()); |
| EXPECT_EQ(8, |
| schema.GetProp("param21")->GetDefaultValue()->GetInt()->GetValue()); |
| EXPECT_EQ(123, |
| schema.GetProp("param22")->GetDefaultValue()->GetInt()->GetValue()); |
| } |
| |
| TEST(CommandSchema, ObjectSchema_UseDefaults) { |
| buffet::ObjectPropType prop; |
| const char* schema_str = "{'properties':{" |
| "'param1':{'default':true}," |
| "'param2':{'default':2}," |
| "'param3':{'default':3.3}," |
| "'param4':{'default':'four'}," |
| "'param5':{'default':{'x':5,'y':6}," |
| "'properties':{'x':'integer','y':'integer'}}," |
| "'param6':{'default':[1,2,3]}" |
| "}}"; |
| ASSERT_TRUE(prop.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| nullptr)); |
| |
| // Omit all. |
| auto value = prop.CreateValue(); |
| ASSERT_TRUE(value->FromJson(CreateDictionaryValue("{}").get(), nullptr)); |
| buffet::native_types::Object obj = value->GetObject()->GetValue(); |
| EXPECT_TRUE(obj["param1"]->GetBoolean()->GetValue()); |
| EXPECT_EQ(2, obj["param2"]->GetInt()->GetValue()); |
| EXPECT_DOUBLE_EQ(3.3, obj["param3"]->GetDouble()->GetValue()); |
| EXPECT_EQ("four", obj["param4"]->GetString()->GetValue()); |
| buffet::native_types::Object param5 = obj["param5"]->GetObject()->GetValue(); |
| EXPECT_EQ(5, param5["x"]->GetInt()->GetValue()); |
| EXPECT_EQ(6, param5["y"]->GetInt()->GetValue()); |
| buffet::native_types::Array param6 = obj["param6"]->GetArray()->GetValue(); |
| EXPECT_EQ((std::vector<int>{1, 2, 3}), GetArrayValues<int>(param6)); |
| |
| // Specify some. |
| value = prop.CreateValue(); |
| const char* val_json = "{" |
| "'param1':false," |
| "'param3':33.3," |
| "'param5':{'x':-5,'y':-6}" |
| "}"; |
| ASSERT_TRUE(value->FromJson(CreateDictionaryValue(val_json).get(), nullptr)); |
| obj = value->GetObject()->GetValue(); |
| EXPECT_FALSE(obj["param1"]->GetBoolean()->GetValue()); |
| EXPECT_EQ(2, obj["param2"]->GetInt()->GetValue()); |
| EXPECT_DOUBLE_EQ(33.3, obj["param3"]->GetDouble()->GetValue()); |
| EXPECT_EQ("four", obj["param4"]->GetString()->GetValue()); |
| param5 = obj["param5"]->GetObject()->GetValue(); |
| EXPECT_EQ(-5, param5["x"]->GetInt()->GetValue()); |
| EXPECT_EQ(-6, param5["y"]->GetInt()->GetValue()); |
| param6 = obj["param6"]->GetArray()->GetValue(); |
| EXPECT_EQ((std::vector<int>{1, 2, 3}), GetArrayValues<int>(param6)); |
| |
| // Specify all. |
| value = prop.CreateValue(); |
| val_json = "{" |
| "'param1':false," |
| "'param2':22," |
| "'param3':333.3," |
| "'param4':'FOUR'," |
| "'param5':{'x':-55,'y':66}," |
| "'param6':[-1, 0]" |
| "}"; |
| ASSERT_TRUE(value->FromJson(CreateDictionaryValue(val_json).get(), nullptr)); |
| obj = value->GetObject()->GetValue(); |
| EXPECT_FALSE(obj["param1"]->GetBoolean()->GetValue()); |
| EXPECT_EQ(22, obj["param2"]->GetInt()->GetValue()); |
| EXPECT_DOUBLE_EQ(333.3, obj["param3"]->GetDouble()->GetValue()); |
| EXPECT_EQ("FOUR", obj["param4"]->GetString()->GetValue()); |
| param5 = obj["param5"]->GetObject()->GetValue(); |
| EXPECT_EQ(-55, param5["x"]->GetInt()->GetValue()); |
| EXPECT_EQ(66, param5["y"]->GetInt()->GetValue()); |
| param6 = obj["param6"]->GetArray()->GetValue(); |
| EXPECT_EQ((std::vector<int>{-1, 0}), GetArrayValues<int>(param6)); |
| } |
| |
| TEST(CommandSchema, ObjectSchema_FromJson_BaseSchema_Failures) { |
| buffet::ObjectSchema schema; |
| chromeos::ErrorPtr error; |
| const char* schema_str = "{" |
| "'param1':{}" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'type':'foo'}" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("unknown_type", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':[]" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'minimum':'foo'}" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':[1,2.2]" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'minimum':1, 'enum':[1,2,3]}" // can't have min/max & enum. |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("unexpected_parameter", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'maximum':1, 'blah':2}" // 'blah' is unexpected. |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("unexpected_parameter", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'enum':[1,2,3],'default':5}" // 'default' must be 1, 2, or 3. |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("out_of_range", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':[[1,2.3]]" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':[[1,2],[3,4],['blah']]" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("type_mismatch", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'default':[]}" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':[[[1]],[[2]]]" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'enum':[[['foo']]]}" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode()); |
| error.reset(); |
| |
| schema_str = "{" |
| "'param1':{'default':[[1],[2]]}" |
| "}"; |
| EXPECT_FALSE(schema.FromJson(CreateDictionaryValue(schema_str).get(), nullptr, |
| &error)); |
| EXPECT_EQ("no_type_info", error->GetFirstError()->GetCode()); |
| error.reset(); |
| } |