xref: /aosp_15_r20/external/libbrillo/brillo/value_conversion_test.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2015 The Android Open Source Project
2*1a96fba6SXin Li //
3*1a96fba6SXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*1a96fba6SXin Li // you may not use this file except in compliance with the License.
5*1a96fba6SXin Li // You may obtain a copy of the License at
6*1a96fba6SXin Li //
7*1a96fba6SXin Li //      http://www.apache.org/licenses/LICENSE-2.0
8*1a96fba6SXin Li //
9*1a96fba6SXin Li // Unless required by applicable law or agreed to in writing, software
10*1a96fba6SXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*1a96fba6SXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*1a96fba6SXin Li // See the License for the specific language governing permissions and
13*1a96fba6SXin Li // limitations under the License.
14*1a96fba6SXin Li 
15*1a96fba6SXin Li #include <brillo/value_conversion.h>
16*1a96fba6SXin Li 
17*1a96fba6SXin Li #include <algorithm>
18*1a96fba6SXin Li #include <limits>
19*1a96fba6SXin Li #include <memory>
20*1a96fba6SXin Li #include <string>
21*1a96fba6SXin Li #include <vector>
22*1a96fba6SXin Li 
23*1a96fba6SXin Li #include <base/json/json_reader.h>
24*1a96fba6SXin Li #include <base/json/json_writer.h>
25*1a96fba6SXin Li #include <gtest/gtest.h>
26*1a96fba6SXin Li 
27*1a96fba6SXin Li namespace brillo {
28*1a96fba6SXin Li 
29*1a96fba6SXin Li namespace {
30*1a96fba6SXin Li 
ParseValue(std::string json)31*1a96fba6SXin Li std::unique_ptr<base::Value> ParseValue(std::string json) {
32*1a96fba6SXin Li   std::replace(json.begin(), json.end(), '\'', '"');
33*1a96fba6SXin Li   std::string message;
34*1a96fba6SXin Li   auto value = base::JSONReader::ReadAndReturnError(json, base::JSON_PARSE_RFC,
35*1a96fba6SXin Li                                                     nullptr, &message);
36*1a96fba6SXin Li   CHECK(value) << "Failed to load JSON: " << message << ", " << json;
37*1a96fba6SXin Li   return value;
38*1a96fba6SXin Li }
39*1a96fba6SXin Li 
IsEqualValue(const base::Value & val1,const base::Value & val2)40*1a96fba6SXin Li inline bool IsEqualValue(const base::Value& val1, const base::Value& val2) {
41*1a96fba6SXin Li   return val1.Equals(&val2);
42*1a96fba6SXin Li }
43*1a96fba6SXin Li 
44*1a96fba6SXin Li #define EXPECT_JSON_EQ(expected, actual) \
45*1a96fba6SXin Li   EXPECT_PRED2(IsEqualValue, *ParseValue(expected), actual)
46*1a96fba6SXin Li 
47*1a96fba6SXin Li }  // namespace
48*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueInt)49*1a96fba6SXin Li TEST(ValueConversionTest, FromValueInt) {
50*1a96fba6SXin Li   int actual;
51*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("123"), &actual));
52*1a96fba6SXin Li   EXPECT_EQ(123, actual);
53*1a96fba6SXin Li 
54*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("-123"), &actual));
55*1a96fba6SXin Li   EXPECT_EQ(-123, actual);
56*1a96fba6SXin Li 
57*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("true"), &actual));
58*1a96fba6SXin Li }
59*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueBool)60*1a96fba6SXin Li TEST(ValueConversionTest, FromValueBool) {
61*1a96fba6SXin Li   bool actual;
62*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("false"), &actual));
63*1a96fba6SXin Li   EXPECT_FALSE(actual);
64*1a96fba6SXin Li 
65*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("true"), &actual));
66*1a96fba6SXin Li   EXPECT_TRUE(actual);
67*1a96fba6SXin Li 
68*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("0"), &actual));
69*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("1"), &actual));
70*1a96fba6SXin Li }
71*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueDouble)72*1a96fba6SXin Li TEST(ValueConversionTest, FromValueDouble) {
73*1a96fba6SXin Li   double actual;
74*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("12.5"), &actual));
75*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(12.5, actual);
76*1a96fba6SXin Li 
77*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("-0.1"), &actual));
78*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(-0.1, actual);
79*1a96fba6SXin Li 
80*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("17"), &actual));
81*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(17.0, actual);
82*1a96fba6SXin Li 
83*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("'1.0'"), &actual));
84*1a96fba6SXin Li }
85*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueString)86*1a96fba6SXin Li TEST(ValueConversionTest, FromValueString) {
87*1a96fba6SXin Li   std::string actual;
88*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("'foo'"), &actual));
89*1a96fba6SXin Li   EXPECT_EQ("foo", actual);
90*1a96fba6SXin Li 
91*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("'bar'"), &actual));
92*1a96fba6SXin Li   EXPECT_EQ("bar", actual);
93*1a96fba6SXin Li 
94*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("''"), &actual));
95*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
96*1a96fba6SXin Li 
97*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("1"), &actual));
98*1a96fba6SXin Li }
99*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueListValue)100*1a96fba6SXin Li TEST(ValueConversionTest, FromValueListValue) {
101*1a96fba6SXin Li   const base::ListValue* list = nullptr;
102*1a96fba6SXin Li   auto in_value = ParseValue("[1, 2, 'foo']");
103*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*in_value, &list));
104*1a96fba6SXin Li   EXPECT_JSON_EQ("[1, 2, 'foo']", *list);
105*1a96fba6SXin Li }
106*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueDictValue)107*1a96fba6SXin Li TEST(ValueConversionTest, FromValueDictValue) {
108*1a96fba6SXin Li   const base::DictionaryValue* dict = nullptr;
109*1a96fba6SXin Li   auto in_value = ParseValue("{'foo':'bar','baz': 1}");
110*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*in_value, &dict));
111*1a96fba6SXin Li   EXPECT_JSON_EQ("{'foo':'bar','baz': 1}", *dict);
112*1a96fba6SXin Li }
113*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueListValueUniquePtr)114*1a96fba6SXin Li TEST(ValueConversionTest, FromValueListValueUniquePtr) {
115*1a96fba6SXin Li   std::unique_ptr<base::ListValue> list;
116*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[1, 2, 'bar']"), &list));
117*1a96fba6SXin Li   EXPECT_JSON_EQ("[1, 2, 'bar']", *list);
118*1a96fba6SXin Li }
119*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueDictValueUniquePtr)120*1a96fba6SXin Li TEST(ValueConversionTest, FromValueDictValueUniquePtr) {
121*1a96fba6SXin Li   std::unique_ptr<base::DictionaryValue> dict;
122*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("{'foo':'bar','baz': 1}"), &dict));
123*1a96fba6SXin Li   EXPECT_JSON_EQ("{'foo':'bar','baz': 1}", *dict);
124*1a96fba6SXin Li }
125*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfInt)126*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfInt) {
127*1a96fba6SXin Li   std::vector<int> actual;
128*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[1, 2, 3, 4]"), &actual));
129*1a96fba6SXin Li   EXPECT_EQ((std::vector<int>{1, 2, 3, 4}), actual);
130*1a96fba6SXin Li 
131*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual));
132*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
133*1a96fba6SXin Li 
134*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("[1, 2, 3, '4']"), &actual));
135*1a96fba6SXin Li }
136*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfBool)137*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfBool) {
138*1a96fba6SXin Li   std::vector<bool> actual;
139*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[true, true, false]"), &actual));
140*1a96fba6SXin Li   EXPECT_EQ((std::vector<bool>{true, true, false}), actual);
141*1a96fba6SXin Li 
142*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual));
143*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
144*1a96fba6SXin Li 
145*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("[true, 0]"), &actual));
146*1a96fba6SXin Li }
147*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfDouble)148*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfDouble) {
149*1a96fba6SXin Li   std::vector<double> actual;
150*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[1, 2.0, 6.5, -11.2]"), &actual));
151*1a96fba6SXin Li   EXPECT_EQ((std::vector<double>{1.0, 2.0, 6.5, -11.2}), actual);
152*1a96fba6SXin Li 
153*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual));
154*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
155*1a96fba6SXin Li 
156*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("['s']"), &actual));
157*1a96fba6SXin Li }
158*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfString)159*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfString) {
160*1a96fba6SXin Li   std::vector<std::string> actual;
161*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("['', 'foo', 'bar']"), &actual));
162*1a96fba6SXin Li   EXPECT_EQ((std::vector<std::string>{"", "foo", "bar"}), actual);
163*1a96fba6SXin Li 
164*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual));
165*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
166*1a96fba6SXin Li 
167*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("[100]"), &actual));
168*1a96fba6SXin Li }
169*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfVectors)170*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfVectors) {
171*1a96fba6SXin Li   std::vector<std::vector<int>> actual;
172*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[[1,2], [], [3]]"), &actual));
173*1a96fba6SXin Li   EXPECT_EQ((std::vector<std::vector<int>>{{1, 2}, {}, {3}}), actual);
174*1a96fba6SXin Li 
175*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual));
176*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
177*1a96fba6SXin Li 
178*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("[100]"), &actual));
179*1a96fba6SXin Li }
180*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueMap)181*1a96fba6SXin Li TEST(ValueConversionTest, FromValueMap) {
182*1a96fba6SXin Li   std::map<std::string, int> actual;
183*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("{'foo':1, 'bar':2, 'baz':3}"), &actual));
184*1a96fba6SXin Li   EXPECT_EQ((std::map<std::string, int>{{"foo", 1}, {"bar", 2}, {"baz", 3}}),
185*1a96fba6SXin Li             actual);
186*1a96fba6SXin Li 
187*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("{}"), &actual));
188*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
189*1a96fba6SXin Li 
190*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("{'foo':1, 'bar':'2'}"), &actual));
191*1a96fba6SXin Li }
192*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueMapOfVectors)193*1a96fba6SXin Li TEST(ValueConversionTest, FromValueMapOfVectors) {
194*1a96fba6SXin Li   std::map<std::string, std::vector<int>> actual;
195*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("{'foo':[1,2], 'bar':[]}"), &actual));
196*1a96fba6SXin Li   std::map<std::string, std::vector<int>> expected{
197*1a96fba6SXin Li       {"foo", {1, 2}}, {"bar", {}}};
198*1a96fba6SXin Li   EXPECT_EQ(expected, actual);
199*1a96fba6SXin Li 
200*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("{}"), &actual));
201*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
202*1a96fba6SXin Li 
203*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("{'foo':[1], 'bar':[2,'3']}"), &actual));
204*1a96fba6SXin Li }
205*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfMaps)206*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfMaps) {
207*1a96fba6SXin Li   std::vector<std::map<std::string, int>> actual;
208*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[{'foo':1,'bar':2},{'baz':3}]"), &actual));
209*1a96fba6SXin Li   std::vector<std::map<std::string, int>> expected{
210*1a96fba6SXin Li       {{"foo", 1}, {"bar", 2}}, {{"baz", 3}}};
211*1a96fba6SXin Li   EXPECT_EQ(expected, actual);
212*1a96fba6SXin Li 
213*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[]"), &actual));
214*1a96fba6SXin Li   EXPECT_TRUE(actual.empty());
215*1a96fba6SXin Li 
216*1a96fba6SXin Li   EXPECT_FALSE(FromValue(*ParseValue("[{'foo':1}, 'bar']"), &actual));
217*1a96fba6SXin Li }
218*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfLists)219*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfLists) {
220*1a96fba6SXin Li   std::vector<std::unique_ptr<base::ListValue>> actual;
221*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[['foo',1],['bar',2],[true]]"), &actual));
222*1a96fba6SXin Li   ASSERT_EQ(3, actual.size());
223*1a96fba6SXin Li   EXPECT_JSON_EQ("['foo', 1]", *actual[0]);
224*1a96fba6SXin Li   EXPECT_JSON_EQ("['bar', 2]", *actual[1]);
225*1a96fba6SXin Li   EXPECT_JSON_EQ("[true]", *actual[2]);
226*1a96fba6SXin Li }
227*1a96fba6SXin Li 
TEST(ValueConversionTest,FromValueVectorOfDicts)228*1a96fba6SXin Li TEST(ValueConversionTest, FromValueVectorOfDicts) {
229*1a96fba6SXin Li   std::vector<std::unique_ptr<base::DictionaryValue>> actual;
230*1a96fba6SXin Li   EXPECT_TRUE(FromValue(*ParseValue("[{'foo': 1}, {'bar': 2}]"), &actual));
231*1a96fba6SXin Li   ASSERT_EQ(2, actual.size());
232*1a96fba6SXin Li   EXPECT_JSON_EQ("{'foo': 1}", *actual[0]);
233*1a96fba6SXin Li   EXPECT_JSON_EQ("{'bar': 2}", *actual[1]);
234*1a96fba6SXin Li }
235*1a96fba6SXin Li 
TEST(ValueConversionTest,ToValueScalar)236*1a96fba6SXin Li TEST(ValueConversionTest, ToValueScalar) {
237*1a96fba6SXin Li   EXPECT_JSON_EQ("1234", *ToValue(1234));
238*1a96fba6SXin Li   EXPECT_JSON_EQ("true", *ToValue(true));
239*1a96fba6SXin Li   EXPECT_JSON_EQ("false", *ToValue(false));
240*1a96fba6SXin Li   EXPECT_JSON_EQ("12.5", *ToValue(12.5));
241*1a96fba6SXin Li   EXPECT_JSON_EQ("'foobar'", *ToValue("foobar"));
242*1a96fba6SXin Li }
243*1a96fba6SXin Li 
TEST(ValueConversionTest,ToValueVector)244*1a96fba6SXin Li TEST(ValueConversionTest, ToValueVector) {
245*1a96fba6SXin Li   EXPECT_JSON_EQ("[1, 2, 3]", *ToValue(std::vector<int>{1, 2, 3}));
246*1a96fba6SXin Li   EXPECT_JSON_EQ("[]", *ToValue(std::vector<int>{}));
247*1a96fba6SXin Li   EXPECT_JSON_EQ("[true, false]", *ToValue(std::vector<bool>{true, false}));
248*1a96fba6SXin Li   EXPECT_JSON_EQ("['foo', 'bar']",
249*1a96fba6SXin Li                  *ToValue(std::vector<std::string>{"foo", "bar"}));
250*1a96fba6SXin Li   EXPECT_JSON_EQ("[[1,2],[3]]",
251*1a96fba6SXin Li                  *ToValue(std::vector<std::vector<int>>{{1, 2}, {3}}));
252*1a96fba6SXin Li }
253*1a96fba6SXin Li 
TEST(ValueConversionTest,ToValueMap)254*1a96fba6SXin Li TEST(ValueConversionTest, ToValueMap) {
255*1a96fba6SXin Li   EXPECT_JSON_EQ("{'foo': 1, 'bar': 2}",
256*1a96fba6SXin Li                  *ToValue(std::map<std::string, int>{{"foo", 1}, {"bar", 2}}));
257*1a96fba6SXin Li   EXPECT_JSON_EQ("{}", *ToValue(std::map<std::string, int>{}));
258*1a96fba6SXin Li   EXPECT_JSON_EQ("{'foo': true}",
259*1a96fba6SXin Li                  *ToValue(std::map<std::string, bool>{{"foo", true}}));
260*1a96fba6SXin Li   EXPECT_JSON_EQ("{'foo': 1.1, 'bar': 2.2}",
261*1a96fba6SXin Li                  *ToValue(std::map<std::string, double>{{"foo", 1.1},
262*1a96fba6SXin Li                                                         {"bar", 2.2}}));
263*1a96fba6SXin Li }
264*1a96fba6SXin Li 
265*1a96fba6SXin Li }  // namespace brillo
266