* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <fstream>
#include "gtest/gtest.h"
#include "JsonReader.h"
namespace {
std::string g_name = "jin";
bool g_isChild = true;
int32_t g_age = 13;
uint32_t g_code1 = 214748;
int64_t g_code2 = 3333333333;
double g_height = 165.3;
std::string g_schoolName = "abc";
std::string g_schoolAddr = "cba";
std::string g_newName = "li";
bool g_newIsChild = false;
int32_t g_newAge = 26;
uint32_t g_newCode1 = 2147489;
int64_t g_newCode2 = 3333333339;
double g_newHeight = 185.3;
std::string g_obj = R"({"name":"jin","isChild":true,"age":13,"code1":214748,"code2":3333333333,
"height":165.3,"school":{"schoolName":"abc","schoolAddr":"cba"}})";
std::string g_arr = "[\"jin\",true,13,214748,3333333333,165.3,{\"schoolName\":\"abc\",\"schoolAddr\":\"cba\"}]";
TEST(JsonReaderTest, ParseJsonData2Test)
{
int age = 20;
std::string str = "{\"name\":\"jin\", \"age\":20}";
Json2::Value val = JsonReader::ParseJsonData2(str);
EXPECT_EQ(val["name"].AsString(), "jin");
EXPECT_EQ(val["age"].AsInt(), age);
}
TEST(JsonReaderTest, CreateObjectTest)
{
Json2::Value school = JsonReader::CreateObject();
school.Add("schoolName", g_schoolName.c_str());
school.Add("schoolAddr", g_schoolAddr.c_str());
Json2::Value student = JsonReader::CreateObject();
student.Add("name", g_name.c_str());
EXPECT_EQ(student["name"].AsString(), g_name);
student.Add("isChild", g_isChild);
EXPECT_EQ(student["isChild"].AsBool(), g_isChild);
student.Add("age", g_age);
EXPECT_EQ(student["age"].AsInt(), g_age);
student.Add("code1", g_code1);
EXPECT_EQ(student["code1"].AsUInt(), g_code1);
student.Add("code2", g_code2);
EXPECT_EQ(student["code2"].AsInt64(), g_code2);
student.Add("height", g_height);
EXPECT_EQ(student["height"].AsDouble(), g_height);
student.Add("school", school);
EXPECT_EQ(student["school"]["schoolName"].AsString(), g_schoolName);
EXPECT_EQ(student["school"]["schoolAddr"].AsString(), g_schoolAddr);
}
TEST(JsonReaderTest, CreateArrayTest)
{
Json2::Value school = JsonReader::CreateObject();
school.Add("schoolName", g_schoolName.c_str());
school.Add("schoolAddr", g_schoolAddr.c_str());
Json2::Value books = JsonReader::CreateArray();
books.Add(g_name.c_str());
books.Add(g_isChild);
books.Add(g_age);
books.Add(g_code1);
books.Add(g_code2);
books.Add(g_height);
books.Add(school);
int size = 7;
int actualSize = books.GetArraySize();
EXPECT_EQ(actualSize, size);
int index = 0;
EXPECT_EQ(books.GetArrayItem(index++).AsString(), g_name);
EXPECT_EQ(books.GetArrayItem(index++).AsBool(), g_isChild);
EXPECT_EQ(books.GetArrayItem(index++).AsInt(), g_age);
EXPECT_EQ(books.GetArrayItem(index++).AsUInt(), g_code1);
EXPECT_EQ(books.GetArrayItem(index++).AsInt64(), g_code2);
EXPECT_EQ(books.GetArrayItem(index++).AsDouble(), g_height);
EXPECT_EQ(books.GetArrayItem(index)["schoolName"].AsString(), g_schoolName);
EXPECT_EQ(books.GetArrayItem(index)["schoolAddr"].AsString(), g_schoolAddr);
}
TEST(JsonReaderTest, CreateBoolTest)
{
Json2::Value resultJson = JsonReader::CreateObject();
resultJson.Add("result", JsonReader::CreateBool(true));
EXPECT_TRUE(resultJson["result"].AsBool());
}
TEST(JsonReaderTest, CreateStringTest)
{
std::string content = "content";
Json2::Value resultJson = JsonReader::CreateObject();
resultJson.Add("content", JsonReader::CreateString(content));
EXPECT_EQ(resultJson["content"].AsString(), content);
}
TEST(JsonReaderTest, DepthCopyTest)
{
std::string content = "content";
Json2::Value resultJson = JsonReader::CreateObject();
resultJson.Add("content", JsonReader::CreateString(content));
Json2::Value newJson = JsonReader::DepthCopy(resultJson);
resultJson.Clear();
EXPECT_EQ(newJson["content"].AsString(), content);
}
TEST(JsonReaderTest, ObjectReplaceTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
objVal.Replace("name", g_newName.c_str());
EXPECT_EQ(objVal["name"].AsString(), g_newName);
objVal.Replace("isChild", g_newIsChild);
EXPECT_EQ(objVal["isChild"].AsBool(), g_newIsChild);
objVal.Replace("age", g_newAge);
EXPECT_EQ(objVal["age"].AsInt(), g_newAge);
objVal.Replace("code1", g_newCode1);
EXPECT_EQ(objVal["code1"].AsUInt(), g_newCode1);
objVal.Replace("code2", g_newCode2);
EXPECT_EQ(objVal["code2"].AsInt64(), g_newCode2);
objVal.Replace("height", g_newHeight);
EXPECT_EQ(objVal["height"].AsDouble(), g_newHeight);
std::string content = "content";
Json2::Value resultJson = JsonReader::CreateObject();
resultJson.Add("content", JsonReader::CreateString(content));
objVal.Replace("school", resultJson);
EXPECT_EQ(objVal["school"]["content"].AsString(), content);
}
TEST(JsonReaderTest, ArrayReplaceTest)
{
Json2::Value arrVal = JsonReader::ParseJsonData2(g_arr);
int index = 0;
arrVal.Replace(index, g_newName.c_str());
EXPECT_EQ(arrVal.GetArrayItem(index++).AsString(), g_newName);
arrVal.Replace(index, g_newIsChild);
EXPECT_EQ(arrVal.GetArrayItem(index++).AsBool(), g_newIsChild);
arrVal.Replace(index, g_newAge);
EXPECT_EQ(arrVal.GetArrayItem(index++).AsInt(), g_newAge);
arrVal.Replace(index, g_newCode1);
EXPECT_EQ(arrVal.GetArrayItem(index++).AsUInt(), g_newCode1);
arrVal.Replace(index, g_newCode2);
EXPECT_EQ(arrVal.GetArrayItem(index++).AsInt64(), g_newCode2);
arrVal.Replace(index, g_newHeight);
EXPECT_EQ(arrVal.GetArrayItem(index++).AsDouble(), g_newHeight);
std::string content = "content";
Json2::Value resultJson = JsonReader::CreateObject();
resultJson.Add("content", JsonReader::CreateString(content));
arrVal.Replace(index, resultJson);
EXPECT_EQ(arrVal.GetArrayItem(index)["content"].AsString(), content);
}
TEST(JsonReaderTest, IsValueTest)
{
Json2::Value arrVal = JsonReader::ParseJsonData2(g_arr);
EXPECT_TRUE(arrVal.IsArray());
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
EXPECT_FALSE(objVal.IsNull());
EXPECT_TRUE(objVal.IsMember("school"));
EXPECT_TRUE(objVal["name"].IsString());
EXPECT_TRUE(objVal["age"].IsNumber());
EXPECT_TRUE(objVal["age"].IsInt());
EXPECT_TRUE(objVal["code1"].IsUInt());
EXPECT_TRUE(objVal["code2"].IsUInt64());
EXPECT_TRUE(objVal["isChild"].IsBool());
EXPECT_TRUE(objVal["height"].IsDouble());
}
TEST(JsonReaderTest, GetValueTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
EXPECT_EQ(objVal.GetString("name"), g_name);
EXPECT_EQ(objVal.GetBool("isChild"), g_isChild);
EXPECT_EQ(objVal.GetInt("age"), g_age);
EXPECT_EQ(objVal.GetUInt("code1"), g_code1);
EXPECT_EQ(objVal.GetInt64("code2"), g_code2);
EXPECT_EQ(objVal.GetFloat("height"), (float)g_height);
EXPECT_EQ(objVal.GetDouble("height"), g_height);
EXPECT_EQ(objVal.GetDouble("height1", 0.0), 0.0);
EXPECT_EQ(objVal.GetValue("school").GetString("schoolName"), g_schoolName);
EXPECT_EQ(objVal.GetValue("school").GetString("schoolAddr"), g_schoolAddr);
}
TEST(JsonReaderTest, OperatorBracketCharPtrTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
const char* key = "name";
Json2::Value name = objVal[key];
std::string value = name.AsString();
EXPECT_EQ(value, g_name);
const char* key2 = "name22";
Json2::Value name2 = objVal[key2];
std::string value2 = name2.AsString();
EXPECT_EQ(value2, "");
}
TEST(JsonReaderTest, OperatorBracketConstCharPtrTest)
{
const Json2::Value objVal = static_cast<const Json2::Value>(JsonReader::ParseJsonData2(g_obj));
const char* key = "name";
const Json2::Value name = objVal[key];
std::string value = name.AsString();
EXPECT_EQ(value, g_name);
const char* key2 = "name22";
Json2::Value name2 = objVal[key2];
std::string value2 = name2.AsString();
EXPECT_EQ(value2, "");
}
TEST(ValueTest, OperatorBracketStdStringTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key = "name";
Json2::Value name = objVal[key];
std::string value = name.AsString();
EXPECT_EQ(value, g_name);
std::string key2 = "name22";
Json2::Value name2 = objVal[key2];
std::string value2 = name2.AsString();
EXPECT_EQ(value2, "");
}
TEST(ValueTest, OperatorBracketConstStdStringTest)
{
const Json2::Value objVal = static_cast<const Json2::Value>(JsonReader::ParseJsonData2(g_obj));
std::string key = "name";
const Json2::Value name = objVal[key];
std::string value = name.AsString();
EXPECT_EQ(value, g_name);
std::string key2 = "name22";
Json2::Value name2 = objVal[key2];
std::string value2 = name2.AsString();
EXPECT_EQ(value2, "");
}
TEST(ValueTest, GetMemberNamesTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
Json2::Value::Members members = objVal.GetMemberNames();
int size = 7;
int memberSize = members.size();
EXPECT_EQ(memberSize, size);
}
TEST(ValueTest, ToStringTest_NoJsonPtr)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key2 = "name22";
Json2::Value name2 = objVal[key2];
std::string str = name2.ToString();
EXPECT_TRUE(str.empty());
}
TEST(ValueTest, ToStyledStringTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key1 = "name22";
Json2::Value name1= objVal[key1];
std::string str1 = name1.ToStyledString();
EXPECT_TRUE(str1.empty());
std::string key2 = "name";
Json2::Value name2= objVal[key2];
std::string str2 = name2.ToStyledString();
EXPECT_FALSE(str2.empty());
}
TEST(ValueTest, IsIntTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key1 = "name";
Json2::Value name = objVal[key1];
EXPECT_FALSE(name.IsInt());
std::string key2 = "age";
Json2::Value age = objVal[key2];
EXPECT_TRUE(age.IsInt());
}
TEST(ValueTest, IsUIntTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key1 = "name";
Json2::Value name = objVal[key1];
EXPECT_FALSE(name.IsUInt());
std::string key2 = "age";
Json2::Value age = objVal[key2];
EXPECT_TRUE(age.IsUInt());
}
TEST(ValueTest, IsInt64Test)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key1 = "name";
Json2::Value name = objVal[key1];
EXPECT_FALSE(name.IsInt64());
std::string key2 = "age";
Json2::Value age = objVal[key2];
EXPECT_TRUE(age.IsInt64());
}
TEST(ValueTest, IsUInt64Test)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key1 = "name";
Json2::Value name = objVal[key1];
EXPECT_FALSE(name.IsUInt64());
std::string key2 = "age";
Json2::Value age = objVal[key2];
EXPECT_TRUE(age.IsUInt64());
}
TEST(ValueTest, IsDoubleTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key1 = "name";
Json2::Value name = objVal[key1];
EXPECT_FALSE(name.IsDouble());
std::string key2 = "age";
Json2::Value age = objVal[key2];
EXPECT_TRUE(age.IsDouble());
}
TEST(ValueTest, IsObjectTest)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string key = "school";
Json2::Value school = objVal[key];
EXPECT_TRUE(school.IsObject());
}
TEST(ValueTest, GetBoolTest_TypeErr)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
bool ret = objVal.GetBool("name");
EXPECT_FALSE(ret);
}
TEST(ValueTest, GetStringTest_TypeErr)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
std::string ret = objVal.GetString("age");
EXPECT_EQ(ret, "");
}
TEST(ValueTest, AsFolatTest_TypeErr)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
Json2::Value height = objVal.GetValue("height");
float val = height.AsFloat();
float expectVal = 165.3;
EXPECT_EQ(val, expectVal);
}
TEST(ValueTest, AsDoubleTest_TypeErr)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
Json2::Value name = objVal.GetValue("name");
double val = name.AsDouble();
float expectVal = 0.0;
EXPECT_EQ(val, expectVal);
}
TEST(ValueTest, AsBoolTest_TypeErr)
{
Json2::Value objVal = JsonReader::ParseJsonData2(g_obj);
Json2::Value name = objVal.GetValue("name");
bool val = name.AsBool();
EXPECT_FALSE(val);
}
TEST(JsonReaderTest, CreateNullTest)
{
Json2::Value value = JsonReader::CreateNull();
EXPECT_TRUE(value.IsNull());
}
TEST(JsonReaderTest, GetKeyTest)
{
Json2::Value jsonData1 = JsonReader::ParseJsonData2(g_obj);
Json2::Value height = jsonData1.GetValue("height");
std::string str = height.GetKey();
EXPECT_EQ(str, "height");
}
TEST(JsonReaderTest, ReadFileTest)
{
std::string path = "1.json";
std::ofstream file(path);
if (!file) {
printf("Error creating file: %s\r\n", path.c_str());
EXPECT_TRUE(false);
} else {
file << g_obj;
file.close();
std::string readStr = JsonReader::ReadFile(path);
EXPECT_EQ(readStr, g_obj);
}
}
TEST(JsonReaderTest, GetErrorPtrTest)
{
Json2::Value jsonData = JsonReader::ParseJsonData2(g_obj);
std::string errors = JsonReader::GetErrorPtr();
EXPECT_FALSE(jsonData.IsNull());
EXPECT_TRUE(errors.empty());
}
TEST(JsonReaderTest, AddTest_Err)
{
Json2::Value jsonData = JsonReader::ParseJsonData2(g_obj);
const char* key = nullptr;
bool ret = jsonData.Add(key, "aaa");
EXPECT_FALSE(ret);
ret = jsonData.Add(key, false);
EXPECT_FALSE(ret);
double d = 22.0;
ret = jsonData.Add(key, d);
EXPECT_FALSE(ret);
std::string str = "{\"name\":\"jin\", \"age\":20}";
Json2::Value val = JsonReader::ParseJsonData2(str);
ret = jsonData.Add(key, val);
EXPECT_FALSE(ret);
}
TEST(JsonReaderTest, AddTest_ArrayErr)
{
Json2::Value jsonData = JsonReader::ParseJsonData2(g_obj);
bool ret = jsonData.Add("aaa");
EXPECT_FALSE(ret);
ret = jsonData.Add(false);
EXPECT_FALSE(ret);
double d = 436.96;
ret = jsonData.Add(d);
EXPECT_FALSE(ret);
Json2::Value val = JsonReader::CreateNull();
ret = jsonData.Add(val);
EXPECT_FALSE(ret);
}
TEST(JsonReaderTest, ReplaceTest_Err)
{
Json2::Value jsonData = JsonReader::ParseJsonData2(g_obj);
const char* key = nullptr;
bool ret = jsonData.Replace(key, "aaa");
EXPECT_FALSE(ret);
ret = jsonData.Replace(key, false);
EXPECT_FALSE(ret);
double d = 22.0;
ret = jsonData.Replace(key, d);
EXPECT_FALSE(ret);
std::string str = "{\"name\":\"jin\", \"age\":20}";
Json2::Value val = JsonReader::ParseJsonData2(str);
ret = jsonData.Replace(key, val);
EXPECT_FALSE(ret);
}
TEST(JsonReaderTest, ReplaceTest_ArrayErr)
{
Json2::Value jsonData = JsonReader::ParseJsonData2(g_obj);
const char* key = nullptr;
int invalidIndex = -1;
bool ret = jsonData.Replace(invalidIndex, "aaa");
EXPECT_FALSE(ret);
ret = jsonData.Replace(invalidIndex, false);
EXPECT_FALSE(ret);
double d = 22.0;
ret = jsonData.Replace(invalidIndex, d);
EXPECT_FALSE(ret);
std::string str = "{\"name\":\"jin\", \"age\":20}";
Json2::Value val = JsonReader::ParseJsonData2(str);
ret = jsonData.Replace(invalidIndex, val);
EXPECT_FALSE(ret);
}
}