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": "" \u0022 %22 0x22 034 "", 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