1266987Smarkj/* 2266987Smarkj * This file and its contents are supplied under the terms of the 3266987Smarkj * Common Development and Distribution License ("CDDL"), version 1.0. 4266987Smarkj * You may only use this file in accordance with the terms of version 5266987Smarkj * 1.0 of the CDDL. 6266987Smarkj * 7266987Smarkj * A full copy of the text of the CDDL should have accompanied this 8266987Smarkj * source. A copy of the CDDL is also available via the Internet at 9266987Smarkj * http://www.illumos.org/license/CDDL. 10266987Smarkj */ 11266987Smarkj 12266987Smarkj/* 13266987Smarkj * Copyright 2012, Joyent, Inc. All rights reserved. 14266987Smarkj */ 15266987Smarkj 16266987Smarkj/* 17266987Smarkj * General functional tests of JSON parser for json(). 18266987Smarkj */ 19266987Smarkj 20266987Smarkj#pragma D option quiet 21266987Smarkj#pragma D option strsize=1k 22266987Smarkj 23266987Smarkj#define TST(name) \ 24266987Smarkj printf("\ntst |%s|\n", name) 25266987Smarkj#define IN2(vala, valb) \ 26266987Smarkj in = strjoin(vala, valb); \ 27266987Smarkj printf("in |%s|\n", in) 28266987Smarkj#define IN(val) \ 29266987Smarkj in = val; \ 30266987Smarkj printf("in |%s|\n", in) 31266987Smarkj#define SEL(ss) \ 32266987Smarkj out = json(in, ss); \ 33266987Smarkj printf("sel |%s|\nout |%s|\n", ss, \ 34266987Smarkj out != NULL ? out : "<NULL>") 35266987Smarkj 36266987SmarkjBEGIN 37266987Smarkj{ 38266987Smarkj TST("empty array"); 39266987Smarkj IN("[]"); 40266987Smarkj SEL("0"); 41266987Smarkj 42266987Smarkj TST("one-element array: integer"); 43266987Smarkj IN("[1]"); 44266987Smarkj SEL("0"); 45266987Smarkj SEL("1"); 46266987Smarkj SEL("100"); 47266987Smarkj SEL("-1"); 48266987Smarkj 49266987Smarkj TST("one-element array: hex integer (not in spec, not supported)"); 50266987Smarkj IN("[0x1000]"); 51266987Smarkj SEL("0"); 52266987Smarkj 53266987Smarkj TST("one-element array: float"); 54266987Smarkj IN("[1.5001]"); 55266987Smarkj SEL("0"); 56266987Smarkj 57266987Smarkj TST("one-element array: float + exponent"); 58266987Smarkj IN("[16.3e10]"); 59266987Smarkj SEL("0"); 60266987Smarkj 61266987Smarkj TST("one-element array: integer + whitespace"); 62266987Smarkj IN("[ \t 5\t]"); 63266987Smarkj SEL("0"); 64266987Smarkj 65266987Smarkj TST("one-element array: integer + exponent + whitespace"); 66266987Smarkj IN("[ \t \t 16E10 \t ]"); 67266987Smarkj SEL("0"); 68266987Smarkj 69266987Smarkj TST("one-element array: string"); 70266987Smarkj IN("[\"alpha\"]"); 71266987Smarkj SEL("0"); 72266987Smarkj 73266987Smarkj TST("alternative first-element indexing"); 74266987Smarkj IN("[1,5,10,15,20]"); 75266987Smarkj SEL("[0]"); 76266987Smarkj SEL("[3]"); 77266987Smarkj SEL("[4]"); 78266987Smarkj SEL("[5]"); 79266987Smarkj 80266987Smarkj TST("one-element array: object"); 81266987Smarkj IN("[ { \"first\": true, \"second\": false }]"); 82266987Smarkj SEL("0.first"); 83266987Smarkj SEL("0.second"); 84266987Smarkj SEL("0.third"); 85266987Smarkj 86266987Smarkj TST("many-element array: integers"); 87266987Smarkj IN("[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]"); 88266987Smarkj SEL("10"); /* F(10) = 55 */ 89266987Smarkj SEL("14"); /* F(14) = 377 */ 90266987Smarkj SEL("19"); 91266987Smarkj 92266987Smarkj TST("many-element array: multiple types"); 93266987Smarkj IN2("[\"string\",32,true,{\"a\":9,\"b\":false},100.3e10,false,200.5,", 94266987Smarkj "{\"key\":\"val\"},null]"); 95266987Smarkj SEL("0"); 96266987Smarkj SEL("0.notobject"); 97266987Smarkj SEL("1"); 98266987Smarkj SEL("2"); 99266987Smarkj SEL("3"); 100266987Smarkj SEL("3.a"); 101266987Smarkj SEL("3.b"); 102266987Smarkj SEL("3.c"); 103266987Smarkj SEL("4"); 104266987Smarkj SEL("5"); 105266987Smarkj SEL("6"); 106266987Smarkj SEL("7"); 107266987Smarkj SEL("7.key"); 108266987Smarkj SEL("7.key.notobject"); 109266987Smarkj SEL("7.nonexist"); 110266987Smarkj SEL("8"); 111266987Smarkj SEL("9"); 112266987Smarkj 113266987Smarkj TST("many-element array: multiple types + whitespace"); 114266987Smarkj IN2("\n[\t\"string\" ,\t32 , true\t,\t {\"a\": 9,\t\"b\": false},\t\t", 115266987Smarkj "100.3e10, false, 200.5,{\"key\" \t:\n \"val\"},\t\t null ]\t\t"); 116266987Smarkj SEL("0"); 117266987Smarkj SEL("0.notobject"); 118266987Smarkj SEL("1"); 119266987Smarkj SEL("2"); 120266987Smarkj SEL("3"); 121266987Smarkj SEL("3.a"); 122266987Smarkj SEL("3.b"); 123266987Smarkj SEL("3.c"); 124266987Smarkj SEL("4"); 125266987Smarkj SEL("5"); 126266987Smarkj SEL("6"); 127266987Smarkj SEL("7"); 128266987Smarkj SEL("7.key"); 129266987Smarkj SEL("7.key.notobject"); 130266987Smarkj SEL("7.nonexist"); 131266987Smarkj SEL("8"); 132266987Smarkj SEL("9"); 133266987Smarkj 134266987Smarkj TST("two-element array: various string escape codes"); 135266987Smarkj IN2("[\"abcd \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\u0000 \\uf00F \", ", 136266987Smarkj "\"final\"]"); 137266987Smarkj SEL("0"); 138266987Smarkj SEL("1"); 139266987Smarkj 140266987Smarkj TST("three-element array: broken escape code"); 141266987Smarkj IN("[\"fine here\", \"dodgey \\u00AZ\", \"wont get here\"]"); 142266987Smarkj SEL("0"); 143266987Smarkj SEL("1"); 144266987Smarkj SEL("2"); 145266987Smarkj 146266987Smarkj TST("nested objects"); 147266987Smarkj IN2("{ \"top\": { \"mid\" : { \"legs\": \"feet\" }, \"number\": 9, ", 148266987Smarkj "\"array\":[0,1,{\"a\":true,\"bb\":[1,2,false,{\"x\":\"yz\"}]}]}}"); 149266987Smarkj SEL("top"); 150266987Smarkj SEL("fargo"); 151266987Smarkj SEL("top.mid"); 152266987Smarkj SEL("top.centre"); 153266987Smarkj SEL("top.mid.legs"); 154266987Smarkj SEL("top.mid.number"); 155266987Smarkj SEL("top.mid.array"); 156266987Smarkj SEL("top.number"); 157266987Smarkj SEL("top.array"); 158266987Smarkj SEL("top.array[0]"); 159266987Smarkj SEL("top.array[1]"); 160266987Smarkj SEL("top.array[2]"); 161266987Smarkj SEL("top.array[2].a"); 162266987Smarkj SEL("top.array[2].b"); 163266987Smarkj SEL("top.array[2].bb"); 164266987Smarkj SEL("top.array[2].bb[0]"); 165266987Smarkj SEL("top.array[2].bb[1]"); 166266987Smarkj SEL("top.array[2].bb[2]"); 167266987Smarkj SEL("top.array[2].bb[3]"); 168266987Smarkj SEL("top.array[2].bb[3].x"); 169266987Smarkj SEL("top.array[2].bb[3].x.nofurther"); 170266987Smarkj SEL("top.array[2].bb[4]"); 171266987Smarkj SEL("top.array[3]"); 172266987Smarkj 173266987Smarkj exit(0); 174266987Smarkj} 175266987Smarkj 176266987SmarkjERROR 177266987Smarkj{ 178266987Smarkj exit(1); 179266987Smarkj} 180