Skip to content

Commit d4fc45a

Browse files
shaded-enmitypoettering
authored andcommitted
test/test-json: Tests for the tokenizer bugfix and the DOM parser
The DOM parser tests are accompanied with structure and element analysis
1 parent ed967b1 commit d4fc45a

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

src/test/test-json.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,98 @@ static void test_one(const char *data, ...) {
7272
va_end(ap);
7373
}
7474

75+
typedef void (*Test)(JsonVariant *);
76+
77+
static void test_file(const char *data, Test test) {
78+
JsonVariant *v = NULL;
79+
int r = json_parse(data, &v);
80+
81+
assert_se(r == 0);
82+
assert_se(v != NULL);
83+
assert_se(v->type == JSON_VARIANT_OBJECT);
84+
85+
if (test)
86+
test(v);
87+
88+
json_variant_unref(v);
89+
}
90+
91+
static void test_1(JsonVariant *v) {
92+
JsonVariant *p, *q;
93+
unsigned i;
94+
95+
/* 3 keys + 3 values */
96+
assert_se(v->size == 6);
97+
98+
/* has k */
99+
p = json_variant_value(v, "k");
100+
assert_se(p && p->type == JSON_VARIANT_STRING);
101+
102+
/* k equals v */
103+
assert_se(streq(json_variant_string(p), "v"));
104+
105+
/* has foo */
106+
p = json_variant_value(v, "foo");
107+
assert_se(p && p->type == JSON_VARIANT_ARRAY && p->size == 3);
108+
109+
/* check foo[0] = 1, foo[1] = 2, foo[2] = 3 */
110+
for (i = 0; i < 3; ++i) {
111+
q = json_variant_element(p, i);
112+
assert_se(q && q->type == JSON_VARIANT_INTEGER && json_variant_integer(q) == (i+1));
113+
}
114+
115+
/* has bar */
116+
p = json_variant_value(v, "bar");
117+
assert_se(p && p->type == JSON_VARIANT_OBJECT && p->size == 2);
118+
119+
/* zap is null */
120+
q = json_variant_value(p, "zap");
121+
assert_se(q && q->type == JSON_VARIANT_NULL);
122+
}
123+
124+
static void test_2(JsonVariant *v) {
125+
JsonVariant *p, *q;
126+
127+
/* 2 keys + 2 values */
128+
assert_se(v->size == 4);
129+
130+
/* has mutant */
131+
p = json_variant_value(v, "mutant");
132+
assert_se(p && p->type == JSON_VARIANT_ARRAY && p->size == 4);
133+
134+
/* mutant[0] == 1 */
135+
q = json_variant_element(p, 0);
136+
assert_se(q && q->type == JSON_VARIANT_INTEGER && json_variant_integer(q) == 1);
137+
138+
/* mutant[1] == null */
139+
q = json_variant_element(p, 1);
140+
assert_se(q && q->type == JSON_VARIANT_NULL);
141+
142+
/* mutant[2] == "1" */
143+
q = json_variant_element(p, 2);
144+
assert_se(q && q->type == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
145+
146+
/* mutant[3] == JSON_VARIANT_OBJECT */
147+
q = json_variant_element(p, 3);
148+
assert_se(q && q->type == JSON_VARIANT_OBJECT && q->size == 2);
149+
150+
/* has 1 */
151+
p = json_variant_value(q, "1");
152+
assert_se(p && p->type == JSON_VARIANT_ARRAY && p->size == 2);
153+
154+
/* "1"[0] == 1 */
155+
q = json_variant_element(p, 0);
156+
assert_se(q && q->type == JSON_VARIANT_INTEGER && json_variant_integer(q) == 1);
157+
158+
/* "1"[1] == "1" */
159+
q = json_variant_element(p, 1);
160+
assert_se(q && q->type == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
161+
162+
/* has blah */
163+
p = json_variant_value(v, "blah");
164+
assert_se(p && p->type == JSON_VARIANT_REAL && fabs(json_variant_real(p) - 1.27) < 0.001);
165+
}
166+
75167
int main(int argc, char *argv[]) {
76168

77169
test_one("x", -EINVAL);
@@ -102,5 +194,10 @@ int main(int argc, char *argv[]) {
102194
test_one("\"\\udc00\\udc00\"", -EINVAL);
103195
test_one("\"\\ud801\\udc37\"", JSON_STRING, "\xf0\x90\x90\xb7", JSON_END);
104196

197+
test_one("[1, 2]", JSON_ARRAY_OPEN, JSON_INTEGER, 1, JSON_COMMA, JSON_INTEGER, 2, JSON_ARRAY_CLOSE, JSON_END);
198+
199+
test_file("{\"k\": \"v\", \"foo\": [1, 2, 3], \"bar\": {\"zap\": null}}", test_1);
200+
test_file("{\"mutant\": [1, null, \"1\", {\"1\": [1, \"1\"]}], \"blah\": 1.27}", test_2);
201+
105202
return 0;
106203
}

0 commit comments

Comments
 (0)