1e509ee18Sopenharmony_ci/*
2e509ee18Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License.
5e509ee18Sopenharmony_ci * You may obtain a copy of the License at
6e509ee18Sopenharmony_ci *
7e509ee18Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e509ee18Sopenharmony_ci *
9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and
13e509ee18Sopenharmony_ci * limitations under the License.
14e509ee18Sopenharmony_ci */
15e509ee18Sopenharmony_ci
16e509ee18Sopenharmony_ci#include "ecmascript/tests/test_helper.h"
17e509ee18Sopenharmony_ci#include "tooling/base/pt_json.h"
18e509ee18Sopenharmony_ci
19e509ee18Sopenharmony_ciusing namespace panda::ecmascript::tooling;
20e509ee18Sopenharmony_ci
21e509ee18Sopenharmony_cinamespace panda::test {
22e509ee18Sopenharmony_ciclass PtJsonTest : public testing::Test {
23e509ee18Sopenharmony_cipublic:
24e509ee18Sopenharmony_ci    static void SetUpTestCase()
25e509ee18Sopenharmony_ci    {
26e509ee18Sopenharmony_ci        GTEST_LOG_(INFO) << "SetUpTestCase";
27e509ee18Sopenharmony_ci    }
28e509ee18Sopenharmony_ci
29e509ee18Sopenharmony_ci    static void TearDownTestCase()
30e509ee18Sopenharmony_ci    {
31e509ee18Sopenharmony_ci        GTEST_LOG_(INFO) << "TearDownCase";
32e509ee18Sopenharmony_ci    }
33e509ee18Sopenharmony_ci
34e509ee18Sopenharmony_ci    void SetUp() override
35e509ee18Sopenharmony_ci    {
36e509ee18Sopenharmony_ci    }
37e509ee18Sopenharmony_ci
38e509ee18Sopenharmony_ci    void TearDown() override
39e509ee18Sopenharmony_ci    {
40e509ee18Sopenharmony_ci    }
41e509ee18Sopenharmony_ci};
42e509ee18Sopenharmony_ci
43e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, FalseTest)
44e509ee18Sopenharmony_ci{
45e509ee18Sopenharmony_ci    std::string str = "false";
46e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
47e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsBool());
48e509ee18Sopenharmony_ci    EXPECT_FALSE(json->GetBool());
49e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
50e509ee18Sopenharmony_ci    json->ReleaseRoot();
51e509ee18Sopenharmony_ci}
52e509ee18Sopenharmony_ci
53e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, TrueTest)
54e509ee18Sopenharmony_ci{
55e509ee18Sopenharmony_ci    std::string str = "true";
56e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
57e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsBool());
58e509ee18Sopenharmony_ci    EXPECT_TRUE(json->GetBool());
59e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
60e509ee18Sopenharmony_ci    json->ReleaseRoot();
61e509ee18Sopenharmony_ci}
62e509ee18Sopenharmony_ci
63e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, IntTest)
64e509ee18Sopenharmony_ci{
65e509ee18Sopenharmony_ci    std::string str = "100";
66e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
67e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsNumber());
68e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetInt(), 100);
69e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
70e509ee18Sopenharmony_ci    json->ReleaseRoot();
71e509ee18Sopenharmony_ci}
72e509ee18Sopenharmony_ci
73e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, Int64Test)
74e509ee18Sopenharmony_ci{
75e509ee18Sopenharmony_ci    std::string str = "123456789012345";
76e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
77e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsNumber());
78e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetInt64(), 123456789012345);
79e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
80e509ee18Sopenharmony_ci    json->ReleaseRoot();
81e509ee18Sopenharmony_ci}
82e509ee18Sopenharmony_ci
83e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, DoubleTest)
84e509ee18Sopenharmony_ci{
85e509ee18Sopenharmony_ci    std::string str = "12345.6789";
86e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
87e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsNumber());
88e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetDouble(), 12345.6789);
89e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
90e509ee18Sopenharmony_ci    json->ReleaseRoot();
91e509ee18Sopenharmony_ci}
92e509ee18Sopenharmony_ci
93e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, StringTest)
94e509ee18Sopenharmony_ci{
95e509ee18Sopenharmony_ci    std::string str = "\"abcdefg\"";
96e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
97e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsString());
98e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetString(), "abcdefg");
99e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
100e509ee18Sopenharmony_ci    json->ReleaseRoot();
101e509ee18Sopenharmony_ci}
102e509ee18Sopenharmony_ci
103e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, ArrayTest1)
104e509ee18Sopenharmony_ci{
105e509ee18Sopenharmony_ci    std::string str = "[\"a\",\"b\",200]";
106e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
107e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsArray());
108e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetSize(), 3);
109e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(0)->GetString(), "a");
110e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(1)->GetString(), "b");
111e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(2)->GetInt(), 200);
112e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
113e509ee18Sopenharmony_ci    json->ReleaseRoot();
114e509ee18Sopenharmony_ci}
115e509ee18Sopenharmony_ci
116e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, ArrayTest2)
117e509ee18Sopenharmony_ci{
118e509ee18Sopenharmony_ci    std::string str = "[\"a\",\"b\",200,10.5,{}]";
119e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
120e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsArray());
121e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetSize(), 5);
122e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(0)->GetString(), "a");
123e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(1)->GetString(), "b");
124e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(2)->GetInt(), 200);
125e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(3)->GetDouble(), 10.5);
126e509ee18Sopenharmony_ci    EXPECT_TRUE(json->Get(4)->IsObject());
127e509ee18Sopenharmony_ci    EXPECT_EQ(json->Stringify(), str);
128e509ee18Sopenharmony_ci    json->ReleaseRoot();
129e509ee18Sopenharmony_ci}
130e509ee18Sopenharmony_ci
131e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, ObjectTest)
132e509ee18Sopenharmony_ci{
133e509ee18Sopenharmony_ci    auto child1 = PtJson::CreateObject();
134e509ee18Sopenharmony_ci    child1->Add("ch", "child_1");
135e509ee18Sopenharmony_ci    ASSERT_TRUE(child1->Contains("ch"));
136e509ee18Sopenharmony_ci
137e509ee18Sopenharmony_ci    auto child2 = PtJson::CreateObject();
138e509ee18Sopenharmony_ci    child2->Add("ch", "child_2");
139e509ee18Sopenharmony_ci    ASSERT_TRUE(child2->Contains("ch"));
140e509ee18Sopenharmony_ci
141e509ee18Sopenharmony_ci    auto arr = PtJson::CreateArray();
142e509ee18Sopenharmony_ci    arr->Push(100);
143e509ee18Sopenharmony_ci    EXPECT_EQ(arr->GetSize(), 1);
144e509ee18Sopenharmony_ci
145e509ee18Sopenharmony_ci    auto root = PtJson::CreateObject();
146e509ee18Sopenharmony_ci    root->Add("a", false);
147e509ee18Sopenharmony_ci    root->Add("b", 100);
148e509ee18Sopenharmony_ci    root->Add("c", 100.2);
149e509ee18Sopenharmony_ci    root->Add("d", static_cast<int64_t>(200));
150e509ee18Sopenharmony_ci    root->Add("e", "abc");
151e509ee18Sopenharmony_ci    root->Add("f", child2);
152e509ee18Sopenharmony_ci    root->Add("g", arr);
153e509ee18Sopenharmony_ci
154e509ee18Sopenharmony_ci    bool b;
155e509ee18Sopenharmony_ci    int32_t i32;
156e509ee18Sopenharmony_ci    int64_t i64;
157e509ee18Sopenharmony_ci    double d;
158e509ee18Sopenharmony_ci    std::string str;
159e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json;
160e509ee18Sopenharmony_ci    ASSERT_EQ(root->GetBool("a", &b), Result::SUCCESS);
161e509ee18Sopenharmony_ci    EXPECT_FALSE(b);
162e509ee18Sopenharmony_ci    ASSERT_EQ(root->GetInt("b", &i32), Result::SUCCESS);
163e509ee18Sopenharmony_ci    EXPECT_EQ(i32, 100);
164e509ee18Sopenharmony_ci    ASSERT_EQ(root->GetDouble("c", &d), Result::SUCCESS);
165e509ee18Sopenharmony_ci    EXPECT_EQ(d, 100.2);
166e509ee18Sopenharmony_ci    ASSERT_EQ(root->GetInt64("d", &i64), Result::SUCCESS);
167e509ee18Sopenharmony_ci    EXPECT_EQ(i64, static_cast<int64_t>(200));
168e509ee18Sopenharmony_ci    ASSERT_EQ(root->GetString("e", &str), Result::SUCCESS);
169e509ee18Sopenharmony_ci    EXPECT_EQ(str, "abc");
170e509ee18Sopenharmony_ci    ASSERT_EQ(root->GetObject("f", &json), Result::SUCCESS);
171e509ee18Sopenharmony_ci    ASSERT_EQ(json->GetString("ch", &str), Result::SUCCESS);
172e509ee18Sopenharmony_ci    EXPECT_EQ(str, "child_2");
173e509ee18Sopenharmony_ci    ASSERT_EQ(root->GetArray("g", &json), Result::SUCCESS);
174e509ee18Sopenharmony_ci    ASSERT_TRUE(json->IsArray());
175e509ee18Sopenharmony_ci    EXPECT_EQ(json->Get(0)->GetInt(), 100);
176e509ee18Sopenharmony_ci
177e509ee18Sopenharmony_ci    EXPECT_EQ(root->Stringify(),
178e509ee18Sopenharmony_ci        "{\"a\":false,\"b\":100,\"c\":100.2,\"d\":200,\"e\":\"abc\",\"f\":{\"ch\":\"child_2\"},\"g\":[100]}");
179e509ee18Sopenharmony_ci    root->ReleaseRoot();
180e509ee18Sopenharmony_ci}
181e509ee18Sopenharmony_ci
182e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, StringifyTest)
183e509ee18Sopenharmony_ci{
184e509ee18Sopenharmony_ci    PtJson ptJson;
185e509ee18Sopenharmony_ci    std::string result = ptJson.Stringify();
186e509ee18Sopenharmony_ci    ASSERT_EQ(result, "");
187e509ee18Sopenharmony_ci}
188e509ee18Sopenharmony_ci
189e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, GetKeyTest)
190e509ee18Sopenharmony_ci{
191e509ee18Sopenharmony_ci    PtJson ptJson;
192e509ee18Sopenharmony_ci    std::string result = ptJson.GetKey();
193e509ee18Sopenharmony_ci    ASSERT_EQ(result, "");
194e509ee18Sopenharmony_ci    cJSON temp;
195e509ee18Sopenharmony_ci    char test[] = "test";
196e509ee18Sopenharmony_ci    temp.string = test;
197e509ee18Sopenharmony_ci    PtJson ptJson1(&temp);
198e509ee18Sopenharmony_ci    result = ptJson1.GetKey();
199e509ee18Sopenharmony_ci    ASSERT_EQ(result, "test");
200e509ee18Sopenharmony_ci    cJSON temp1;
201e509ee18Sopenharmony_ci    temp1.string = nullptr;
202e509ee18Sopenharmony_ci    PtJson ptJson2(&temp1);
203e509ee18Sopenharmony_ci    result = ptJson2.GetKey();
204e509ee18Sopenharmony_ci    ASSERT_EQ(result, "");
205e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> ptr = std::make_unique<PtJson>();
206e509ee18Sopenharmony_ci    Result result1 = ptJson.GetAny(test, &ptr);
207e509ee18Sopenharmony_ci    ASSERT_EQ(result1, Result::NOT_EXIST);
208e509ee18Sopenharmony_ci    cJSON json;
209e509ee18Sopenharmony_ci    cJSON son;
210e509ee18Sopenharmony_ci    son.string = test;
211e509ee18Sopenharmony_ci    json.string = test;
212e509ee18Sopenharmony_ci    json.child = &son;
213e509ee18Sopenharmony_ci    PtJson ptJson3(&json);
214e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> ptr1 = std::make_unique<PtJson>();
215e509ee18Sopenharmony_ci    result1 = ptJson3.GetAny(test, &ptr1);
216e509ee18Sopenharmony_ci    ASSERT_EQ(result1, Result::SUCCESS);
217e509ee18Sopenharmony_ci}
218e509ee18Sopenharmony_ci
219e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, GetTypeTest)
220e509ee18Sopenharmony_ci{
221e509ee18Sopenharmony_ci    cJSON *node = cJSON_CreateNumber(0);
222e509ee18Sopenharmony_ci    PtJson num(node);
223e509ee18Sopenharmony_ci    cJSON *node1 = cJSON_CreateString("test");
224e509ee18Sopenharmony_ci    PtJson str(node1);
225e509ee18Sopenharmony_ci    bool result = str.GetBool(false);
226e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
227e509ee18Sopenharmony_ci    int32_t result1 = str.GetInt(int32_t(0));
228e509ee18Sopenharmony_ci    ASSERT_EQ(result1, 0);
229e509ee18Sopenharmony_ci    int64_t result2 = str.GetInt64(int64_t(0));
230e509ee18Sopenharmony_ci    ASSERT_EQ(result2, 0);
231e509ee18Sopenharmony_ci    double result3 = str.GetDouble(0.1); // 0.1:num
232e509ee18Sopenharmony_ci    ASSERT_EQ(result3, 0.1); // 0.1:num
233e509ee18Sopenharmony_ci    std::string result4 = num.GetString();
234e509ee18Sopenharmony_ci    ASSERT_EQ(result4, "");
235e509ee18Sopenharmony_ci}
236e509ee18Sopenharmony_ci
237e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, PushTest)
238e509ee18Sopenharmony_ci{
239e509ee18Sopenharmony_ci    char *ptr = nullptr;
240e509ee18Sopenharmony_ci    PtJson ptJson;
241e509ee18Sopenharmony_ci    bool result = ptJson.Push(ptr);
242e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
243e509ee18Sopenharmony_ci    char cPtr[] = "value";
244e509ee18Sopenharmony_ci    result = ptJson.Push(cPtr);
245e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
246e509ee18Sopenharmony_ci    bool value = true;
247e509ee18Sopenharmony_ci    result = ptJson.Push(value);
248e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
249e509ee18Sopenharmony_ci    double value1 = 0.1; // 0.1:value
250e509ee18Sopenharmony_ci    result = ptJson.Push(value1);
251e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
252e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> ptr1;
253e509ee18Sopenharmony_ci    result = ptJson.Push(std::move(ptr1));
254e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
255e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> ptr2 = std::make_unique<PtJson>();
256e509ee18Sopenharmony_ci    result = ptJson.Push(std::move(ptr2));
257e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
258e509ee18Sopenharmony_ci    cJSON json;
259e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> ptr3 = std::make_unique<PtJson>(&json);
260e509ee18Sopenharmony_ci    result = ptJson.Push(std::move(ptr3));
261e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
262e509ee18Sopenharmony_ci}
263e509ee18Sopenharmony_ci
264e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, AddTest)
265e509ee18Sopenharmony_ci{
266e509ee18Sopenharmony_ci    char key[] = "key";
267e509ee18Sopenharmony_ci    double value = 0.1; // 0.1:value
268e509ee18Sopenharmony_ci    PtJson ptJson;
269e509ee18Sopenharmony_ci    bool result = ptJson.Add(key, value);
270e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
271e509ee18Sopenharmony_ci    char value1[] = "value";
272e509ee18Sopenharmony_ci    result = ptJson.Add(key, value1);
273e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
274e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> ptr = std::make_unique<PtJson>();
275e509ee18Sopenharmony_ci    result = ptJson.Add(key, std::move(ptr));
276e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
277e509ee18Sopenharmony_ci    cJSON json;
278e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> ptr1 = std::make_unique<PtJson>(&json);
279e509ee18Sopenharmony_ci    result = ptJson.Add(key, std::move(ptr1));
280e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
281e509ee18Sopenharmony_ci    bool value2 = true;
282e509ee18Sopenharmony_ci    result = ptJson.Add(key, value2);
283e509ee18Sopenharmony_ci    ASSERT_EQ(result, false);
284e509ee18Sopenharmony_ci}
285e509ee18Sopenharmony_ci
286e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, UIntTest)
287e509ee18Sopenharmony_ci{
288e509ee18Sopenharmony_ci    std::string str = "UIntTest";
289e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
290e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetUInt(), 0);
291e509ee18Sopenharmony_ci    str = "12345";
292e509ee18Sopenharmony_ci    json = PtJson::Parse(str.c_str());
293e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetUInt(), 12345);
294e509ee18Sopenharmony_ci}
295e509ee18Sopenharmony_ci
296e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, UInt64Test)
297e509ee18Sopenharmony_ci{
298e509ee18Sopenharmony_ci    std::string str = "UInt64Test";
299e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> json = PtJson::Parse(str.c_str());
300e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetUInt64(), 0);
301e509ee18Sopenharmony_ci    str = "123456789012345";
302e509ee18Sopenharmony_ci    json = PtJson::Parse(str.c_str());
303e509ee18Sopenharmony_ci    EXPECT_EQ(json->GetUInt64(), 123456789012345);
304e509ee18Sopenharmony_ci}
305e509ee18Sopenharmony_ci
306e509ee18Sopenharmony_ciHWTEST_F_L0(PtJsonTest, ResultUInt64Test)
307e509ee18Sopenharmony_ci{
308e509ee18Sopenharmony_ci    auto test = PtJson::CreateObject();
309e509ee18Sopenharmony_ci    test->Add("a", "ResultUInt64Test");
310e509ee18Sopenharmony_ci    test->Add("b", 100);
311e509ee18Sopenharmony_ci    uint64_t ui64;
312e509ee18Sopenharmony_ci    ASSERT_EQ(test->GetUInt64("a", &ui64), Result::TYPE_ERROR);
313e509ee18Sopenharmony_ci    ASSERT_EQ(test->GetUInt64("b", &ui64), Result::SUCCESS);
314e509ee18Sopenharmony_ci    EXPECT_EQ(ui64, static_cast<uint64_t>(100));
315e509ee18Sopenharmony_ci}
316e509ee18Sopenharmony_ci}