/*
 *  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/rtc_base/json.h"

#include <vector>

#include "webrtc/rtc_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 <typename T>
std::vector<T> VecOf3(const T& a, const T& b, const T& c) {
  std::vector<T> in;
  in.push_back(a);
  in.push_back(b);
  in.push_back(c);
  return in;
}
template <typename T>
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<Json::Value> in = VecOf3<Json::Value>("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<Json::Value>("a", "b", "c");
  EXPECT_EQ(inj, out);
  std::vector<Json::Value> 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<int> in = VecOf3<int>(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<int>(1, 2, 3);
  EXPECT_EQ(inj, out);
  std::vector<int> 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<unsigned int> in = VecOf3<unsigned int>(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<unsigned int>(1, 2, 3);
  EXPECT_EQ(inj, out);
  std::vector<unsigned int> 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<std::string> in = VecOf3<std::string>("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<std::string>("a", "b", "c");
  EXPECT_EQ(inj, out);
  std::vector<std::string> 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<bool> in = VecOf3<bool>(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<bool>(false, true, false);
  EXPECT_EQ(inj, out);
  std::vector<bool> 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<double> in = VecOf3<double>(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<double>(1.0, 2.0, 3.0);
  EXPECT_EQ(inj, out);
  std::vector<double> outj;
  EXPECT_TRUE(JsonArrayToDoubleVector(inj, &outj));
  for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
    EXPECT_EQ(in[i], outj[i]);
  }
}

}  // namespace rtc
