1*f2a19305Safresh1use strict; 2*f2a19305Safresh1use warnings; 3*f2a19305Safresh1use Test::More; 4*f2a19305Safresh1use JSON::PP; 5*f2a19305Safresh1 6*f2a19305Safresh1plan tests => 19 * 3 + 1 * 6; 7*f2a19305Safresh1 8*f2a19305Safresh1sub run_test { 9*f2a19305Safresh1 my ($input, $sub) = @_; 10*f2a19305Safresh1 $sub->($input); 11*f2a19305Safresh1} 12*f2a19305Safresh1 13*f2a19305Safresh1run_test('{"one": 1}', sub { 14*f2a19305Safresh1 my $input = shift; 15*f2a19305Safresh1 my $coder = JSON::PP->new; 16*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 17*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 18*f2a19305Safresh1 ok ($res, "curly braces okay -- '$input'"); 19*f2a19305Safresh1 ok (!$e, "no error -- '$input'"); 20*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error"); 21*f2a19305Safresh1}); 22*f2a19305Safresh1 23*f2a19305Safresh1run_test('{"one": 1]', sub { 24*f2a19305Safresh1 my $input = shift; 25*f2a19305Safresh1 my $coder = JSON::PP->new; 26*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 27*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 28*f2a19305Safresh1 ok (!$res, "unbalanced curly braces -- '$input'"); 29*f2a19305Safresh1 ok ($e, "got error -- '$input'"); 30*f2a19305Safresh1 like ($e, qr/, or \} expected while parsing object\/hash/, "'} expected' json string error"); 31*f2a19305Safresh1}); 32*f2a19305Safresh1 33*f2a19305Safresh1run_test('"', sub { 34*f2a19305Safresh1 my $input = shift; 35*f2a19305Safresh1 my $coder = JSON::PP->new; 36*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 37*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 38*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 39*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 40*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 41*f2a19305Safresh1}); 42*f2a19305Safresh1 43*f2a19305Safresh1run_test('{', sub { 44*f2a19305Safresh1 my $input = shift; 45*f2a19305Safresh1 my $coder = JSON::PP->new; 46*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 47*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 48*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 49*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 50*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 51*f2a19305Safresh1}); 52*f2a19305Safresh1 53*f2a19305Safresh1run_test('[', sub { 54*f2a19305Safresh1 my $input = shift; 55*f2a19305Safresh1 my $coder = JSON::PP->new; 56*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 57*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 58*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 59*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 60*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 61*f2a19305Safresh1}); 62*f2a19305Safresh1 63*f2a19305Safresh1run_test('}', sub { 64*f2a19305Safresh1 my $input = shift; 65*f2a19305Safresh1 my $coder = JSON::PP->new; 66*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 67*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 68*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 69*f2a19305Safresh1 ok ($e, "no error for input='$input'"); 70*f2a19305Safresh1 like ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'"); 71*f2a19305Safresh1}); 72*f2a19305Safresh1 73*f2a19305Safresh1run_test(']', sub { 74*f2a19305Safresh1 my $input = shift; 75*f2a19305Safresh1 my $coder = JSON::PP->new; 76*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 77*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 78*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 79*f2a19305Safresh1 ok ($e, "no error for input='$input'"); 80*f2a19305Safresh1 like ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'"); 81*f2a19305Safresh1}); 82*f2a19305Safresh1 83*f2a19305Safresh1run_test('1', sub { 84*f2a19305Safresh1 my $input = shift; 85*f2a19305Safresh1 my $coder = JSON::PP->new; 86*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 87*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 88*f2a19305Safresh1 ok ($res, "truncated input='$input'"); 89*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 90*f2a19305Safresh1 unlike ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'"); 91*f2a19305Safresh1}); 92*f2a19305Safresh1 93*f2a19305Safresh1run_test('1', sub { 94*f2a19305Safresh1 my $input = shift; 95*f2a19305Safresh1 my $coder = JSON::PP->new->allow_nonref(0); 96*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 97*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 98*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 99*f2a19305Safresh1 ok ($e, "no error for input='$input'"); 100*f2a19305Safresh1 like ($e, qr/JSON text must be an object or array/, "'JSON text must be an object or array' json string error for input='$input'"); 101*f2a19305Safresh1}); 102*f2a19305Safresh1 103*f2a19305Safresh1run_test('"1', sub { 104*f2a19305Safresh1 my $input = shift; 105*f2a19305Safresh1 my $coder = JSON::PP->new; 106*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 107*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 108*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 109*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 110*f2a19305Safresh1 unlike ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'"); 111*f2a19305Safresh1}); 112*f2a19305Safresh1 113*f2a19305Safresh1run_test('\\', sub { 114*f2a19305Safresh1 my $input = shift; 115*f2a19305Safresh1 my $coder = JSON::PP->new; 116*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 117*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 118*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 119*f2a19305Safresh1 ok ($e, "no error for input='$input'"); 120*f2a19305Safresh1 like ($e, qr/malformed JSON string/, "'malformed JSON string' json string error for input='$input'"); 121*f2a19305Safresh1}); 122*f2a19305Safresh1 123*f2a19305Safresh1run_test('{"one": "', sub { 124*f2a19305Safresh1 my $input = shift; 125*f2a19305Safresh1 my $coder = JSON::PP->new; 126*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 127*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 128*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 129*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 130*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 131*f2a19305Safresh1}); 132*f2a19305Safresh1 133*f2a19305Safresh1run_test('{"one": {', sub { 134*f2a19305Safresh1 my $input = shift; 135*f2a19305Safresh1 my $coder = JSON::PP->new; 136*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 137*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 138*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 139*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 140*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 141*f2a19305Safresh1}); 142*f2a19305Safresh1 143*f2a19305Safresh1run_test('{"one": [', sub { 144*f2a19305Safresh1 my $input = shift; 145*f2a19305Safresh1 my $coder = JSON::PP->new; 146*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 147*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 148*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 149*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 150*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 151*f2a19305Safresh1}); 152*f2a19305Safresh1 153*f2a19305Safresh1run_test('{"one": t', sub { 154*f2a19305Safresh1 my $input = shift; 155*f2a19305Safresh1 my $coder = JSON::PP->new; 156*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 157*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 158*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 159*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 160*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 161*f2a19305Safresh1}); 162*f2a19305Safresh1 163*f2a19305Safresh1run_test('{"one": \\', sub { 164*f2a19305Safresh1 my $input = shift; 165*f2a19305Safresh1 my $coder = JSON::PP->new; 166*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 167*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 168*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 169*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 170*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 171*f2a19305Safresh1}); 172*f2a19305Safresh1 173*f2a19305Safresh1run_test('{"one": ', sub { 174*f2a19305Safresh1 my $input = shift; 175*f2a19305Safresh1 my $coder = JSON::PP->new; 176*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 177*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 178*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 179*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 180*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 181*f2a19305Safresh1}); 182*f2a19305Safresh1 183*f2a19305Safresh1run_test('{"one": 1', sub { 184*f2a19305Safresh1 my $input = shift; 185*f2a19305Safresh1 my $coder = JSON::PP->new; 186*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 187*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 188*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 189*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 190*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 191*f2a19305Safresh1}); 192*f2a19305Safresh1 193*f2a19305Safresh1run_test('{"one": {"two": 2', sub { 194*f2a19305Safresh1 my $input = shift; 195*f2a19305Safresh1 my $coder = JSON::PP->new; 196*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 197*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 198*f2a19305Safresh1 ok (!$res, "truncated '$input'"); 199*f2a19305Safresh1 ok (!$e, "no error -- '$input'"); 200*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error -- $input"); 201*f2a19305Safresh1}); 202*f2a19305Safresh1 203*f2a19305Safresh1# Test Appending Closing '}' Curly Bracket 204*f2a19305Safresh1run_test('{"one": 1', sub { 205*f2a19305Safresh1 my $input = shift; 206*f2a19305Safresh1 my $coder = JSON::PP->new; 207*f2a19305Safresh1 my $res = eval { $coder->incr_parse($input) }; 208*f2a19305Safresh1 my $e = $@; # test more clobbers $@, we need it twice 209*f2a19305Safresh1 ok (!$res, "truncated input='$input'"); 210*f2a19305Safresh1 ok (!$e, "no error for input='$input'"); 211*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input'"); 212*f2a19305Safresh1 213*f2a19305Safresh1 $res = eval { $coder->incr_parse('}') }; 214*f2a19305Safresh1 $e = $@; # test more clobbers $@, we need it twice 215*f2a19305Safresh1 ok ($res, "truncated input='$input' . '}'"); 216*f2a19305Safresh1 ok (!$e, "no error for input='$input' . '}'"); 217*f2a19305Safresh1 unlike ($e, qr/, or \} expected while parsing object\/hash/, "No '} expected' json string error for input='$input' . '}'"); 218*f2a19305Safresh1}); 219