-
Notifications
You must be signed in to change notification settings - Fork 2
/
jsonparser_test.cc
129 lines (113 loc) · 4.33 KB
/
jsonparser_test.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "jsonparser.h"
#include <assert.h>
#include <iostream>
#include <map>
#include <memory>
#include <set>
#include <vector>
using jjson::Value;
template <class T>
void utilTestKeywordParse(const std::string& w) {
std::unique_ptr<Value> v = jjson::Parse(w);
assert(v.get() != nullptr);
assert(dynamic_cast<T*>(v.get()) != nullptr);
}
template <class T, class U>
void utilTestValueParse(const std::string json, const U& value) {
std::unique_ptr<Value> v = jjson::Parse(json);
assert(v.get() != nullptr);
T* target = dynamic_cast<T*>(v.get());
assert(target != nullptr);
// std::cout << target->value_ << std::endl;
assert(target->value_ == value);
}
template <class T, class U>
void utilTestArrayParse(const std::string json, const std::vector<U>& values) {
std::unique_ptr<Value> v = jjson::Parse(json);
assert(v.get() != nullptr);
jjson::ArrayValue* target = dynamic_cast<jjson::ArrayValue*>(v.get());
assert(target != nullptr);
for (size_t i = 0; i < values.size(); ++i) {
T* value = dynamic_cast<T*>(target->value_[i].get());
assert(value != nullptr);
assert(value->value_ == values[i]);
}
}
void testConsume() {
{
std::string space_tab = " \t\ntrue\n\t";
auto parsed = jjson::Parse(space_tab);
jjson::TrueValue* t = dynamic_cast<jjson::TrueValue*>(parsed.get());
assert(t != nullptr);
}
utilTestKeywordParse<jjson::TrueValue>("true");
utilTestKeywordParse<jjson::FalseValue>("false");
utilTestKeywordParse<jjson::NullValue>("null");
assert(jjson::Parse("true")->is_true());
assert(!jjson::Parse("true")->is_false());
assert(!jjson::Parse("true")->is_null());
assert(!jjson::Parse("false")->is_true());
assert(jjson::Parse("false")->is_false());
assert(!jjson::Parse("false")->is_null());
assert(!jjson::Parse("null")->is_true());
assert(!jjson::Parse("null")->is_false());
assert(jjson::Parse("null")->is_null());
utilTestValueParse<jjson::NumberValue>("1", 1);
utilTestValueParse<jjson::NumberValue>("100", 100);
utilTestValueParse<jjson::NumberValue>("-10", -10);
utilTestValueParse<jjson::NumberValue>("5.5", 5.5);
utilTestValueParse<jjson::StringValue>(R"("5.5")", "5.5");
utilTestValueParse<jjson::StringValue>(R"("unkotest")", "unkotest");
utilTestValueParse<jjson::StringValue>(R"("carriage\r\nreturn")",
"carriage\r\nreturn");
utilTestValueParse<jjson::StringValue>(R"("\u0075")", "u");
utilTestArrayParse<jjson::NumberValue, float>("[1, 2, 3]", {1, 2, 3});
utilTestArrayParse<jjson::NumberValue, float>("[ ]", {});
{
std::unique_ptr<Value> v =
jjson::Parse(R"({"string" : "hoge", "number" : 123})");
assert(v.get() != nullptr);
auto target = dynamic_cast<jjson::ObjectValue*>(v.get());
assert(target != nullptr);
assert(dynamic_cast<jjson::StringValue*>(
target->value_.find("string")->second.get())
->value_ == "hoge");
assert(dynamic_cast<jjson::NumberValue*>(
target->value_.find("number")->second.get())
->value_ == 123);
}
{
std::unique_ptr<Value> v = jjson::Parse(R"(
{"obj" : {"hoge" : 12 },
"arr" : [1, 2, 3]})");
assert(v.get() != nullptr);
auto target = dynamic_cast<jjson::ObjectValue*>(v.get());
assert(target != nullptr);
auto num = dynamic_cast<jjson::NumberValue*>(
dynamic_cast<jjson::ObjectValue*>(
target->value_.find("obj")->second.get())
->value_.find("hoge")
->second.get());
assert(num->value_ == 12);
auto& arr = dynamic_cast<jjson::ArrayValue*>(
target->value_.find("arr")->second.get())
->value_;
assert(dynamic_cast<jjson::NumberValue*>(arr[0].get())->value_ == 1);
assert(dynamic_cast<jjson::NumberValue*>(arr[1].get())->value_ == 2);
assert(dynamic_cast<jjson::NumberValue*>(arr[2].get())->value_ == 3);
}
{
std::unique_ptr<Value> v = jjson::Parse(R"(
{"obj" : {"hoge" : 12,
"fuga": "sss" },
"arr" : [1, 2, 3]}
)");
assert(v.get() != nullptr);
assert((*v)["obj"]["hoge"].get_number() == 12);
assert((*v)["obj"]["fuga"].get_string() == "sss");
assert((*v)["arr"][0].get_number() == 1);
assert((*v)["arr"][1].get_number() == 2);
assert((*v)["arr"][2].get_number() == 3);
}
}
int main(int ac, char** av) { testConsume(); }