blob: 1ea4c9018b055af19e7606f09f1eea293a6ed41b [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Alex Vakulenko66ec2922014-06-17 15:30:22 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Stefan Sauer2d16dfa2015-09-25 17:08:35 +02005#include "src/commands/schema_utils.h"
Alex Deymof6cbe322014-11-10 19:55:35 -08006
Alex Vakulenko66ec2922014-06-17 15:30:22 -07007#include <memory>
8#include <string>
9#include <vector>
10
Alex Vakulenko66ec2922014-06-17 15:30:22 -070011#include <base/values.h>
12#include <gtest/gtest.h>
13
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020014#include "src/commands/object_schema.h"
15#include "src/commands/prop_types.h"
16#include "src/commands/prop_values.h"
17#include "src/commands/schema_constants.h"
18#include "src/commands/unittest_utils.h"
Alex Vakulenko66ec2922014-06-17 15:30:22 -070019
Vitaly Bukab6f015a2015-07-09 14:59:23 -070020namespace weave {
Vitaly Buka32005de2015-05-01 12:33:31 -070021
Vitaly Buka0f6b2ec2015-08-20 15:35:19 -070022using test::CreateDictionaryValue;
23using test::CreateValue;
Alex Vakulenko66ec2922014-06-17 15:30:22 -070024
25TEST(CommandSchemaUtils, TypedValueToJson_Scalar) {
Vitaly Buka6942e1f2015-07-28 15:33:55 -070026 EXPECT_JSON_EQ("true", *TypedValueToJson(true));
27 EXPECT_JSON_EQ("false", *TypedValueToJson(false));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070028
Vitaly Buka6942e1f2015-07-28 15:33:55 -070029 EXPECT_JSON_EQ("0", *TypedValueToJson(0));
30 EXPECT_JSON_EQ("-10", *TypedValueToJson(-10));
31 EXPECT_JSON_EQ("20", *TypedValueToJson(20));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070032
Vitaly Buka6942e1f2015-07-28 15:33:55 -070033 EXPECT_JSON_EQ("0.0", *TypedValueToJson(0.0));
34 EXPECT_JSON_EQ("1.2", *TypedValueToJson(1.2));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070035
Vitaly Buka6942e1f2015-07-28 15:33:55 -070036 EXPECT_JSON_EQ("'abc'", *TypedValueToJson(std::string("abc")));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070037
38 std::vector<bool> bool_array{true, false};
Vitaly Buka6942e1f2015-07-28 15:33:55 -070039 EXPECT_JSON_EQ("[true,false]", *TypedValueToJson(bool_array));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070040
41 std::vector<int> int_array{1, 2, 5};
Vitaly Buka6942e1f2015-07-28 15:33:55 -070042 EXPECT_JSON_EQ("[1,2,5]", *TypedValueToJson(int_array));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070043
44 std::vector<double> dbl_array{1.1, 2.2};
Vitaly Buka6942e1f2015-07-28 15:33:55 -070045 EXPECT_JSON_EQ("[1.1,2.2]", *TypedValueToJson(dbl_array));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070046
47 std::vector<std::string> str_array{"a", "bc"};
Vitaly Buka6942e1f2015-07-28 15:33:55 -070048 EXPECT_JSON_EQ("['a','bc']", *TypedValueToJson(str_array));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070049}
50
51TEST(CommandSchemaUtils, TypedValueToJson_Object) {
Vitaly Buka32005de2015-05-01 12:33:31 -070052 IntPropType int_type;
Vitaly Buka774cdf52015-07-21 13:55:00 -070053 ValueMap object;
Alex Vakulenko66ec2922014-06-17 15:30:22 -070054
Vitaly Bukac58a8282015-07-29 01:25:20 -070055 object.insert(std::make_pair(
56 "width", int_type.CreateValue(base::FundamentalValue{640}, nullptr)));
57 object.insert(std::make_pair(
58 "height", int_type.CreateValue(base::FundamentalValue{480}, nullptr)));
Vitaly Buka6942e1f2015-07-28 15:33:55 -070059 EXPECT_JSON_EQ("{'height':480,'width':640}", *TypedValueToJson(object));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070060}
61
Alex Vakulenko29e64442015-03-20 13:59:19 -070062TEST(CommandSchemaUtils, TypedValueToJson_Array) {
Vitaly Buka32005de2015-05-01 12:33:31 -070063 IntPropType int_type;
Vitaly Buka774cdf52015-07-21 13:55:00 -070064 ValueVector arr;
Alex Vakulenko29e64442015-03-20 13:59:19 -070065
Vitaly Bukac58a8282015-07-29 01:25:20 -070066 arr.push_back(int_type.CreateValue(base::FundamentalValue{640}, nullptr));
67 arr.push_back(int_type.CreateValue(base::FundamentalValue{480}, nullptr));
Vitaly Buka6942e1f2015-07-28 15:33:55 -070068 EXPECT_JSON_EQ("[640,480]", *TypedValueToJson(arr));
Alex Vakulenko29e64442015-03-20 13:59:19 -070069}
70
Alex Vakulenko66ec2922014-06-17 15:30:22 -070071TEST(CommandSchemaUtils, TypedValueFromJson_Bool) {
72 bool value;
73
Vitaly Buka32005de2015-05-01 12:33:31 -070074 EXPECT_TRUE(
75 TypedValueFromJson(CreateValue("true").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070076 EXPECT_TRUE(value);
77
Vitaly Buka32005de2015-05-01 12:33:31 -070078 EXPECT_TRUE(
79 TypedValueFromJson(CreateValue("false").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070080 EXPECT_FALSE(value);
81
Vitaly Buka0801a1f2015-08-14 10:03:46 -070082 ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -070083 EXPECT_FALSE(
84 TypedValueFromJson(CreateValue("0").get(), nullptr, &value, &error));
85 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -070086 error.reset();
87}
88
89TEST(CommandSchemaUtils, TypedValueFromJson_Int) {
90 int value;
91
Vitaly Buka32005de2015-05-01 12:33:31 -070092 EXPECT_TRUE(
93 TypedValueFromJson(CreateValue("0").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070094 EXPECT_EQ(0, value);
95
Vitaly Buka32005de2015-05-01 12:33:31 -070096 EXPECT_TRUE(
97 TypedValueFromJson(CreateValue("23").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -070098 EXPECT_EQ(23, value);
99
Vitaly Buka32005de2015-05-01 12:33:31 -0700100 EXPECT_TRUE(
101 TypedValueFromJson(CreateValue("-1234").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700102 EXPECT_EQ(-1234, value);
103
Vitaly Buka0801a1f2015-08-14 10:03:46 -0700104 ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700105 EXPECT_FALSE(
106 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, &error));
107 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700108 error.reset();
109}
110
111TEST(CommandSchemaUtils, TypedValueFromJson_Double) {
112 double value;
113
Vitaly Buka32005de2015-05-01 12:33:31 -0700114 EXPECT_TRUE(
115 TypedValueFromJson(CreateValue("0").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700116 EXPECT_DOUBLE_EQ(0.0, value);
Vitaly Buka32005de2015-05-01 12:33:31 -0700117 EXPECT_TRUE(
118 TypedValueFromJson(CreateValue("0.0").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700119 EXPECT_DOUBLE_EQ(0.0, value);
120
Vitaly Buka32005de2015-05-01 12:33:31 -0700121 EXPECT_TRUE(
122 TypedValueFromJson(CreateValue("23").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700123 EXPECT_EQ(23.0, value);
Vitaly Buka32005de2015-05-01 12:33:31 -0700124 EXPECT_TRUE(
125 TypedValueFromJson(CreateValue("23.1").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700126 EXPECT_EQ(23.1, value);
127
Vitaly Buka32005de2015-05-01 12:33:31 -0700128 EXPECT_TRUE(TypedValueFromJson(CreateValue("-1.23E+02").get(), nullptr,
129 &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700130 EXPECT_EQ(-123.0, value);
131
Vitaly Buka0801a1f2015-08-14 10:03:46 -0700132 ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700133 EXPECT_FALSE(
134 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, &error));
135 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700136 error.reset();
137}
138
139TEST(CommandSchemaUtils, TypedValueFromJson_String) {
140 std::string value;
141
Vitaly Buka32005de2015-05-01 12:33:31 -0700142 EXPECT_TRUE(
143 TypedValueFromJson(CreateValue("''").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700144 EXPECT_EQ("", value);
145
Vitaly Buka32005de2015-05-01 12:33:31 -0700146 EXPECT_TRUE(
147 TypedValueFromJson(CreateValue("'23'").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700148 EXPECT_EQ("23", value);
149
Vitaly Buka32005de2015-05-01 12:33:31 -0700150 EXPECT_TRUE(
151 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, nullptr));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700152 EXPECT_EQ("abc", value);
153
Vitaly Buka0801a1f2015-08-14 10:03:46 -0700154 ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700155 EXPECT_FALSE(
156 TypedValueFromJson(CreateValue("12").get(), nullptr, &value, &error));
157 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700158 error.reset();
159}
160
161TEST(CommandSchemaUtils, TypedValueFromJson_Object) {
Vitaly Buka774cdf52015-07-21 13:55:00 -0700162 ValueMap value;
Vitaly Buka32005de2015-05-01 12:33:31 -0700163 std::unique_ptr<ObjectSchema> schema{new ObjectSchema};
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700164
Vitaly Buka32005de2015-05-01 12:33:31 -0700165 IntPropType age_prop;
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700166 age_prop.AddMinMaxConstraint(0, 150);
167 schema->AddProp("age", age_prop.Clone());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700168
Vitaly Buka32005de2015-05-01 12:33:31 -0700169 StringPropType name_prop;
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700170 name_prop.AddLengthConstraint(1, 30);
171 schema->AddProp("name", name_prop.Clone());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700172
Vitaly Buka32005de2015-05-01 12:33:31 -0700173 ObjectPropType type;
Alex Vakulenko5ef75792015-03-19 15:50:44 -0700174 type.SetObjectSchema(std::move(schema));
Vitaly Buka32005de2015-05-01 12:33:31 -0700175 EXPECT_TRUE(TypedValueFromJson(CreateValue("{'age':20,'name':'Bob'}").get(),
176 &type, &value, nullptr));
Vitaly Buka774cdf52015-07-21 13:55:00 -0700177 ValueMap value2;
Vitaly Bukaa647c852015-07-06 14:51:01 -0700178 value2.insert(std::make_pair(
Vitaly Bukac58a8282015-07-29 01:25:20 -0700179 "age", age_prop.CreateValue(base::FundamentalValue{20}, nullptr)));
180 value2.insert(std::make_pair(
181 "name", name_prop.CreateValue(base::StringValue("Bob"), nullptr)));
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700182 EXPECT_EQ(value2, value);
183
Vitaly Buka0801a1f2015-08-14 10:03:46 -0700184 ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700185 EXPECT_FALSE(
186 TypedValueFromJson(CreateValue("'abc'").get(), nullptr, &value, &error));
187 EXPECT_EQ(errors::commands::kTypeMismatch, error->GetCode());
Alex Vakulenko66ec2922014-06-17 15:30:22 -0700188 error.reset();
189}
Alex Vakulenkoa32d83a2014-09-19 15:05:24 -0700190
Alex Vakulenko29e64442015-03-20 13:59:19 -0700191TEST(CommandSchemaUtils, TypedValueFromJson_Array) {
Vitaly Buka774cdf52015-07-21 13:55:00 -0700192 ValueVector arr;
Vitaly Buka32005de2015-05-01 12:33:31 -0700193 StringPropType str_type;
Alex Vakulenko29e64442015-03-20 13:59:19 -0700194 str_type.AddLengthConstraint(3, 100);
Vitaly Buka32005de2015-05-01 12:33:31 -0700195 ArrayPropType type;
Alex Vakulenko29e64442015-03-20 13:59:19 -0700196 type.SetItemType(str_type.Clone());
197
Vitaly Buka32005de2015-05-01 12:33:31 -0700198 EXPECT_TRUE(TypedValueFromJson(CreateValue("['foo', 'bar']").get(), &type,
199 &arr, nullptr));
Vitaly Buka774cdf52015-07-21 13:55:00 -0700200 ValueVector arr2;
Vitaly Bukac58a8282015-07-29 01:25:20 -0700201 arr2.push_back(str_type.CreateValue(base::StringValue{"foo"}, nullptr));
202 arr2.push_back(str_type.CreateValue(base::StringValue{"bar"}, nullptr));
Alex Vakulenko29e64442015-03-20 13:59:19 -0700203 EXPECT_EQ(arr2, arr);
204
Vitaly Buka0801a1f2015-08-14 10:03:46 -0700205 ErrorPtr error;
Vitaly Buka32005de2015-05-01 12:33:31 -0700206 EXPECT_FALSE(TypedValueFromJson(CreateValue("['baz', 'ab']").get(), &type,
207 &arr, &error));
208 EXPECT_EQ(errors::commands::kOutOfRange, error->GetCode());
Alex Vakulenko29e64442015-03-20 13:59:19 -0700209 error.reset();
210}
211
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700212} // namespace weave