@@ -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+
75167int 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