1 /* 2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include <vector> 12 #include "webrtc/base/gunit.h" 13 #include "webrtc/base/json.h" 14 15 static Json::Value in_s("foo"); 16 static Json::Value in_sn("99"); 17 static Json::Value in_si("-99"); 18 static Json::Value in_sb("true"); 19 static Json::Value in_sd("1.2"); 20 static Json::Value in_n(12); 21 static Json::Value in_i(-12); 22 static Json::Value in_u(34U); 23 static Json::Value in_b(true); 24 static Json::Value in_d(1.2); 25 static Json::Value big_sn("12345678901234567890"); 26 static Json::Value big_si("-12345678901234567890"); 27 static Json::Value big_u(0xFFFFFFFF); 28 static Json::Value bad_a(Json::arrayValue); 29 static Json::Value bad_o(Json::objectValue); 30 31 TEST(JsonTest, GetString) { 32 std::string out; 33 EXPECT_TRUE(GetStringFromJson(in_s, &out)); 34 EXPECT_EQ("foo", out); 35 EXPECT_TRUE(GetStringFromJson(in_sn, &out)); 36 EXPECT_EQ("99", out); 37 EXPECT_TRUE(GetStringFromJson(in_si, &out)); 38 EXPECT_EQ("-99", out); 39 EXPECT_TRUE(GetStringFromJson(in_i, &out)); 40 EXPECT_EQ("-12", out); 41 EXPECT_TRUE(GetStringFromJson(in_n, &out)); 42 EXPECT_EQ("12", out); 43 EXPECT_TRUE(GetStringFromJson(in_u, &out)); 44 EXPECT_EQ("34", out); 45 EXPECT_TRUE(GetStringFromJson(in_b, &out)); 46 EXPECT_EQ("true", out); 47 // Not supported here yet. 48 EXPECT_FALSE(GetStringFromJson(bad_a, &out)); 49 EXPECT_FALSE(GetStringFromJson(bad_o, &out)); 50 } 51 52 TEST(JsonTest, GetInt) { 53 int out; 54 EXPECT_TRUE(GetIntFromJson(in_sn, &out)); 55 EXPECT_EQ(99, out); 56 EXPECT_TRUE(GetIntFromJson(in_si, &out)); 57 EXPECT_EQ(-99, out); 58 EXPECT_TRUE(GetIntFromJson(in_n, &out)); 59 EXPECT_EQ(12, out); 60 EXPECT_TRUE(GetIntFromJson(in_i, &out)); 61 EXPECT_EQ(-12, out); 62 EXPECT_TRUE(GetIntFromJson(in_u, &out)); 63 EXPECT_EQ(34, out); 64 EXPECT_TRUE(GetIntFromJson(in_b, &out)); 65 EXPECT_EQ(1, out); 66 EXPECT_FALSE(GetIntFromJson(in_s, &out)); 67 EXPECT_FALSE(GetIntFromJson(big_sn, &out)); 68 EXPECT_FALSE(GetIntFromJson(big_si, &out)); 69 EXPECT_FALSE(GetIntFromJson(big_u, &out)); 70 EXPECT_FALSE(GetIntFromJson(bad_a, &out)); 71 EXPECT_FALSE(GetIntFromJson(bad_o, &out)); 72 } 73 74 TEST(JsonTest, GetUInt) { 75 unsigned int out; 76 EXPECT_TRUE(GetUIntFromJson(in_sn, &out)); 77 EXPECT_EQ(99U, out); 78 EXPECT_TRUE(GetUIntFromJson(in_n, &out)); 79 EXPECT_EQ(12U, out); 80 EXPECT_TRUE(GetUIntFromJson(in_u, &out)); 81 EXPECT_EQ(34U, out); 82 EXPECT_TRUE(GetUIntFromJson(in_b, &out)); 83 EXPECT_EQ(1U, out); 84 EXPECT_TRUE(GetUIntFromJson(big_u, &out)); 85 EXPECT_EQ(0xFFFFFFFFU, out); 86 EXPECT_FALSE(GetUIntFromJson(in_s, &out)); 87 // TODO: Fail reading negative strings. 88 // EXPECT_FALSE(GetUIntFromJson(in_si, &out)); 89 EXPECT_FALSE(GetUIntFromJson(in_i, &out)); 90 EXPECT_FALSE(GetUIntFromJson(big_sn, &out)); 91 EXPECT_FALSE(GetUIntFromJson(big_si, &out)); 92 EXPECT_FALSE(GetUIntFromJson(bad_a, &out)); 93 EXPECT_FALSE(GetUIntFromJson(bad_o, &out)); 94 } 95 96 TEST(JsonTest, GetBool) { 97 bool out; 98 EXPECT_TRUE(GetBoolFromJson(in_sb, &out)); 99 EXPECT_EQ(true, out); 100 EXPECT_TRUE(GetBoolFromJson(in_n, &out)); 101 EXPECT_EQ(true, out); 102 EXPECT_TRUE(GetBoolFromJson(in_i, &out)); 103 EXPECT_EQ(true, out); 104 EXPECT_TRUE(GetBoolFromJson(in_u, &out)); 105 EXPECT_EQ(true, out); 106 EXPECT_TRUE(GetBoolFromJson(in_b, &out)); 107 EXPECT_EQ(true, out); 108 EXPECT_TRUE(GetBoolFromJson(big_u, &out)); 109 EXPECT_EQ(true, out); 110 EXPECT_FALSE(GetBoolFromJson(in_s, &out)); 111 EXPECT_FALSE(GetBoolFromJson(in_sn, &out)); 112 EXPECT_FALSE(GetBoolFromJson(in_si, &out)); 113 EXPECT_FALSE(GetBoolFromJson(big_sn, &out)); 114 EXPECT_FALSE(GetBoolFromJson(big_si, &out)); 115 EXPECT_FALSE(GetBoolFromJson(bad_a, &out)); 116 EXPECT_FALSE(GetBoolFromJson(bad_o, &out)); 117 } 118 119 TEST(JsonTest, GetDouble) { 120 double out; 121 EXPECT_TRUE(GetDoubleFromJson(in_sn, &out)); 122 EXPECT_EQ(99, out); 123 EXPECT_TRUE(GetDoubleFromJson(in_si, &out)); 124 EXPECT_EQ(-99, out); 125 EXPECT_TRUE(GetDoubleFromJson(in_sd, &out)); 126 EXPECT_EQ(1.2, out); 127 EXPECT_TRUE(GetDoubleFromJson(in_n, &out)); 128 EXPECT_EQ(12, out); 129 EXPECT_TRUE(GetDoubleFromJson(in_i, &out)); 130 EXPECT_EQ(-12, out); 131 EXPECT_TRUE(GetDoubleFromJson(in_u, &out)); 132 EXPECT_EQ(34, out); 133 EXPECT_TRUE(GetDoubleFromJson(in_b, &out)); 134 EXPECT_EQ(1, out); 135 EXPECT_TRUE(GetDoubleFromJson(in_d, &out)); 136 EXPECT_EQ(1.2, out); 137 EXPECT_FALSE(GetDoubleFromJson(in_s, &out)); 138 } 139 140 TEST(JsonTest, GetFromArray) { 141 Json::Value a, out; 142 a.append(in_s); 143 a.append(in_i); 144 a.append(in_u); 145 a.append(in_b); 146 EXPECT_TRUE(GetValueFromJsonArray(a, 0, &out)); 147 EXPECT_TRUE(GetValueFromJsonArray(a, 3, &out)); 148 EXPECT_FALSE(GetValueFromJsonArray(a, 99, &out)); 149 EXPECT_FALSE(GetValueFromJsonArray(a, 0xFFFFFFFF, &out)); 150 } 151 152 TEST(JsonTest, GetFromObject) { 153 Json::Value o, out; 154 o["string"] = in_s; 155 o["int"] = in_i; 156 o["uint"] = in_u; 157 o["bool"] = in_b; 158 EXPECT_TRUE(GetValueFromJsonObject(o, "int", &out)); 159 EXPECT_TRUE(GetValueFromJsonObject(o, "bool", &out)); 160 EXPECT_FALSE(GetValueFromJsonObject(o, "foo", &out)); 161 EXPECT_FALSE(GetValueFromJsonObject(o, "", &out)); 162 } 163 164 namespace { 165 template <typename T> 166 std::vector<T> VecOf3(const T& a, const T& b, const T& c) { 167 std::vector<T> in; 168 in.push_back(a); 169 in.push_back(b); 170 in.push_back(c); 171 return in; 172 } 173 template <typename T> 174 Json::Value JsonVecOf3(const T& a, const T& b, const T& c) { 175 Json::Value in(Json::arrayValue); 176 in.append(a); 177 in.append(b); 178 in.append(c); 179 return in; 180 } 181 } // unnamed namespace 182 183 TEST(JsonTest, ValueVectorToFromArray) { 184 std::vector<Json::Value> in = VecOf3<Json::Value>("a", "b", "c"); 185 Json::Value out = ValueVectorToJsonArray(in); 186 EXPECT_EQ(in.size(), out.size()); 187 for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { 188 EXPECT_EQ(in[i].asString(), out[i].asString()); 189 } 190 Json::Value inj = JsonVecOf3<Json::Value>("a", "b", "c"); 191 EXPECT_EQ(inj, out); 192 std::vector<Json::Value> outj; 193 EXPECT_TRUE(JsonArrayToValueVector(inj, &outj)); 194 for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { 195 EXPECT_EQ(in[i], outj[i]); 196 } 197 } 198 199 TEST(JsonTest, IntVectorToFromArray) { 200 std::vector<int> in = VecOf3<int>(1, 2, 3); 201 Json::Value out = IntVectorToJsonArray(in); 202 EXPECT_EQ(in.size(), out.size()); 203 for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { 204 EXPECT_EQ(in[i], out[i].asInt()); 205 } 206 Json::Value inj = JsonVecOf3<int>(1, 2, 3); 207 EXPECT_EQ(inj, out); 208 std::vector<int> outj; 209 EXPECT_TRUE(JsonArrayToIntVector(inj, &outj)); 210 for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { 211 EXPECT_EQ(in[i], outj[i]); 212 } 213 } 214 215 TEST(JsonTest, UIntVectorToFromArray) { 216 std::vector<unsigned int> in = VecOf3<unsigned int>(1, 2, 3); 217 Json::Value out = UIntVectorToJsonArray(in); 218 EXPECT_EQ(in.size(), out.size()); 219 for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { 220 EXPECT_EQ(in[i], out[i].asUInt()); 221 } 222 Json::Value inj = JsonVecOf3<unsigned int>(1, 2, 3); 223 EXPECT_EQ(inj, out); 224 std::vector<unsigned int> outj; 225 EXPECT_TRUE(JsonArrayToUIntVector(inj, &outj)); 226 for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { 227 EXPECT_EQ(in[i], outj[i]); 228 } 229 } 230 231 TEST(JsonTest, StringVectorToFromArray) { 232 std::vector<std::string> in = VecOf3<std::string>("a", "b", "c"); 233 Json::Value out = StringVectorToJsonArray(in); 234 EXPECT_EQ(in.size(), out.size()); 235 for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { 236 EXPECT_EQ(in[i], out[i].asString()); 237 } 238 Json::Value inj = JsonVecOf3<std::string>("a", "b", "c"); 239 EXPECT_EQ(inj, out); 240 std::vector<std::string> outj; 241 EXPECT_TRUE(JsonArrayToStringVector(inj, &outj)); 242 for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { 243 EXPECT_EQ(in[i], outj[i]); 244 } 245 } 246 247 TEST(JsonTest, BoolVectorToFromArray) { 248 std::vector<bool> in = VecOf3<bool>(false, true, false); 249 Json::Value out = BoolVectorToJsonArray(in); 250 EXPECT_EQ(in.size(), out.size()); 251 for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { 252 EXPECT_EQ(in[i], out[i].asBool()); 253 } 254 Json::Value inj = JsonVecOf3<bool>(false, true, false); 255 EXPECT_EQ(inj, out); 256 std::vector<bool> outj; 257 EXPECT_TRUE(JsonArrayToBoolVector(inj, &outj)); 258 for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { 259 EXPECT_EQ(in[i], outj[i]); 260 } 261 } 262 263 TEST(JsonTest, DoubleVectorToFromArray) { 264 std::vector<double> in = VecOf3<double>(1.0, 2.0, 3.0); 265 Json::Value out = DoubleVectorToJsonArray(in); 266 EXPECT_EQ(in.size(), out.size()); 267 for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { 268 EXPECT_EQ(in[i], out[i].asDouble()); 269 } 270 Json::Value inj = JsonVecOf3<double>(1.0, 2.0, 3.0); 271 EXPECT_EQ(inj, out); 272 std::vector<double> outj; 273 EXPECT_TRUE(JsonArrayToDoubleVector(inj, &outj)); 274 for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { 275 EXPECT_EQ(in[i], outj[i]); 276 } 277 } 278