Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/tests/JsonEmitter.test.cpp
2723 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
#include "Luau/JsonEmitter.h"
3
4
#include "doctest.h"
5
6
using namespace Luau::Json;
7
8
TEST_SUITE_BEGIN("JsonEmitter");
9
10
TEST_CASE("write_array")
11
{
12
JsonEmitter emitter;
13
ArrayEmitter a = emitter.writeArray();
14
a.writeValue(123);
15
a.writeValue("foo");
16
a.finish();
17
18
std::string result = emitter.str();
19
CHECK(result == "[123,\"foo\"]");
20
}
21
22
TEST_CASE("write_object")
23
{
24
JsonEmitter emitter;
25
ObjectEmitter o = emitter.writeObject();
26
o.writePair("foo", "bar");
27
o.writePair("bar", "baz");
28
o.finish();
29
30
std::string result = emitter.str();
31
CHECK(result == "{\"foo\":\"bar\",\"bar\":\"baz\"}");
32
}
33
34
TEST_CASE("write_bool")
35
{
36
JsonEmitter emitter;
37
write(emitter, false);
38
CHECK(emitter.str() == "false");
39
40
emitter = JsonEmitter{};
41
write(emitter, true);
42
CHECK(emitter.str() == "true");
43
}
44
45
TEST_CASE("write_null")
46
{
47
JsonEmitter emitter;
48
write(emitter, nullptr);
49
CHECK(emitter.str() == "null");
50
}
51
52
TEST_CASE("write_string")
53
{
54
JsonEmitter emitter;
55
write(emitter, R"(foo,bar,baz,
56
"this should be escaped")");
57
CHECK(emitter.str() == "\"foo,bar,baz,\\n\\\"this should be escaped\\\"\"");
58
}
59
60
TEST_CASE("write_comma")
61
{
62
JsonEmitter emitter;
63
emitter.writeComma();
64
write(emitter, true);
65
emitter.writeComma();
66
write(emitter, false);
67
CHECK(emitter.str() == "true,false");
68
}
69
70
TEST_CASE("push_and_pop_comma")
71
{
72
JsonEmitter emitter;
73
emitter.writeComma();
74
write(emitter, true);
75
emitter.writeComma();
76
emitter.writeRaw('[');
77
bool comma = emitter.pushComma();
78
emitter.writeComma();
79
write(emitter, true);
80
emitter.writeComma();
81
write(emitter, false);
82
emitter.writeRaw(']');
83
emitter.popComma(comma);
84
emitter.writeComma();
85
write(emitter, false);
86
87
CHECK(emitter.str() == "true,[true,false],false");
88
}
89
90
TEST_CASE("write_optional")
91
{
92
JsonEmitter emitter;
93
emitter.writeComma();
94
write(emitter, std::optional<bool>{true});
95
emitter.writeComma();
96
write(emitter, std::nullopt);
97
98
CHECK(emitter.str() == "true,null");
99
}
100
101
TEST_CASE("write_vector")
102
{
103
std::vector<int> values{1, 2, 3, 4};
104
JsonEmitter emitter;
105
write(emitter, values);
106
CHECK(emitter.str() == "[1,2,3,4]");
107
}
108
109
TEST_CASE("prevent_multiple_object_finish")
110
{
111
JsonEmitter emitter;
112
ObjectEmitter o = emitter.writeObject();
113
o.writePair("a", "b");
114
o.finish();
115
o.finish();
116
117
CHECK(emitter.str() == "{\"a\":\"b\"}");
118
}
119
120
TEST_CASE("prevent_multiple_array_finish")
121
{
122
JsonEmitter emitter;
123
ArrayEmitter a = emitter.writeArray();
124
a.writeValue(1);
125
a.finish();
126
a.finish();
127
128
CHECK(emitter.str() == "[1]");
129
}
130
131
TEST_CASE("cannot_write_pair_after_finished")
132
{
133
JsonEmitter emitter;
134
ObjectEmitter o = emitter.writeObject();
135
o.finish();
136
o.writePair("a", "b");
137
138
CHECK(emitter.str() == "{}");
139
}
140
141
TEST_CASE("cannot_write_value_after_finished")
142
{
143
JsonEmitter emitter;
144
ArrayEmitter a = emitter.writeArray();
145
a.finish();
146
a.writeValue(1);
147
148
CHECK(emitter.str() == "[]");
149
}
150
151
TEST_CASE("finish_when_destructing_object")
152
{
153
JsonEmitter emitter;
154
emitter.writeObject();
155
156
CHECK(emitter.str() == "{}");
157
}
158
159
TEST_CASE("finish_when_destructing_array")
160
{
161
JsonEmitter emitter;
162
emitter.writeArray();
163
164
CHECK(emitter.str() == "[]");
165
}
166
167
namespace Luau::Json
168
{
169
170
struct Special
171
{
172
int foo;
173
int bar;
174
};
175
176
void write(JsonEmitter& emitter, const Special& value)
177
{
178
ObjectEmitter o = emitter.writeObject();
179
o.writePair("foo", value.foo);
180
o.writePair("bar", value.bar);
181
}
182
183
} // namespace Luau::Json
184
185
TEST_CASE("afford_extensibility")
186
{
187
std::vector<Special> vec{Special{1, 2}, Special{3, 4}};
188
JsonEmitter e;
189
write(e, vec);
190
191
std::string result = e.str();
192
CHECK(result == R"([{"foo":1,"bar":2},{"foo":3,"bar":4}])");
193
}
194
195
TEST_SUITE_END();
196
197