/* * Copyright 2009 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "webrtc/base/json.h" #include #include "webrtc/base/gunit.h" namespace rtc { static Json::Value in_s("foo"); static Json::Value in_sn("99"); static Json::Value in_si("-99"); static Json::Value in_sb("true"); static Json::Value in_sd("1.2"); static Json::Value in_n(12); static Json::Value in_i(-12); static Json::Value in_u(34U); static Json::Value in_b(true); static Json::Value in_d(1.2); static Json::Value big_sn("12345678901234567890"); static Json::Value big_si("-12345678901234567890"); static Json::Value big_u(0xFFFFFFFF); static Json::Value bad_a(Json::arrayValue); static Json::Value bad_o(Json::objectValue); TEST(JsonTest, GetString) { std::string out; EXPECT_TRUE(GetStringFromJson(in_s, &out)); EXPECT_EQ("foo", out); EXPECT_TRUE(GetStringFromJson(in_sn, &out)); EXPECT_EQ("99", out); EXPECT_TRUE(GetStringFromJson(in_si, &out)); EXPECT_EQ("-99", out); EXPECT_TRUE(GetStringFromJson(in_i, &out)); EXPECT_EQ("-12", out); EXPECT_TRUE(GetStringFromJson(in_n, &out)); EXPECT_EQ("12", out); EXPECT_TRUE(GetStringFromJson(in_u, &out)); EXPECT_EQ("34", out); EXPECT_TRUE(GetStringFromJson(in_b, &out)); EXPECT_EQ("true", out); // Not supported here yet. EXPECT_FALSE(GetStringFromJson(bad_a, &out)); EXPECT_FALSE(GetStringFromJson(bad_o, &out)); } TEST(JsonTest, GetInt) { int out; EXPECT_TRUE(GetIntFromJson(in_sn, &out)); EXPECT_EQ(99, out); EXPECT_TRUE(GetIntFromJson(in_si, &out)); EXPECT_EQ(-99, out); EXPECT_TRUE(GetIntFromJson(in_n, &out)); EXPECT_EQ(12, out); EXPECT_TRUE(GetIntFromJson(in_i, &out)); EXPECT_EQ(-12, out); EXPECT_TRUE(GetIntFromJson(in_u, &out)); EXPECT_EQ(34, out); EXPECT_TRUE(GetIntFromJson(in_b, &out)); EXPECT_EQ(1, out); EXPECT_FALSE(GetIntFromJson(in_s, &out)); EXPECT_FALSE(GetIntFromJson(big_sn, &out)); EXPECT_FALSE(GetIntFromJson(big_si, &out)); EXPECT_FALSE(GetIntFromJson(big_u, &out)); EXPECT_FALSE(GetIntFromJson(bad_a, &out)); EXPECT_FALSE(GetIntFromJson(bad_o, &out)); } TEST(JsonTest, GetUInt) { unsigned int out; EXPECT_TRUE(GetUIntFromJson(in_sn, &out)); EXPECT_EQ(99U, out); EXPECT_TRUE(GetUIntFromJson(in_n, &out)); EXPECT_EQ(12U, out); EXPECT_TRUE(GetUIntFromJson(in_u, &out)); EXPECT_EQ(34U, out); EXPECT_TRUE(GetUIntFromJson(in_b, &out)); EXPECT_EQ(1U, out); EXPECT_TRUE(GetUIntFromJson(big_u, &out)); EXPECT_EQ(0xFFFFFFFFU, out); EXPECT_FALSE(GetUIntFromJson(in_s, &out)); // TODO: Fail reading negative strings. // EXPECT_FALSE(GetUIntFromJson(in_si, &out)); EXPECT_FALSE(GetUIntFromJson(in_i, &out)); EXPECT_FALSE(GetUIntFromJson(big_sn, &out)); EXPECT_FALSE(GetUIntFromJson(big_si, &out)); EXPECT_FALSE(GetUIntFromJson(bad_a, &out)); EXPECT_FALSE(GetUIntFromJson(bad_o, &out)); } TEST(JsonTest, GetBool) { bool out; EXPECT_TRUE(GetBoolFromJson(in_sb, &out)); EXPECT_EQ(true, out); EXPECT_TRUE(GetBoolFromJson(in_n, &out)); EXPECT_EQ(true, out); EXPECT_TRUE(GetBoolFromJson(in_i, &out)); EXPECT_EQ(true, out); EXPECT_TRUE(GetBoolFromJson(in_u, &out)); EXPECT_EQ(true, out); EXPECT_TRUE(GetBoolFromJson(in_b, &out)); EXPECT_EQ(true, out); EXPECT_TRUE(GetBoolFromJson(big_u, &out)); EXPECT_EQ(true, out); EXPECT_FALSE(GetBoolFromJson(in_s, &out)); EXPECT_FALSE(GetBoolFromJson(in_sn, &out)); EXPECT_FALSE(GetBoolFromJson(in_si, &out)); EXPECT_FALSE(GetBoolFromJson(big_sn, &out)); EXPECT_FALSE(GetBoolFromJson(big_si, &out)); EXPECT_FALSE(GetBoolFromJson(bad_a, &out)); EXPECT_FALSE(GetBoolFromJson(bad_o, &out)); } TEST(JsonTest, GetDouble) { double out; EXPECT_TRUE(GetDoubleFromJson(in_sn, &out)); EXPECT_EQ(99, out); EXPECT_TRUE(GetDoubleFromJson(in_si, &out)); EXPECT_EQ(-99, out); EXPECT_TRUE(GetDoubleFromJson(in_sd, &out)); EXPECT_EQ(1.2, out); EXPECT_TRUE(GetDoubleFromJson(in_n, &out)); EXPECT_EQ(12, out); EXPECT_TRUE(GetDoubleFromJson(in_i, &out)); EXPECT_EQ(-12, out); EXPECT_TRUE(GetDoubleFromJson(in_u, &out)); EXPECT_EQ(34, out); EXPECT_TRUE(GetDoubleFromJson(in_b, &out)); EXPECT_EQ(1, out); EXPECT_TRUE(GetDoubleFromJson(in_d, &out)); EXPECT_EQ(1.2, out); EXPECT_FALSE(GetDoubleFromJson(in_s, &out)); } TEST(JsonTest, GetFromArray) { Json::Value a, out; a.append(in_s); a.append(in_i); a.append(in_u); a.append(in_b); EXPECT_TRUE(GetValueFromJsonArray(a, 0, &out)); EXPECT_TRUE(GetValueFromJsonArray(a, 3, &out)); EXPECT_FALSE(GetValueFromJsonArray(a, 99, &out)); EXPECT_FALSE(GetValueFromJsonArray(a, 0xFFFFFFFF, &out)); } TEST(JsonTest, GetFromObject) { Json::Value o, out; o["string"] = in_s; o["int"] = in_i; o["uint"] = in_u; o["bool"] = in_b; EXPECT_TRUE(GetValueFromJsonObject(o, "int", &out)); EXPECT_TRUE(GetValueFromJsonObject(o, "bool", &out)); EXPECT_FALSE(GetValueFromJsonObject(o, "foo", &out)); EXPECT_FALSE(GetValueFromJsonObject(o, "", &out)); } namespace { template std::vector VecOf3(const T& a, const T& b, const T& c) { std::vector in; in.push_back(a); in.push_back(b); in.push_back(c); return in; } template Json::Value JsonVecOf3(const T& a, const T& b, const T& c) { Json::Value in(Json::arrayValue); in.append(a); in.append(b); in.append(c); return in; } } // unnamed namespace TEST(JsonTest, ValueVectorToFromArray) { std::vector in = VecOf3("a", "b", "c"); Json::Value out = ValueVectorToJsonArray(in); EXPECT_EQ(in.size(), out.size()); for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { EXPECT_EQ(in[i].asString(), out[i].asString()); } Json::Value inj = JsonVecOf3("a", "b", "c"); EXPECT_EQ(inj, out); std::vector outj; EXPECT_TRUE(JsonArrayToValueVector(inj, &outj)); for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { EXPECT_EQ(in[i], outj[i]); } } TEST(JsonTest, IntVectorToFromArray) { std::vector in = VecOf3(1, 2, 3); Json::Value out = IntVectorToJsonArray(in); EXPECT_EQ(in.size(), out.size()); for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { EXPECT_EQ(in[i], out[i].asInt()); } Json::Value inj = JsonVecOf3(1, 2, 3); EXPECT_EQ(inj, out); std::vector outj; EXPECT_TRUE(JsonArrayToIntVector(inj, &outj)); for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { EXPECT_EQ(in[i], outj[i]); } } TEST(JsonTest, UIntVectorToFromArray) { std::vector in = VecOf3(1, 2, 3); Json::Value out = UIntVectorToJsonArray(in); EXPECT_EQ(in.size(), out.size()); for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { EXPECT_EQ(in[i], out[i].asUInt()); } Json::Value inj = JsonVecOf3(1, 2, 3); EXPECT_EQ(inj, out); std::vector outj; EXPECT_TRUE(JsonArrayToUIntVector(inj, &outj)); for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { EXPECT_EQ(in[i], outj[i]); } } TEST(JsonTest, StringVectorToFromArray) { std::vector in = VecOf3("a", "b", "c"); Json::Value out = StringVectorToJsonArray(in); EXPECT_EQ(in.size(), out.size()); for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { EXPECT_EQ(in[i], out[i].asString()); } Json::Value inj = JsonVecOf3("a", "b", "c"); EXPECT_EQ(inj, out); std::vector outj; EXPECT_TRUE(JsonArrayToStringVector(inj, &outj)); for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { EXPECT_EQ(in[i], outj[i]); } } TEST(JsonTest, BoolVectorToFromArray) { std::vector in = VecOf3(false, true, false); Json::Value out = BoolVectorToJsonArray(in); EXPECT_EQ(in.size(), out.size()); for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { EXPECT_EQ(in[i], out[i].asBool()); } Json::Value inj = JsonVecOf3(false, true, false); EXPECT_EQ(inj, out); std::vector outj; EXPECT_TRUE(JsonArrayToBoolVector(inj, &outj)); for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { EXPECT_EQ(in[i], outj[i]); } } TEST(JsonTest, DoubleVectorToFromArray) { std::vector in = VecOf3(1.0, 2.0, 3.0); Json::Value out = DoubleVectorToJsonArray(in); EXPECT_EQ(in.size(), out.size()); for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) { EXPECT_EQ(in[i], out[i].asDouble()); } Json::Value inj = JsonVecOf3(1.0, 2.0, 3.0); EXPECT_EQ(inj, out); std::vector outj; EXPECT_TRUE(JsonArrayToDoubleVector(inj, &outj)); for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) { EXPECT_EQ(in[i], outj[i]); } } } // namespace rtc