blob: e20532d30c4c36fd5ed41cfa7235a10e91266d0a [file] [log] [blame]
// 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 <memory>
#include <string>
#include <vector>
#include <base/values.h>
#include <gtest/gtest.h>
#include "buffet/commands/object_schema.h"
#include "buffet/commands/prop_types.h"
#include "buffet/commands/prop_values.h"
#include "buffet/commands/schema_utils.h"
#include "buffet/commands/unittest_utils.h"
using buffet::unittests::CreateValue;
using buffet::unittests::ValueToString;
TEST(CommandSchemaUtils, TypedValueToJson_Scalar) {
EXPECT_EQ("true",
ValueToString(buffet::TypedValueToJson(true, nullptr).get()));
EXPECT_EQ("false",
ValueToString(buffet::TypedValueToJson(false, nullptr).get()));
EXPECT_EQ("0", ValueToString(buffet::TypedValueToJson(0, nullptr).get()));
EXPECT_EQ("-10", ValueToString(buffet::TypedValueToJson(-10, nullptr).get()));
EXPECT_EQ("20", ValueToString(buffet::TypedValueToJson(20, nullptr).get()));
EXPECT_EQ("0.0", ValueToString(buffet::TypedValueToJson(0.0, nullptr).get()));
EXPECT_EQ("1.2", ValueToString(buffet::TypedValueToJson(1.2, nullptr).get()));
EXPECT_EQ("'abc'",
ValueToString(buffet::TypedValueToJson(std::string("abc"),
nullptr).get()));
std::vector<bool> bool_array{true, false};
EXPECT_EQ("[true,false]",
ValueToString(buffet::TypedValueToJson(bool_array, nullptr).get()));
std::vector<int> int_array{1, 2, 5};
EXPECT_EQ("[1,2,5]",
ValueToString(buffet::TypedValueToJson(int_array, nullptr).get()));
std::vector<double> dbl_array{1.1, 2.2};
EXPECT_EQ("[1.1,2.2]",
ValueToString(buffet::TypedValueToJson(dbl_array, nullptr).get()));
std::vector<std::string> str_array{"a", "bc"};
EXPECT_EQ("['a','bc']",
ValueToString(buffet::TypedValueToJson(str_array, nullptr).get()));
}
TEST(CommandSchemaUtils, TypedValueToJson_Object) {
buffet::IntPropType int_type;
buffet::native_types::Object object;
object.insert(std::make_pair("width", int_type.CreateValue(640)));
object.insert(std::make_pair("height", int_type.CreateValue(480)));
EXPECT_EQ("{'height':480,'width':640}",
ValueToString(buffet::TypedValueToJson(object, nullptr).get()));
}
TEST(CommandSchemaUtils, TypedValueFromJson_Bool) {
bool value;
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("true").get(), nullptr,
&value, nullptr));
EXPECT_TRUE(value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("false").get(), nullptr,
&value, nullptr));
EXPECT_FALSE(value);
buffet::ErrorPtr error;
EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("0").get(), nullptr,
&value, &error));
EXPECT_EQ("type_mismatch", error->GetCode());
error.reset();
}
TEST(CommandSchemaUtils, TypedValueFromJson_Int) {
int value;
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("0").get(), nullptr,
&value, nullptr));
EXPECT_EQ(0, value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("23").get(), nullptr,
&value, nullptr));
EXPECT_EQ(23, value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("-1234").get(), nullptr,
&value, nullptr));
EXPECT_EQ(-1234, value);
buffet::ErrorPtr error;
EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
&value, &error));
EXPECT_EQ("type_mismatch", error->GetCode());
error.reset();
}
TEST(CommandSchemaUtils, TypedValueFromJson_Double) {
double value;
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("0").get(), nullptr,
&value, nullptr));
EXPECT_DOUBLE_EQ(0.0, value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("0.0").get(), nullptr,
&value, nullptr));
EXPECT_DOUBLE_EQ(0.0, value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("23").get(), nullptr,
&value, nullptr));
EXPECT_EQ(23.0, value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("23.1").get(), nullptr,
&value, nullptr));
EXPECT_EQ(23.1, value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("-1.23E+02").get(),
nullptr, &value, nullptr));
EXPECT_EQ(-123.0, value);
buffet::ErrorPtr error;
EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
&value, &error));
EXPECT_EQ("type_mismatch", error->GetCode());
error.reset();
}
TEST(CommandSchemaUtils, TypedValueFromJson_String) {
std::string value;
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("''").get(), nullptr,
&value, nullptr));
EXPECT_EQ("", value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("'23'").get(), nullptr,
&value, nullptr));
EXPECT_EQ("23", value);
EXPECT_TRUE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
&value, nullptr));
EXPECT_EQ("abc", value);
buffet::ErrorPtr error;
EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("12").get(), nullptr,
&value, &error));
EXPECT_EQ("type_mismatch", error->GetCode());
error.reset();
}
TEST(CommandSchemaUtils, TypedValueFromJson_Object) {
buffet::native_types::Object value;
buffet::ObjectSchema schema;
auto age_prop = std::make_shared<buffet::IntPropType>();
age_prop->AddMinMaxConstraint(0, 150);
schema.AddProp("age", age_prop);
auto name_prop = std::make_shared<buffet::StringPropType>();
name_prop->AddLengthConstraint(1, 30);
schema.AddProp("name", name_prop);
EXPECT_TRUE(buffet::TypedValueFromJson(
CreateValue("{'age':20,'name':'Bob'}").get(), &schema, &value, nullptr));
buffet::native_types::Object value2;
value2.insert(std::make_pair("age", age_prop->CreateValue(20)));
value2.insert(std::make_pair("name",
name_prop->CreateValue(std::string("Bob"))));
EXPECT_EQ(value2, value);
buffet::ErrorPtr error;
EXPECT_FALSE(buffet::TypedValueFromJson(CreateValue("'abc'").get(), nullptr,
&value, &error));
EXPECT_EQ("type_mismatch", error->GetCode());
error.reset();
}