]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/json/tst.general.d
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / cddl / contrib / opensolaris / cmd / dtrace / test / tst / common / json / tst.general.d
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 }