1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard
5*3f982cf4SFabien Sanglard #include "util/json/json_helpers.h"
6*3f982cf4SFabien Sanglard
7*3f982cf4SFabien Sanglard #include "gmock/gmock.h"
8*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
9*3f982cf4SFabien Sanglard #include "util/chrono_helpers.h"
10*3f982cf4SFabien Sanglard
11*3f982cf4SFabien Sanglard namespace openscreen {
12*3f982cf4SFabien Sanglard namespace json {
13*3f982cf4SFabien Sanglard namespace {
14*3f982cf4SFabien Sanglard
15*3f982cf4SFabien Sanglard using ::testing::ElementsAre;
16*3f982cf4SFabien Sanglard
17*3f982cf4SFabien Sanglard const Json::Value kNone;
18*3f982cf4SFabien Sanglard const Json::Value kEmptyString = "";
19*3f982cf4SFabien Sanglard const Json::Value kEmptyArray(Json::arrayValue);
20*3f982cf4SFabien Sanglard
21*3f982cf4SFabien Sanglard struct Dummy {
22*3f982cf4SFabien Sanglard int value;
23*3f982cf4SFabien Sanglard
operator ==openscreen::json::__anon0993d03d0111::Dummy24*3f982cf4SFabien Sanglard constexpr bool operator==(const Dummy& other) const {
25*3f982cf4SFabien Sanglard return other.value == value;
26*3f982cf4SFabien Sanglard }
27*3f982cf4SFabien Sanglard };
28*3f982cf4SFabien Sanglard
TryParseDummy(const Json::Value & value,Dummy * out)29*3f982cf4SFabien Sanglard bool TryParseDummy(const Json::Value& value, Dummy* out) {
30*3f982cf4SFabien Sanglard int value_out;
31*3f982cf4SFabien Sanglard if (!TryParseInt(value, &value_out)) {
32*3f982cf4SFabien Sanglard return false;
33*3f982cf4SFabien Sanglard }
34*3f982cf4SFabien Sanglard *out = Dummy{value_out};
35*3f982cf4SFabien Sanglard return true;
36*3f982cf4SFabien Sanglard }
37*3f982cf4SFabien Sanglard
38*3f982cf4SFabien Sanglard } // namespace
39*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseDouble)40*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseDouble) {
41*3f982cf4SFabien Sanglard const Json::Value kValid = 13.37;
42*3f982cf4SFabien Sanglard const Json::Value kNotDouble = "coffee beans";
43*3f982cf4SFabien Sanglard const Json::Value kNegativeDouble = -4.2;
44*3f982cf4SFabien Sanglard const Json::Value kZeroDouble = 0.0;
45*3f982cf4SFabien Sanglard const Json::Value kNanDouble = std::nan("");
46*3f982cf4SFabien Sanglard
47*3f982cf4SFabien Sanglard double out;
48*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseDouble(kValid, &out));
49*3f982cf4SFabien Sanglard EXPECT_DOUBLE_EQ(13.37, out);
50*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseDouble(kZeroDouble, &out));
51*3f982cf4SFabien Sanglard EXPECT_DOUBLE_EQ(0.0, out);
52*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseDouble(kNotDouble, &out));
53*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseDouble(kNegativeDouble, &out));
54*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseDouble(kNone, &out));
55*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseDouble(kNanDouble, &out));
56*3f982cf4SFabien Sanglard }
57*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseInt)58*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseInt) {
59*3f982cf4SFabien Sanglard const Json::Value kValid = 1337;
60*3f982cf4SFabien Sanglard const Json::Value kNotInt = "cold brew";
61*3f982cf4SFabien Sanglard const Json::Value kNegativeInt = -42;
62*3f982cf4SFabien Sanglard const Json::Value kZeroInt = 0;
63*3f982cf4SFabien Sanglard
64*3f982cf4SFabien Sanglard int out;
65*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseInt(kValid, &out));
66*3f982cf4SFabien Sanglard EXPECT_EQ(1337, out);
67*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseInt(kZeroInt, &out));
68*3f982cf4SFabien Sanglard EXPECT_EQ(0, out);
69*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseInt(kNone, &out));
70*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseInt(kNotInt, &out));
71*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseInt(kNegativeInt, &out));
72*3f982cf4SFabien Sanglard }
73*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseUint)74*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseUint) {
75*3f982cf4SFabien Sanglard const Json::Value kValid = 1337u;
76*3f982cf4SFabien Sanglard const Json::Value kNotUint = "espresso";
77*3f982cf4SFabien Sanglard const Json::Value kZeroUint = 0u;
78*3f982cf4SFabien Sanglard
79*3f982cf4SFabien Sanglard uint32_t out;
80*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseUint(kValid, &out));
81*3f982cf4SFabien Sanglard EXPECT_EQ(1337u, out);
82*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseUint(kZeroUint, &out));
83*3f982cf4SFabien Sanglard EXPECT_EQ(0u, out);
84*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseUint(kNone, &out));
85*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseUint(kNotUint, &out));
86*3f982cf4SFabien Sanglard }
87*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseString)88*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseString) {
89*3f982cf4SFabien Sanglard const Json::Value kValid = "macchiato";
90*3f982cf4SFabien Sanglard const Json::Value kNotString = 42;
91*3f982cf4SFabien Sanglard
92*3f982cf4SFabien Sanglard std::string out;
93*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseString(kValid, &out));
94*3f982cf4SFabien Sanglard EXPECT_EQ("macchiato", out);
95*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseString(kEmptyString, &out));
96*3f982cf4SFabien Sanglard EXPECT_EQ("", out);
97*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseString(kNone, &out));
98*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseString(kNotString, &out));
99*3f982cf4SFabien Sanglard }
100*3f982cf4SFabien Sanglard
101*3f982cf4SFabien Sanglard // Simple fraction validity is tested extensively in its unit tests, so we
102*3f982cf4SFabien Sanglard // just check the major cases here.
TEST(ParsingHelpersTest,TryParseSimpleFraction)103*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseSimpleFraction) {
104*3f982cf4SFabien Sanglard const Json::Value kValid = "42/30";
105*3f982cf4SFabien Sanglard const Json::Value kValidNumber = "42";
106*3f982cf4SFabien Sanglard const Json::Value kUndefined = "5/0";
107*3f982cf4SFabien Sanglard const Json::Value kNegative = "10/-2";
108*3f982cf4SFabien Sanglard const Json::Value kInvalidNumber = "-1";
109*3f982cf4SFabien Sanglard const Json::Value kNotSimpleFraction = "latte";
110*3f982cf4SFabien Sanglard const Json::Value kInteger = 123;
111*3f982cf4SFabien Sanglard const Json::Value kNegativeInteger = -5000;
112*3f982cf4SFabien Sanglard
113*3f982cf4SFabien Sanglard SimpleFraction out;
114*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseSimpleFraction(kValid, &out));
115*3f982cf4SFabien Sanglard EXPECT_EQ((SimpleFraction{42, 30}), out);
116*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseSimpleFraction(kValidNumber, &out));
117*3f982cf4SFabien Sanglard EXPECT_EQ((SimpleFraction{42, 1}), out);
118*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseSimpleFraction(kInteger, &out));
119*3f982cf4SFabien Sanglard EXPECT_EQ((SimpleFraction{123, 1}), out);
120*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseSimpleFraction(kUndefined, &out));
121*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseSimpleFraction(kNegative, &out));
122*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseSimpleFraction(kInvalidNumber, &out));
123*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseSimpleFraction(kNotSimpleFraction, &out));
124*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseSimpleFraction(kNone, &out));
125*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseSimpleFraction(kEmptyString, &out));
126*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseSimpleFraction(kNegativeInteger, &out));
127*3f982cf4SFabien Sanglard }
128*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseMilliseconds)129*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseMilliseconds) {
130*3f982cf4SFabien Sanglard const Json::Value kValid = 1000;
131*3f982cf4SFabien Sanglard const Json::Value kValidFloat = 500.0;
132*3f982cf4SFabien Sanglard const Json::Value kNegativeNumber = -120;
133*3f982cf4SFabien Sanglard const Json::Value kZeroNumber = 0;
134*3f982cf4SFabien Sanglard const Json::Value kNotNumber = "affogato";
135*3f982cf4SFabien Sanglard
136*3f982cf4SFabien Sanglard milliseconds out;
137*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseMilliseconds(kValid, &out));
138*3f982cf4SFabien Sanglard EXPECT_EQ(milliseconds(1000), out);
139*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseMilliseconds(kValidFloat, &out));
140*3f982cf4SFabien Sanglard EXPECT_EQ(milliseconds(500), out);
141*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseMilliseconds(kZeroNumber, &out));
142*3f982cf4SFabien Sanglard EXPECT_EQ(milliseconds(0), out);
143*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseMilliseconds(kNone, &out));
144*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseMilliseconds(kNegativeNumber, &out));
145*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseMilliseconds(kNotNumber, &out));
146*3f982cf4SFabien Sanglard }
147*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseArray)148*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseArray) {
149*3f982cf4SFabien Sanglard Json::Value valid_dummy_array;
150*3f982cf4SFabien Sanglard valid_dummy_array[0] = 123;
151*3f982cf4SFabien Sanglard valid_dummy_array[1] = 456;
152*3f982cf4SFabien Sanglard
153*3f982cf4SFabien Sanglard Json::Value invalid_dummy_array;
154*3f982cf4SFabien Sanglard invalid_dummy_array[0] = "iced coffee";
155*3f982cf4SFabien Sanglard invalid_dummy_array[1] = 456;
156*3f982cf4SFabien Sanglard
157*3f982cf4SFabien Sanglard std::vector<Dummy> out;
158*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseArray<Dummy>(valid_dummy_array, TryParseDummy, &out));
159*3f982cf4SFabien Sanglard EXPECT_THAT(out, ElementsAre(Dummy{123}, Dummy{456}));
160*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseArray<Dummy>(invalid_dummy_array, TryParseDummy, &out));
161*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseArray<Dummy>(kEmptyArray, TryParseDummy, &out));
162*3f982cf4SFabien Sanglard }
163*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseIntArray)164*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseIntArray) {
165*3f982cf4SFabien Sanglard Json::Value valid_int_array;
166*3f982cf4SFabien Sanglard valid_int_array[0] = 123;
167*3f982cf4SFabien Sanglard valid_int_array[1] = 456;
168*3f982cf4SFabien Sanglard
169*3f982cf4SFabien Sanglard Json::Value invalid_int_array;
170*3f982cf4SFabien Sanglard invalid_int_array[0] = "iced coffee";
171*3f982cf4SFabien Sanglard invalid_int_array[1] = 456;
172*3f982cf4SFabien Sanglard
173*3f982cf4SFabien Sanglard std::vector<int> out;
174*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseIntArray(valid_int_array, &out));
175*3f982cf4SFabien Sanglard EXPECT_THAT(out, ElementsAre(123, 456));
176*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseIntArray(invalid_int_array, &out));
177*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseIntArray(kEmptyArray, &out));
178*3f982cf4SFabien Sanglard }
179*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseUintArray)180*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseUintArray) {
181*3f982cf4SFabien Sanglard Json::Value valid_uint_array;
182*3f982cf4SFabien Sanglard valid_uint_array[0] = 123u;
183*3f982cf4SFabien Sanglard valid_uint_array[1] = 456u;
184*3f982cf4SFabien Sanglard
185*3f982cf4SFabien Sanglard Json::Value invalid_uint_array;
186*3f982cf4SFabien Sanglard invalid_uint_array[0] = "breve";
187*3f982cf4SFabien Sanglard invalid_uint_array[1] = 456u;
188*3f982cf4SFabien Sanglard
189*3f982cf4SFabien Sanglard std::vector<uint32_t> out;
190*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseUintArray(valid_uint_array, &out));
191*3f982cf4SFabien Sanglard EXPECT_THAT(out, ElementsAre(123u, 456u));
192*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseUintArray(invalid_uint_array, &out));
193*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseUintArray(kEmptyArray, &out));
194*3f982cf4SFabien Sanglard }
195*3f982cf4SFabien Sanglard
TEST(ParsingHelpersTest,TryParseStringArray)196*3f982cf4SFabien Sanglard TEST(ParsingHelpersTest, TryParseStringArray) {
197*3f982cf4SFabien Sanglard Json::Value valid_string_array;
198*3f982cf4SFabien Sanglard valid_string_array[0] = "nitro cold brew";
199*3f982cf4SFabien Sanglard valid_string_array[1] = "doppio espresso";
200*3f982cf4SFabien Sanglard
201*3f982cf4SFabien Sanglard Json::Value invalid_string_array;
202*3f982cf4SFabien Sanglard invalid_string_array[0] = "mocha latte";
203*3f982cf4SFabien Sanglard invalid_string_array[1] = 456;
204*3f982cf4SFabien Sanglard
205*3f982cf4SFabien Sanglard std::vector<std::string> out;
206*3f982cf4SFabien Sanglard EXPECT_TRUE(TryParseStringArray(valid_string_array, &out));
207*3f982cf4SFabien Sanglard EXPECT_THAT(out, ElementsAre("nitro cold brew", "doppio espresso"));
208*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseStringArray(invalid_string_array, &out));
209*3f982cf4SFabien Sanglard EXPECT_FALSE(TryParseStringArray(kEmptyArray, &out));
210*3f982cf4SFabien Sanglard }
211*3f982cf4SFabien Sanglard
212*3f982cf4SFabien Sanglard } // namespace json
213*3f982cf4SFabien Sanglard } // namespace openscreen
214