xref: /illumos-gate/usr/src/cmd/dtrace/test/tst/common/json/tst.general.d (revision 20a7641f9918de8574b8b3b47dbe35c4bfc78df1)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2012, Joyent, Inc.  All rights reserved.
14  */
15 
16 /*
17  * General functional tests of JSON parser for json().
18  */
19 
20 #pragma D option quiet
21 #pragma D option strsize=1k
22 
23 #define	TST(name)				\
24 	printf("\ntst |%s|\n", name)
25 #define	IN2(vala, valb)				\
26 	in = strjoin(vala, valb);		\
27 	printf("in  |%s|\n", in)
28 #define	IN(val)					\
29 	in = val;				\
30 	printf("in  |%s|\n", in)
31 #define	SEL(ss)					\
32 	out = json(in, ss);			\
33 	printf("sel |%s|\nout |%s|\n", ss,	\
34 	    out != NULL ? out : "<NULL>")
35 
36 BEGIN
37 {
38 	TST("empty array");
39 	IN("[]");
40 	SEL("0");
41 
42 	TST("one-element array: integer");
43 	IN("[1]");
44 	SEL("0");
45 	SEL("1");
46 	SEL("100");
47 	SEL("-1");
48 
49 	TST("one-element array: hex integer (not in spec, not supported)");
50 	IN("[0x1000]");
51 	SEL("0");
52 
53 	TST("one-element array: float");
54 	IN("[1.5001]");
55 	SEL("0");
56 
57 	TST("one-element array: float + exponent");
58 	IN("[16.3e10]");
59 	SEL("0");
60 
61 	TST("one-element array: integer + whitespace");
62 	IN("[ \t   5\t]");
63 	SEL("0");
64 
65 	TST("one-element array: integer + exponent + whitespace");
66 	IN("[ \t    \t 16E10  \t ]");
67 	SEL("0");
68 
69 	TST("one-element array: string");
70 	IN("[\"alpha\"]");
71 	SEL("0");
72 
73 	TST("alternative first-element indexing");
74 	IN("[1,5,10,15,20]");
75 	SEL("[0]");
76 	SEL("[3]");
77 	SEL("[4]");
78 	SEL("[5]");
79 
80 	TST("one-element array: object");
81 	IN("[ { \"first\": true, \"second\": false }]");
82 	SEL("0.first");
83 	SEL("0.second");
84 	SEL("0.third");
85 
86 	TST("many-element array: integers");
87 	IN("[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]");
88 	SEL("10"); /* F(10) = 55 */
89 	SEL("14"); /* F(14) = 377 */
90 	SEL("19");
91 
92 	TST("many-element array: multiple types");
93 	IN2("[\"string\",32,true,{\"a\":9,\"b\":false},100.3e10,false,200.5,",
94 	    "{\"key\":\"val\"},null]");
95 	SEL("0");
96 	SEL("0.notobject");
97 	SEL("1");
98 	SEL("2");
99 	SEL("3");
100 	SEL("3.a");
101 	SEL("3.b");
102 	SEL("3.c");
103 	SEL("4");
104 	SEL("5");
105 	SEL("6");
106 	SEL("7");
107 	SEL("7.key");
108 	SEL("7.key.notobject");
109 	SEL("7.nonexist");
110 	SEL("8");
111 	SEL("9");
112 
113 	TST("many-element array: multiple types + whitespace");
114 	IN2("\n[\t\"string\" ,\t32 , true\t,\t {\"a\":  9,\t\"b\": false},\t\t",
115 	    "100.3e10, false, 200.5,{\"key\" \t:\n \"val\"},\t\t null ]\t\t");
116 	SEL("0");
117 	SEL("0.notobject");
118 	SEL("1");
119 	SEL("2");
120 	SEL("3");
121 	SEL("3.a");
122 	SEL("3.b");
123 	SEL("3.c");
124 	SEL("4");
125 	SEL("5");
126 	SEL("6");
127 	SEL("7");
128 	SEL("7.key");
129 	SEL("7.key.notobject");
130 	SEL("7.nonexist");
131 	SEL("8");
132 	SEL("9");
133 
134 	TST("two-element array: various string escape codes");
135 	IN2("[\"abcd \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\u0000 \\uf00F \", ",
136 	    "\"final\"]");
137 	SEL("0");
138 	SEL("1");
139 
140 	TST("three-element array: broken escape code");
141 	IN("[\"fine here\", \"dodgey \\u00AZ\", \"wont get here\"]");
142 	SEL("0");
143 	SEL("1");
144 	SEL("2");
145 
146 	TST("nested objects");
147 	IN2("{ \"top\": { \"mid\"  : { \"legs\": \"feet\" }, \"number\": 9, ",
148 	    "\"array\":[0,1,{\"a\":true,\"bb\":[1,2,false,{\"x\":\"yz\"}]}]}}");
149 	SEL("top");
150 	SEL("fargo");
151 	SEL("top.mid");
152 	SEL("top.centre");
153 	SEL("top.mid.legs");
154 	SEL("top.mid.number");
155 	SEL("top.mid.array");
156 	SEL("top.number");
157 	SEL("top.array");
158 	SEL("top.array[0]");
159 	SEL("top.array[1]");
160 	SEL("top.array[2]");
161 	SEL("top.array[2].a");
162 	SEL("top.array[2].b");
163 	SEL("top.array[2].bb");
164 	SEL("top.array[2].bb[0]");
165 	SEL("top.array[2].bb[1]");
166 	SEL("top.array[2].bb[2]");
167 	SEL("top.array[2].bb[3]");
168 	SEL("top.array[2].bb[3].x");
169 	SEL("top.array[2].bb[3].x.nofurther");
170 	SEL("top.array[2].bb[4]");
171 	SEL("top.array[3]");
172 
173 	exit(0);
174 }
175 
176 ERROR
177 {
178 	exit(1);
179 }
180