1185377Ssam/*
2187831Ssam * This file and its contents are supplied under the terms of the
3185377Ssam * Common Development and Distribution License ("CDDL"), version 1.0.
4185377Ssam * You may only use this file in accordance with the terms of version
5185377Ssam * 1.0 of the CDDL.
6185377Ssam *
7185377Ssam * A full copy of the text of the CDDL should have accompanied this
8185377Ssam * source.  A copy of the CDDL is also available via the Internet at
9185377Ssam * http://www.illumos.org/license/CDDL.
10185377Ssam */
11185377Ssam
12185377Ssam/*
13185377Ssam * Copyright 2012, Joyent, Inc.  All rights reserved.
14185377Ssam */
15185377Ssam
16185377Ssam/*
17187831Ssam * General functional tests of JSON parser for json().
18185377Ssam */
19185377Ssam
20185377Ssam#pragma D option quiet
21185377Ssam#pragma D option strsize=1k
22185377Ssam
23243169Sadrian#define	TST(name)				\
24185377Ssam	printf("\ntst |%s|\n", name)
25185377Ssam#define	IN2(vala, valb)				\
26185377Ssam	in = strjoin(vala, valb);		\
27185377Ssam	printf("in  |%s|\n", in)
28185377Ssam#define	IN(val)					\
29185377Ssam	in = val;				\
30185377Ssam	printf("in  |%s|\n", in)
31185377Ssam#define	SEL(ss)					\
32185377Ssam	out = json(in, ss);			\
33185377Ssam	printf("sel |%s|\nout |%s|\n", ss,	\
34185377Ssam	    out != NULL ? out : "<NULL>")
35185377Ssam
36185377SsamBEGIN
37185377Ssam{
38185377Ssam	TST("empty array");
39185377Ssam	IN("[]");
40185377Ssam	SEL("0");
41185377Ssam
42185377Ssam	TST("one-element array: integer");
43185377Ssam	IN("[1]");
44185377Ssam	SEL("0");
45185377Ssam	SEL("1");
46185377Ssam	SEL("100");
47185377Ssam	SEL("-1");
48185377Ssam
49185377Ssam	TST("one-element array: hex integer (not in spec, not supported)");
50185377Ssam	IN("[0x1000]");
51185377Ssam	SEL("0");
52204579Srpaulo
53204521Srpaulo	TST("one-element array: float");
54204521Srpaulo	IN("[1.5001]");
55185377Ssam	SEL("0");
56185377Ssam
57185377Ssam	TST("one-element array: float + exponent");
58204645Srpaulo	IN("[16.3e10]");
59185377Ssam	SEL("0");
60185377Ssam
61185377Ssam	TST("one-element array: integer + whitespace");
62185377Ssam	IN("[ \t   5\t]");
63185377Ssam	SEL("0");
64204579Srpaulo
65185377Ssam	TST("one-element array: integer + exponent + whitespace");
66185377Ssam	IN("[ \t    \t 16E10  \t ]");
67185377Ssam	SEL("0");
68185377Ssam
69185377Ssam	TST("one-element array: string");
70185377Ssam	IN("[\"alpha\"]");
71185377Ssam	SEL("0");
72185377Ssam
73204579Srpaulo	TST("alternative first-element indexing");
74204521Srpaulo	IN("[1,5,10,15,20]");
75185377Ssam	SEL("[0]");
76204645Srpaulo	SEL("[3]");
77185377Ssam	SEL("[4]");
78185377Ssam	SEL("[5]");
79185377Ssam
80185377Ssam	TST("one-element array: object");
81185377Ssam	IN("[ { \"first\": true, \"second\": false }]");
82185377Ssam	SEL("0.first");
83185377Ssam	SEL("0.second");
84185377Ssam	SEL("0.third");
85185377Ssam
86185377Ssam	TST("many-element array: integers");
87185377Ssam	IN("[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]");
88185377Ssam	SEL("10"); /* F(10) = 55 */
89185377Ssam	SEL("14"); /* F(14) = 377 */
90185377Ssam	SEL("19");
91185377Ssam
92185377Ssam	TST("many-element array: multiple types");
93185377Ssam	IN2("[\"string\",32,true,{\"a\":9,\"b\":false},100.3e10,false,200.5,",
94185377Ssam	    "{\"key\":\"val\"},null]");
95185377Ssam	SEL("0");
96185377Ssam	SEL("0.notobject");
97185377Ssam	SEL("1");
98185377Ssam	SEL("2");
99185377Ssam	SEL("3");
100185377Ssam	SEL("3.a");
101185377Ssam	SEL("3.b");
102185377Ssam	SEL("3.c");
103185377Ssam	SEL("4");
104185377Ssam	SEL("5");
105185377Ssam	SEL("6");
106185377Ssam	SEL("7");
107185377Ssam	SEL("7.key");
108185377Ssam	SEL("7.key.notobject");
109185377Ssam	SEL("7.nonexist");
110185377Ssam	SEL("8");
111185377Ssam	SEL("9");
112185377Ssam
113185377Ssam	TST("many-element array: multiple types + whitespace");
114185377Ssam	IN2("\n[\t\"string\" ,\t32 , true\t,\t {\"a\":  9,\t\"b\": false},\t\t",
115185377Ssam	    "100.3e10, false, 200.5,{\"key\" \t:\n \"val\"},\t\t null ]\t\t");
116185377Ssam	SEL("0");
117185377Ssam	SEL("0.notobject");
118185377Ssam	SEL("1");
119185377Ssam	SEL("2");
120185377Ssam	SEL("3");
121185377Ssam	SEL("3.a");
122185377Ssam	SEL("3.b");
123185377Ssam	SEL("3.c");
124185377Ssam	SEL("4");
125185377Ssam	SEL("5");
126185377Ssam	SEL("6");
127185377Ssam	SEL("7");
128185377Ssam	SEL("7.key");
129185377Ssam	SEL("7.key.notobject");
130185377Ssam	SEL("7.nonexist");
131185377Ssam	SEL("8");
132185377Ssam	SEL("9");
133185377Ssam
134185377Ssam	TST("two-element array: various string escape codes");
135185377Ssam	IN2("[\"abcd \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\u0000 \\uf00F \", ",
136185377Ssam	    "\"final\"]");
137185377Ssam	SEL("0");
138185377Ssam	SEL("1");
139185377Ssam
140185377Ssam	TST("three-element array: broken escape code");
141185377Ssam	IN("[\"fine here\", \"dodgey \\u00AZ\", \"wont get here\"]");
142185377Ssam	SEL("0");
143185377Ssam	SEL("1");
144185377Ssam	SEL("2");
145185377Ssam
146185377Ssam	TST("nested objects");
147185377Ssam	IN2("{ \"top\": { \"mid\"  : { \"legs\": \"feet\" }, \"number\": 9, ",
148185377Ssam	    "\"array\":[0,1,{\"a\":true,\"bb\":[1,2,false,{\"x\":\"yz\"}]}]}}");
149185377Ssam	SEL("top");
150185377Ssam	SEL("fargo");
151185377Ssam	SEL("top.mid");
152185377Ssam	SEL("top.centre");
153185377Ssam	SEL("top.mid.legs");
154185377Ssam	SEL("top.mid.number");
155185377Ssam	SEL("top.mid.array");
156185377Ssam	SEL("top.number");
157185377Ssam	SEL("top.array");
158185377Ssam	SEL("top.array[0]");
159185377Ssam	SEL("top.array[1]");
160185377Ssam	SEL("top.array[2]");
161185377Ssam	SEL("top.array[2].a");
162185377Ssam	SEL("top.array[2].b");
163185377Ssam	SEL("top.array[2].bb");
164185377Ssam	SEL("top.array[2].bb[0]");
165185377Ssam	SEL("top.array[2].bb[1]");
166185377Ssam	SEL("top.array[2].bb[2]");
167185377Ssam	SEL("top.array[2].bb[3]");
168185377Ssam	SEL("top.array[2].bb[3].x");
169185377Ssam	SEL("top.array[2].bb[3].x.nofurther");
170185377Ssam	SEL("top.array[2].bb[4]");
171185377Ssam	SEL("top.array[3]");
172185377Ssam
173185377Ssam	exit(0);
174185377Ssam}
175185377Ssam
176185377SsamERROR
177185377Ssam{
178185377Ssam	exit(1);
179185377Ssam}
180185377Ssam