xref: /openbsd-src/gnu/usr.bin/perl/cpan/JSON-PP/t/018_json_checker.t (revision f3efcd0145415b7d44d9da97e0ad5c21b186ac61)
1*f3efcd01Safresh1# copied over from JSON::XS and modified to use JSON::PP
2*f3efcd01Safresh1
35759b3d2Safresh1# use the testsuite from http://www.json.org/JSON_checker/
4898184e3Ssthen# except for fail18.json, as we do not support a depth of 20 (but 16 and 32).
5898184e3Ssthen
6898184e3Ssthenuse strict;
7*f3efcd01Safresh1no warnings;
8898184e3Ssthenuse Test::More;
9*f3efcd01Safresh1BEGIN { plan tests => 38 };
10*f3efcd01Safresh1
11898184e3SsthenBEGIN { $ENV{PERL_JSON_BACKEND} = 0; }
12898184e3Ssthen
13898184e3Ssthenuse JSON::PP;
14898184e3Ssthen
15*f3efcd01Safresh1# emulate JSON_checker default config
16898184e3Ssthenmy $json = JSON::PP->new->utf8->max_depth(32)->canonical;
17898184e3Ssthen
185759b3d2Safresh1my $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/);
195759b3d2Safresh1
20898184e3Ssthenbinmode DATA;
21898184e3Ssthen
22*f3efcd01Safresh1for (;;) {
23898184e3Ssthen   $/ = "\n# ";
24898184e3Ssthen   chomp (my $test = <DATA>)
25898184e3Ssthen      or last;
26898184e3Ssthen   $/ = "\n";
27898184e3Ssthen   my $name = <DATA>;
285759b3d2Safresh1   if ($vax_float && $name =~ /pass1.json/) {
295759b3d2Safresh1       $test =~ s/\b23456789012E66\b/23456789012E20/;
305759b3d2Safresh1   }
31*f3efcd01Safresh1
32898184e3Ssthen   if (my $perl = eval { $json->decode ($test) }) {
33898184e3Ssthen      ok ($name =~ /^pass/, $name);
34898184e3Ssthen      is ($json->encode ($json->decode ($json->encode ($perl))), $json->encode ($perl));
35898184e3Ssthen   } else {
36898184e3Ssthen      ok ($name =~ /^fail/, "$name ($@)");
37898184e3Ssthen   }
38898184e3Ssthen}
39898184e3Ssthen
40898184e3Ssthen__DATA__
41898184e3Ssthen{"Extra value after close": true} "misplaced quoted value"
42898184e3Ssthen# fail10.json
43898184e3Ssthen{"Illegal expression": 1 + 2}
44898184e3Ssthen# fail11.json
45898184e3Ssthen{"Illegal invocation": alert()}
46898184e3Ssthen# fail12.json
47898184e3Ssthen{"Numbers cannot have leading zeroes": 013}
48898184e3Ssthen# fail13.json
49898184e3Ssthen{"Numbers cannot be hex": 0x14}
50898184e3Ssthen# fail14.json
51898184e3Ssthen["Illegal backslash escape: \x15"]
52898184e3Ssthen# fail15.json
53898184e3Ssthen[\naked]
54898184e3Ssthen# fail16.json
55898184e3Ssthen["Illegal backslash escape: \017"]
56898184e3Ssthen# fail17.json
57898184e3Ssthen[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
58898184e3Ssthen# fail18.json
59898184e3Ssthen{"Missing colon" null}
60898184e3Ssthen# fail19.json
61898184e3Ssthen["Unclosed array"
62898184e3Ssthen# fail2.json
63898184e3Ssthen{"Double colon":: null}
64898184e3Ssthen# fail20.json
65898184e3Ssthen{"Comma instead of colon", null}
66898184e3Ssthen# fail21.json
67898184e3Ssthen["Colon instead of comma": false]
68898184e3Ssthen# fail22.json
69898184e3Ssthen["Bad value", truth]
70898184e3Ssthen# fail23.json
71898184e3Ssthen['single quote']
72898184e3Ssthen# fail24.json
73898184e3Ssthen["	tab	character	in	string	"]
74898184e3Ssthen# fail25.json
75898184e3Ssthen["tab\   character\   in\  string\  "]
76898184e3Ssthen# fail26.json
77898184e3Ssthen["line
78898184e3Ssthenbreak"]
79898184e3Ssthen# fail27.json
80898184e3Ssthen["line\
81898184e3Ssthenbreak"]
82898184e3Ssthen# fail28.json
83898184e3Ssthen[0e]
84898184e3Ssthen# fail29.json
85898184e3Ssthen{unquoted_key: "keys must be quoted"}
86898184e3Ssthen# fail3.json
87898184e3Ssthen[0e+]
88898184e3Ssthen# fail30.json
89898184e3Ssthen[0e+-1]
90898184e3Ssthen# fail31.json
91898184e3Ssthen{"Comma instead if closing brace": true,
92898184e3Ssthen# fail32.json
93898184e3Ssthen["mismatch"}
94898184e3Ssthen# fail33.json
95898184e3Ssthen["extra comma",]
96898184e3Ssthen# fail4.json
97898184e3Ssthen["double extra comma",,]
98898184e3Ssthen# fail5.json
99898184e3Ssthen[   , "<-- missing value"]
100898184e3Ssthen# fail6.json
101898184e3Ssthen["Comma after the close"],
102898184e3Ssthen# fail7.json
103898184e3Ssthen["Extra close"]]
104898184e3Ssthen# fail8.json
105898184e3Ssthen{"Extra comma": true,}
106898184e3Ssthen# fail9.json
107898184e3Ssthen[
108*f3efcd01Safresh1    "JSON Test Pattern pass1",
109898184e3Ssthen    {"object with 1 member":["array with 1 element"]},
110898184e3Ssthen    {},
111898184e3Ssthen    [],
112898184e3Ssthen    -42,
113898184e3Ssthen    true,
114898184e3Ssthen    false,
115898184e3Ssthen    null,
116898184e3Ssthen    {
117898184e3Ssthen        "integer": 1234567890,
118898184e3Ssthen        "real": -9876.543210,
119898184e3Ssthen        "e": 0.123456789e-12,
120898184e3Ssthen        "E": 1.234567890E+34,
121898184e3Ssthen        "":  23456789012E66,
122898184e3Ssthen        "zero": 0,
123898184e3Ssthen        "one": 1,
124898184e3Ssthen        "space": " ",
125898184e3Ssthen        "quote": "\"",
126898184e3Ssthen        "backslash": "\\",
127898184e3Ssthen        "controls": "\b\f\n\r\t",
128898184e3Ssthen        "slash": "/ & \/",
129898184e3Ssthen        "alpha": "abcdefghijklmnopqrstuvwyz",
130898184e3Ssthen        "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",
131898184e3Ssthen        "digit": "0123456789",
132898184e3Ssthen        "0123456789": "digit",
133898184e3Ssthen        "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
134898184e3Ssthen        "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
135898184e3Ssthen        "true": true,
136898184e3Ssthen        "false": false,
137898184e3Ssthen        "null": null,
138898184e3Ssthen        "array":[  ],
139898184e3Ssthen        "object":{  },
140898184e3Ssthen        "address": "50 St. James Street",
141*f3efcd01Safresh1        "url": "http://www.JSON.org/",
142898184e3Ssthen        "comment": "// /* <!-- --",
143898184e3Ssthen        "# -- --> */": " ",
144898184e3Ssthen        " s p a c e d " :[1,2 , 3
145898184e3Ssthen
146898184e3Ssthen,
147898184e3Ssthen
148898184e3Ssthen4 , 5        ,          6           ,7        ],"compact":[1,2,3,4,5,6,7],
149898184e3Ssthen        "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}",
150898184e3Ssthen        "quotes": "&#34; \u0022 %22 0x22 034 &#x22;",
151898184e3Ssthen        "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"
152898184e3Ssthen: "A key can be any string"
153898184e3Ssthen    },
154898184e3Ssthen    0.5 ,98.6
155898184e3Ssthen,
156898184e3Ssthen99.44
157898184e3Ssthen,
158898184e3Ssthen
159898184e3Ssthen1066,
160898184e3Ssthen1e1,
161898184e3Ssthen0.1e1,
162898184e3Ssthen1e-1,
163898184e3Ssthen1e00,2e+00,2e-00
164898184e3Ssthen,"rosebud"]
165898184e3Ssthen# pass1.json
166898184e3Ssthen[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
167898184e3Ssthen# pass2.json
168898184e3Ssthen{
169*f3efcd01Safresh1    "JSON Test Pattern pass3": {
170898184e3Ssthen        "The outermost value": "must be an object or array.",
171898184e3Ssthen        "In this test": "It is an object."
172898184e3Ssthen    }
173898184e3Ssthen}
174898184e3Ssthen
175898184e3Ssthen# pass3.json
176