xref: /aosp_15_r20/external/jsmn/test/tests.c (revision 420d848fb01a502d3186bd0f49f4e0beb321f5cd)
1*420d848fSAndroid Build Coastguard Worker #include <stdarg.h>
2*420d848fSAndroid Build Coastguard Worker #include <stdio.h>
3*420d848fSAndroid Build Coastguard Worker #include <stdlib.h>
4*420d848fSAndroid Build Coastguard Worker #include <string.h>
5*420d848fSAndroid Build Coastguard Worker 
6*420d848fSAndroid Build Coastguard Worker #include "test.h"
7*420d848fSAndroid Build Coastguard Worker #include "testutil.h"
8*420d848fSAndroid Build Coastguard Worker 
test_empty(void)9*420d848fSAndroid Build Coastguard Worker int test_empty(void) {
10*420d848fSAndroid Build Coastguard Worker   check(parse("{}", 1, 1, JSMN_OBJECT, 0, 2, 0));
11*420d848fSAndroid Build Coastguard Worker   check(parse("[]", 1, 1, JSMN_ARRAY, 0, 2, 0));
12*420d848fSAndroid Build Coastguard Worker   check(parse("[{},{}]", 3, 3, JSMN_ARRAY, 0, 7, 2, JSMN_OBJECT, 1, 3, 0,
13*420d848fSAndroid Build Coastguard Worker               JSMN_OBJECT, 4, 6, 0));
14*420d848fSAndroid Build Coastguard Worker   return 0;
15*420d848fSAndroid Build Coastguard Worker }
16*420d848fSAndroid Build Coastguard Worker 
test_object(void)17*420d848fSAndroid Build Coastguard Worker int test_object(void) {
18*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":0}", 3, 3, JSMN_OBJECT, 0, 7, 1, JSMN_STRING, "a", 1,
19*420d848fSAndroid Build Coastguard Worker               JSMN_PRIMITIVE, "0"));
20*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":[]}", 3, 3, JSMN_OBJECT, 0, 8, 1, JSMN_STRING, "a", 1,
21*420d848fSAndroid Build Coastguard Worker               JSMN_ARRAY, 5, 7, 0));
22*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":{},\"b\":{}}", 5, 5, JSMN_OBJECT, -1, -1, 2, JSMN_STRING,
23*420d848fSAndroid Build Coastguard Worker               "a", 1, JSMN_OBJECT, -1, -1, 0, JSMN_STRING, "b", 1, JSMN_OBJECT,
24*420d848fSAndroid Build Coastguard Worker               -1, -1, 0));
25*420d848fSAndroid Build Coastguard Worker   check(parse("{\n \"Day\": 26,\n \"Month\": 9,\n \"Year\": 12\n }", 7, 7,
26*420d848fSAndroid Build Coastguard Worker               JSMN_OBJECT, -1, -1, 3, JSMN_STRING, "Day", 1, JSMN_PRIMITIVE,
27*420d848fSAndroid Build Coastguard Worker               "26", JSMN_STRING, "Month", 1, JSMN_PRIMITIVE, "9", JSMN_STRING,
28*420d848fSAndroid Build Coastguard Worker               "Year", 1, JSMN_PRIMITIVE, "12"));
29*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\": 0, \"b\": \"c\"}", 5, 5, JSMN_OBJECT, -1, -1, 2,
30*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "a", 1, JSMN_PRIMITIVE, "0", JSMN_STRING, "b", 1,
31*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "c", 0));
32*420d848fSAndroid Build Coastguard Worker 
33*420d848fSAndroid Build Coastguard Worker #ifdef JSMN_STRICT
34*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\"\n0}", JSMN_ERROR_INVAL, 3));
35*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\", 0}", JSMN_ERROR_INVAL, 3));
36*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\": {2}}", JSMN_ERROR_INVAL, 3));
37*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\": {2: 3}}", JSMN_ERROR_INVAL, 3));
38*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\": {\"a\": 2 3}}", JSMN_ERROR_INVAL, 5));
39*420d848fSAndroid Build Coastguard Worker /* FIXME */
40*420d848fSAndroid Build Coastguard Worker /*check(parse("{\"a\"}", JSMN_ERROR_INVAL, 2));*/
41*420d848fSAndroid Build Coastguard Worker /*check(parse("{\"a\": 1, \"b\"}", JSMN_ERROR_INVAL, 4));*/
42*420d848fSAndroid Build Coastguard Worker /*check(parse("{\"a\",\"b\":1}", JSMN_ERROR_INVAL, 4));*/
43*420d848fSAndroid Build Coastguard Worker /*check(parse("{\"a\":1,}", JSMN_ERROR_INVAL, 4));*/
44*420d848fSAndroid Build Coastguard Worker /*check(parse("{\"a\":\"b\":\"c\"}", JSMN_ERROR_INVAL, 4));*/
45*420d848fSAndroid Build Coastguard Worker /*check(parse("{,}", JSMN_ERROR_INVAL, 4));*/
46*420d848fSAndroid Build Coastguard Worker #endif
47*420d848fSAndroid Build Coastguard Worker   return 0;
48*420d848fSAndroid Build Coastguard Worker }
49*420d848fSAndroid Build Coastguard Worker 
test_array(void)50*420d848fSAndroid Build Coastguard Worker int test_array(void) {
51*420d848fSAndroid Build Coastguard Worker   /* FIXME */
52*420d848fSAndroid Build Coastguard Worker   /*check(parse("[10}", JSMN_ERROR_INVAL, 3));*/
53*420d848fSAndroid Build Coastguard Worker   /*check(parse("[1,,3]", JSMN_ERROR_INVAL, 3)*/
54*420d848fSAndroid Build Coastguard Worker   check(parse("[10]", 2, 2, JSMN_ARRAY, -1, -1, 1, JSMN_PRIMITIVE, "10"));
55*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\": 1]", JSMN_ERROR_INVAL, 3));
56*420d848fSAndroid Build Coastguard Worker   /* FIXME */
57*420d848fSAndroid Build Coastguard Worker   /*check(parse("[\"a\": 1]", JSMN_ERROR_INVAL, 3));*/
58*420d848fSAndroid Build Coastguard Worker   return 0;
59*420d848fSAndroid Build Coastguard Worker }
60*420d848fSAndroid Build Coastguard Worker 
test_primitive(void)61*420d848fSAndroid Build Coastguard Worker int test_primitive(void) {
62*420d848fSAndroid Build Coastguard Worker   check(parse("{\"boolVar\" : true }", 3, 3, JSMN_OBJECT, -1, -1, 1,
63*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "boolVar", 1, JSMN_PRIMITIVE, "true"));
64*420d848fSAndroid Build Coastguard Worker   check(parse("{\"boolVar\" : false }", 3, 3, JSMN_OBJECT, -1, -1, 1,
65*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "boolVar", 1, JSMN_PRIMITIVE, "false"));
66*420d848fSAndroid Build Coastguard Worker   check(parse("{\"nullVar\" : null }", 3, 3, JSMN_OBJECT, -1, -1, 1,
67*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "nullVar", 1, JSMN_PRIMITIVE, "null"));
68*420d848fSAndroid Build Coastguard Worker   check(parse("{\"intVar\" : 12}", 3, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING,
69*420d848fSAndroid Build Coastguard Worker               "intVar", 1, JSMN_PRIMITIVE, "12"));
70*420d848fSAndroid Build Coastguard Worker   check(parse("{\"floatVar\" : 12.345}", 3, 3, JSMN_OBJECT, -1, -1, 1,
71*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "floatVar", 1, JSMN_PRIMITIVE, "12.345"));
72*420d848fSAndroid Build Coastguard Worker   return 0;
73*420d848fSAndroid Build Coastguard Worker }
74*420d848fSAndroid Build Coastguard Worker 
test_string(void)75*420d848fSAndroid Build Coastguard Worker int test_string(void) {
76*420d848fSAndroid Build Coastguard Worker   check(parse("{\"strVar\" : \"hello world\"}", 3, 3, JSMN_OBJECT, -1, -1, 1,
77*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "strVar", 1, JSMN_STRING, "hello world", 0));
78*420d848fSAndroid Build Coastguard Worker   check(parse("{\"strVar\" : \"escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\\"}", 3, 3,
79*420d848fSAndroid Build Coastguard Worker               JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "strVar", 1, JSMN_STRING,
80*420d848fSAndroid Build Coastguard Worker               "escapes: \\/\\r\\n\\t\\b\\f\\\"\\\\", 0));
81*420d848fSAndroid Build Coastguard Worker   check(parse("{\"strVar\": \"\"}", 3, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING,
82*420d848fSAndroid Build Coastguard Worker               "strVar", 1, JSMN_STRING, "", 0));
83*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":\"\\uAbcD\"}", 3, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING,
84*420d848fSAndroid Build Coastguard Worker               "a", 1, JSMN_STRING, "\\uAbcD", 0));
85*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":\"str\\u0000\"}", 3, 3, JSMN_OBJECT, -1, -1, 1,
86*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "a", 1, JSMN_STRING, "str\\u0000", 0));
87*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":\"\\uFFFFstr\"}", 3, 3, JSMN_OBJECT, -1, -1, 1,
88*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "a", 1, JSMN_STRING, "\\uFFFFstr", 0));
89*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":[\"\\u0280\"]}", 4, 4, JSMN_OBJECT, -1, -1, 1,
90*420d848fSAndroid Build Coastguard Worker               JSMN_STRING, "a", 1, JSMN_ARRAY, -1, -1, 1, JSMN_STRING,
91*420d848fSAndroid Build Coastguard Worker               "\\u0280", 0));
92*420d848fSAndroid Build Coastguard Worker 
93*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":\"str\\uFFGFstr\"}", JSMN_ERROR_INVAL, 3));
94*420d848fSAndroid Build Coastguard Worker   check(parse("{\"a\":\"str\\u@FfF\"}", JSMN_ERROR_INVAL, 3));
95*420d848fSAndroid Build Coastguard Worker   check(parse("{{\"a\":[\"\\u028\"]}", JSMN_ERROR_INVAL, 4));
96*420d848fSAndroid Build Coastguard Worker   return 0;
97*420d848fSAndroid Build Coastguard Worker }
98*420d848fSAndroid Build Coastguard Worker 
test_partial_string(void)99*420d848fSAndroid Build Coastguard Worker int test_partial_string(void) {
100*420d848fSAndroid Build Coastguard Worker   int r;
101*420d848fSAndroid Build Coastguard Worker   unsigned long i;
102*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
103*420d848fSAndroid Build Coastguard Worker   jsmntok_t tok[5];
104*420d848fSAndroid Build Coastguard Worker   const char *js = "{\"x\": \"va\\\\ue\", \"y\": \"value y\"}";
105*420d848fSAndroid Build Coastguard Worker 
106*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
107*420d848fSAndroid Build Coastguard Worker   for (i = 1; i <= strlen(js); i++) {
108*420d848fSAndroid Build Coastguard Worker     r = jsmn_parse(&p, js, i, tok, sizeof(tok) / sizeof(tok[0]));
109*420d848fSAndroid Build Coastguard Worker     if (i == strlen(js)) {
110*420d848fSAndroid Build Coastguard Worker       check(r == 5);
111*420d848fSAndroid Build Coastguard Worker       check(tokeq(js, tok, 5, JSMN_OBJECT, -1, -1, 2, JSMN_STRING, "x", 1,
112*420d848fSAndroid Build Coastguard Worker                   JSMN_STRING, "va\\\\ue", 0, JSMN_STRING, "y", 1, JSMN_STRING,
113*420d848fSAndroid Build Coastguard Worker                   "value y", 0));
114*420d848fSAndroid Build Coastguard Worker     } else {
115*420d848fSAndroid Build Coastguard Worker       check(r == JSMN_ERROR_PART);
116*420d848fSAndroid Build Coastguard Worker     }
117*420d848fSAndroid Build Coastguard Worker   }
118*420d848fSAndroid Build Coastguard Worker   return 0;
119*420d848fSAndroid Build Coastguard Worker }
120*420d848fSAndroid Build Coastguard Worker 
test_partial_array(void)121*420d848fSAndroid Build Coastguard Worker int test_partial_array(void) {
122*420d848fSAndroid Build Coastguard Worker #ifdef JSMN_STRICT
123*420d848fSAndroid Build Coastguard Worker   int r;
124*420d848fSAndroid Build Coastguard Worker   unsigned long i;
125*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
126*420d848fSAndroid Build Coastguard Worker   jsmntok_t tok[10];
127*420d848fSAndroid Build Coastguard Worker   const char *js = "[ 1, true, [123, \"hello\"]]";
128*420d848fSAndroid Build Coastguard Worker 
129*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
130*420d848fSAndroid Build Coastguard Worker   for (i = 1; i <= strlen(js); i++) {
131*420d848fSAndroid Build Coastguard Worker     r = jsmn_parse(&p, js, i, tok, sizeof(tok) / sizeof(tok[0]));
132*420d848fSAndroid Build Coastguard Worker     if (i == strlen(js)) {
133*420d848fSAndroid Build Coastguard Worker       check(r == 6);
134*420d848fSAndroid Build Coastguard Worker       check(tokeq(js, tok, 6, JSMN_ARRAY, -1, -1, 3, JSMN_PRIMITIVE, "1",
135*420d848fSAndroid Build Coastguard Worker                   JSMN_PRIMITIVE, "true", JSMN_ARRAY, -1, -1, 2, JSMN_PRIMITIVE,
136*420d848fSAndroid Build Coastguard Worker                   "123", JSMN_STRING, "hello", 0));
137*420d848fSAndroid Build Coastguard Worker     } else {
138*420d848fSAndroid Build Coastguard Worker       check(r == JSMN_ERROR_PART);
139*420d848fSAndroid Build Coastguard Worker     }
140*420d848fSAndroid Build Coastguard Worker   }
141*420d848fSAndroid Build Coastguard Worker #endif
142*420d848fSAndroid Build Coastguard Worker   return 0;
143*420d848fSAndroid Build Coastguard Worker }
144*420d848fSAndroid Build Coastguard Worker 
test_array_nomem(void)145*420d848fSAndroid Build Coastguard Worker int test_array_nomem(void) {
146*420d848fSAndroid Build Coastguard Worker   int i;
147*420d848fSAndroid Build Coastguard Worker   int r;
148*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
149*420d848fSAndroid Build Coastguard Worker   jsmntok_t toksmall[10], toklarge[10];
150*420d848fSAndroid Build Coastguard Worker   const char *js;
151*420d848fSAndroid Build Coastguard Worker 
152*420d848fSAndroid Build Coastguard Worker   js = "  [ 1, true, [123, \"hello\"]]";
153*420d848fSAndroid Build Coastguard Worker 
154*420d848fSAndroid Build Coastguard Worker   for (i = 0; i < 6; i++) {
155*420d848fSAndroid Build Coastguard Worker     jsmn_init(&p);
156*420d848fSAndroid Build Coastguard Worker     memset(toksmall, 0, sizeof(toksmall));
157*420d848fSAndroid Build Coastguard Worker     memset(toklarge, 0, sizeof(toklarge));
158*420d848fSAndroid Build Coastguard Worker     r = jsmn_parse(&p, js, strlen(js), toksmall, i);
159*420d848fSAndroid Build Coastguard Worker     check(r == JSMN_ERROR_NOMEM);
160*420d848fSAndroid Build Coastguard Worker 
161*420d848fSAndroid Build Coastguard Worker     memcpy(toklarge, toksmall, sizeof(toksmall));
162*420d848fSAndroid Build Coastguard Worker 
163*420d848fSAndroid Build Coastguard Worker     r = jsmn_parse(&p, js, strlen(js), toklarge, 10);
164*420d848fSAndroid Build Coastguard Worker     check(r >= 0);
165*420d848fSAndroid Build Coastguard Worker     check(tokeq(js, toklarge, 4, JSMN_ARRAY, -1, -1, 3, JSMN_PRIMITIVE, "1",
166*420d848fSAndroid Build Coastguard Worker                 JSMN_PRIMITIVE, "true", JSMN_ARRAY, -1, -1, 2, JSMN_PRIMITIVE,
167*420d848fSAndroid Build Coastguard Worker                 "123", JSMN_STRING, "hello", 0));
168*420d848fSAndroid Build Coastguard Worker   }
169*420d848fSAndroid Build Coastguard Worker   return 0;
170*420d848fSAndroid Build Coastguard Worker }
171*420d848fSAndroid Build Coastguard Worker 
test_unquoted_keys(void)172*420d848fSAndroid Build Coastguard Worker int test_unquoted_keys(void) {
173*420d848fSAndroid Build Coastguard Worker #ifndef JSMN_STRICT
174*420d848fSAndroid Build Coastguard Worker   int r;
175*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
176*420d848fSAndroid Build Coastguard Worker   jsmntok_t tok[10];
177*420d848fSAndroid Build Coastguard Worker   const char *js;
178*420d848fSAndroid Build Coastguard Worker 
179*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
180*420d848fSAndroid Build Coastguard Worker   js = "key1: \"value\"\nkey2 : 123";
181*420d848fSAndroid Build Coastguard Worker 
182*420d848fSAndroid Build Coastguard Worker   r = jsmn_parse(&p, js, strlen(js), tok, 10);
183*420d848fSAndroid Build Coastguard Worker   check(r >= 0);
184*420d848fSAndroid Build Coastguard Worker   check(tokeq(js, tok, 4, JSMN_PRIMITIVE, "key1", JSMN_STRING, "value", 0,
185*420d848fSAndroid Build Coastguard Worker               JSMN_PRIMITIVE, "key2", JSMN_PRIMITIVE, "123"));
186*420d848fSAndroid Build Coastguard Worker #endif
187*420d848fSAndroid Build Coastguard Worker   return 0;
188*420d848fSAndroid Build Coastguard Worker }
189*420d848fSAndroid Build Coastguard Worker 
test_issue_22(void)190*420d848fSAndroid Build Coastguard Worker int test_issue_22(void) {
191*420d848fSAndroid Build Coastguard Worker   int r;
192*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
193*420d848fSAndroid Build Coastguard Worker   jsmntok_t tokens[128];
194*420d848fSAndroid Build Coastguard Worker   const char *js;
195*420d848fSAndroid Build Coastguard Worker 
196*420d848fSAndroid Build Coastguard Worker   js =
197*420d848fSAndroid Build Coastguard Worker       "{ \"height\":10, \"layers\":[ { \"data\":[6,6], \"height\":10, "
198*420d848fSAndroid Build Coastguard Worker       "\"name\":\"Calque de Tile 1\", \"opacity\":1, \"type\":\"tilelayer\", "
199*420d848fSAndroid Build Coastguard Worker       "\"visible\":true, \"width\":10, \"x\":0, \"y\":0 }], "
200*420d848fSAndroid Build Coastguard Worker       "\"orientation\":\"orthogonal\", \"properties\": { }, \"tileheight\":32, "
201*420d848fSAndroid Build Coastguard Worker       "\"tilesets\":[ { \"firstgid\":1, \"image\":\"..\\/images\\/tiles.png\", "
202*420d848fSAndroid Build Coastguard Worker       "\"imageheight\":64, \"imagewidth\":160, \"margin\":0, "
203*420d848fSAndroid Build Coastguard Worker       "\"name\":\"Tiles\", "
204*420d848fSAndroid Build Coastguard Worker       "\"properties\":{}, \"spacing\":0, \"tileheight\":32, \"tilewidth\":32 "
205*420d848fSAndroid Build Coastguard Worker       "}], "
206*420d848fSAndroid Build Coastguard Worker       "\"tilewidth\":32, \"version\":1, \"width\":10 }";
207*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
208*420d848fSAndroid Build Coastguard Worker   r = jsmn_parse(&p, js, strlen(js), tokens, 128);
209*420d848fSAndroid Build Coastguard Worker   check(r >= 0);
210*420d848fSAndroid Build Coastguard Worker   return 0;
211*420d848fSAndroid Build Coastguard Worker }
212*420d848fSAndroid Build Coastguard Worker 
test_issue_27(void)213*420d848fSAndroid Build Coastguard Worker int test_issue_27(void) {
214*420d848fSAndroid Build Coastguard Worker   const char *js =
215*420d848fSAndroid Build Coastguard Worker       "{ \"name\" : \"Jack\", \"age\" : 27 } { \"name\" : \"Anna\", ";
216*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_PART, 8));
217*420d848fSAndroid Build Coastguard Worker   return 0;
218*420d848fSAndroid Build Coastguard Worker }
219*420d848fSAndroid Build Coastguard Worker 
test_input_length(void)220*420d848fSAndroid Build Coastguard Worker int test_input_length(void) {
221*420d848fSAndroid Build Coastguard Worker   const char *js;
222*420d848fSAndroid Build Coastguard Worker   int r;
223*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
224*420d848fSAndroid Build Coastguard Worker   jsmntok_t tokens[10];
225*420d848fSAndroid Build Coastguard Worker 
226*420d848fSAndroid Build Coastguard Worker   js = "{\"a\": 0}garbage";
227*420d848fSAndroid Build Coastguard Worker 
228*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
229*420d848fSAndroid Build Coastguard Worker   r = jsmn_parse(&p, js, 8, tokens, 10);
230*420d848fSAndroid Build Coastguard Worker   check(r == 3);
231*420d848fSAndroid Build Coastguard Worker   check(tokeq(js, tokens, 3, JSMN_OBJECT, -1, -1, 1, JSMN_STRING, "a", 1,
232*420d848fSAndroid Build Coastguard Worker               JSMN_PRIMITIVE, "0"));
233*420d848fSAndroid Build Coastguard Worker   return 0;
234*420d848fSAndroid Build Coastguard Worker }
235*420d848fSAndroid Build Coastguard Worker 
test_count(void)236*420d848fSAndroid Build Coastguard Worker int test_count(void) {
237*420d848fSAndroid Build Coastguard Worker   jsmn_parser p;
238*420d848fSAndroid Build Coastguard Worker   const char *js;
239*420d848fSAndroid Build Coastguard Worker 
240*420d848fSAndroid Build Coastguard Worker   js = "{}";
241*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
242*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1);
243*420d848fSAndroid Build Coastguard Worker 
244*420d848fSAndroid Build Coastguard Worker   js = "[]";
245*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
246*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 1);
247*420d848fSAndroid Build Coastguard Worker 
248*420d848fSAndroid Build Coastguard Worker   js = "[[]]";
249*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
250*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 2);
251*420d848fSAndroid Build Coastguard Worker 
252*420d848fSAndroid Build Coastguard Worker   js = "[[], []]";
253*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
254*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3);
255*420d848fSAndroid Build Coastguard Worker 
256*420d848fSAndroid Build Coastguard Worker   js = "[[], []]";
257*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
258*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 3);
259*420d848fSAndroid Build Coastguard Worker 
260*420d848fSAndroid Build Coastguard Worker   js = "[[], [[]], [[], []]]";
261*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
262*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7);
263*420d848fSAndroid Build Coastguard Worker 
264*420d848fSAndroid Build Coastguard Worker   js = "[\"a\", [[], []]]";
265*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
266*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5);
267*420d848fSAndroid Build Coastguard Worker 
268*420d848fSAndroid Build Coastguard Worker   js = "[[], \"[], [[]]\", [[]]]";
269*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
270*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 5);
271*420d848fSAndroid Build Coastguard Worker 
272*420d848fSAndroid Build Coastguard Worker   js = "[1, 2, 3]";
273*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
274*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 4);
275*420d848fSAndroid Build Coastguard Worker 
276*420d848fSAndroid Build Coastguard Worker   js = "[1, 2, [3, \"a\"], null]";
277*420d848fSAndroid Build Coastguard Worker   jsmn_init(&p);
278*420d848fSAndroid Build Coastguard Worker   check(jsmn_parse(&p, js, strlen(js), NULL, 0) == 7);
279*420d848fSAndroid Build Coastguard Worker 
280*420d848fSAndroid Build Coastguard Worker   return 0;
281*420d848fSAndroid Build Coastguard Worker }
282*420d848fSAndroid Build Coastguard Worker 
test_nonstrict(void)283*420d848fSAndroid Build Coastguard Worker int test_nonstrict(void) {
284*420d848fSAndroid Build Coastguard Worker #ifndef JSMN_STRICT
285*420d848fSAndroid Build Coastguard Worker   const char *js;
286*420d848fSAndroid Build Coastguard Worker   js = "a: 0garbage";
287*420d848fSAndroid Build Coastguard Worker   check(parse(js, 2, 2, JSMN_PRIMITIVE, "a", JSMN_PRIMITIVE, "0garbage"));
288*420d848fSAndroid Build Coastguard Worker 
289*420d848fSAndroid Build Coastguard Worker   js = "Day : 26\nMonth : Sep\n\nYear: 12";
290*420d848fSAndroid Build Coastguard Worker   check(parse(js, 6, 6, JSMN_PRIMITIVE, "Day", JSMN_PRIMITIVE, "26",
291*420d848fSAndroid Build Coastguard Worker               JSMN_PRIMITIVE, "Month", JSMN_PRIMITIVE, "Sep", JSMN_PRIMITIVE,
292*420d848fSAndroid Build Coastguard Worker               "Year", JSMN_PRIMITIVE, "12"));
293*420d848fSAndroid Build Coastguard Worker 
294*420d848fSAndroid Build Coastguard Worker   /* nested {s don't cause a parse error. */
295*420d848fSAndroid Build Coastguard Worker   js = "\"key {1\": 1234";
296*420d848fSAndroid Build Coastguard Worker   check(parse(js, 2, 2, JSMN_STRING, "key {1", 1, JSMN_PRIMITIVE, "1234"));
297*420d848fSAndroid Build Coastguard Worker 
298*420d848fSAndroid Build Coastguard Worker #endif
299*420d848fSAndroid Build Coastguard Worker   return 0;
300*420d848fSAndroid Build Coastguard Worker }
301*420d848fSAndroid Build Coastguard Worker 
test_unmatched_brackets(void)302*420d848fSAndroid Build Coastguard Worker int test_unmatched_brackets(void) {
303*420d848fSAndroid Build Coastguard Worker   const char *js;
304*420d848fSAndroid Build Coastguard Worker   js = "\"key 1\": 1234}";
305*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_INVAL, 2));
306*420d848fSAndroid Build Coastguard Worker   js = "{\"key 1\": 1234";
307*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_PART, 3));
308*420d848fSAndroid Build Coastguard Worker   js = "{\"key 1\": 1234}}";
309*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_INVAL, 3));
310*420d848fSAndroid Build Coastguard Worker   js = "\"key 1\"}: 1234";
311*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_INVAL, 3));
312*420d848fSAndroid Build Coastguard Worker   js = "{\"key {1\": 1234}";
313*420d848fSAndroid Build Coastguard Worker   check(parse(js, 3, 3, JSMN_OBJECT, 0, 16, 1, JSMN_STRING, "key {1", 1,
314*420d848fSAndroid Build Coastguard Worker               JSMN_PRIMITIVE, "1234"));
315*420d848fSAndroid Build Coastguard Worker   js = "{\"key 1\":{\"key 2\": 1234}";
316*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_PART, 5));
317*420d848fSAndroid Build Coastguard Worker   return 0;
318*420d848fSAndroid Build Coastguard Worker }
319*420d848fSAndroid Build Coastguard Worker 
test_object_key(void)320*420d848fSAndroid Build Coastguard Worker int test_object_key(void) {
321*420d848fSAndroid Build Coastguard Worker   const char *js;
322*420d848fSAndroid Build Coastguard Worker 
323*420d848fSAndroid Build Coastguard Worker   js = "{\"key\": 1}";
324*420d848fSAndroid Build Coastguard Worker   check(parse(js, 3, 3, JSMN_OBJECT, 0, 10, 1, JSMN_STRING, "key", 1,
325*420d848fSAndroid Build Coastguard Worker               JSMN_PRIMITIVE, "1"));
326*420d848fSAndroid Build Coastguard Worker #ifdef JSMN_STRICT
327*420d848fSAndroid Build Coastguard Worker   js = "{true: 1}";
328*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_INVAL, 3));
329*420d848fSAndroid Build Coastguard Worker   js = "{1: 1}";
330*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_INVAL, 3));
331*420d848fSAndroid Build Coastguard Worker   js = "{{\"key\": 1}: 2}";
332*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_INVAL, 5));
333*420d848fSAndroid Build Coastguard Worker   js = "{[1,2]: 2}";
334*420d848fSAndroid Build Coastguard Worker   check(parse(js, JSMN_ERROR_INVAL, 5));
335*420d848fSAndroid Build Coastguard Worker #endif
336*420d848fSAndroid Build Coastguard Worker   return 0;
337*420d848fSAndroid Build Coastguard Worker }
338*420d848fSAndroid Build Coastguard Worker 
main(void)339*420d848fSAndroid Build Coastguard Worker int main(void) {
340*420d848fSAndroid Build Coastguard Worker   test(test_empty, "test for a empty JSON objects/arrays");
341*420d848fSAndroid Build Coastguard Worker   test(test_object, "test for a JSON objects");
342*420d848fSAndroid Build Coastguard Worker   test(test_array, "test for a JSON arrays");
343*420d848fSAndroid Build Coastguard Worker   test(test_primitive, "test primitive JSON data types");
344*420d848fSAndroid Build Coastguard Worker   test(test_string, "test string JSON data types");
345*420d848fSAndroid Build Coastguard Worker 
346*420d848fSAndroid Build Coastguard Worker   test(test_partial_string, "test partial JSON string parsing");
347*420d848fSAndroid Build Coastguard Worker   test(test_partial_array, "test partial array reading");
348*420d848fSAndroid Build Coastguard Worker   test(test_array_nomem, "test array reading with a smaller number of tokens");
349*420d848fSAndroid Build Coastguard Worker   test(test_unquoted_keys, "test unquoted keys (like in JavaScript)");
350*420d848fSAndroid Build Coastguard Worker   test(test_input_length, "test strings that are not null-terminated");
351*420d848fSAndroid Build Coastguard Worker   test(test_issue_22, "test issue #22");
352*420d848fSAndroid Build Coastguard Worker   test(test_issue_27, "test issue #27");
353*420d848fSAndroid Build Coastguard Worker   test(test_count, "test tokens count estimation");
354*420d848fSAndroid Build Coastguard Worker   test(test_nonstrict, "test for non-strict mode");
355*420d848fSAndroid Build Coastguard Worker   test(test_unmatched_brackets, "test for unmatched brackets");
356*420d848fSAndroid Build Coastguard Worker   test(test_object_key, "test for key type");
357*420d848fSAndroid Build Coastguard Worker   printf("\nPASSED: %d\nFAILED: %d\n", test_passed, test_failed);
358*420d848fSAndroid Build Coastguard Worker   return (test_failed > 0);
359*420d848fSAndroid Build Coastguard Worker }
360