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