diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/json/tests | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/json/tests')
42 files changed, 4396 insertions, 0 deletions
diff --git a/ext/json/tests/001.phpt b/ext/json/tests/001.phpt new file mode 100644 index 0000000..02d43c4 --- /dev/null +++ b/ext/json/tests/001.phpt @@ -0,0 +1,71 @@ +--TEST-- +json_decode() tests +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +var_dump(json_decode()); +var_dump(json_decode("")); +var_dump(json_decode("", 1)); +var_dump(json_decode("", 0)); +var_dump(json_decode(".", 1)); +var_dump(json_decode(".", 0)); +var_dump(json_decode("<?>")); +var_dump(json_decode(";")); +var_dump(json_decode("руссиш")); +var_dump(json_decode("blah")); +var_dump(json_decode(NULL)); +var_dump(json_decode('{ "test": { "foo": "bar" } }')); +var_dump(json_decode('{ "test": { "foo": "" } }')); +var_dump(json_decode('{ "": { "foo": "" } }')); +var_dump(json_decode('{ "": { "": "" } }')); +var_dump(json_decode('{ "": { "": "" }')); +var_dump(json_decode('{ "": "": "" } }')); + +?> +===DONE=== +--EXPECTF-- +Warning: json_decode() expects at least 1 parameter, 0 given in %s on line %d +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +NULL +object(stdClass)#%d (1) { + ["test"]=> + object(stdClass)#%d (1) { + ["foo"]=> + string(3) "bar" + } +} +object(stdClass)#%d (1) { + ["test"]=> + object(stdClass)#%d (1) { + ["foo"]=> + string(0) "" + } +} +object(stdClass)#%d (1) { + ["_empty_"]=> + object(stdClass)#%d (1) { + ["foo"]=> + string(0) "" + } +} +object(stdClass)#%d (1) { + ["_empty_"]=> + object(stdClass)#%d (1) { + ["_empty_"]=> + string(0) "" + } +} +NULL +NULL +===DONE=== diff --git a/ext/json/tests/002.phpt b/ext/json/tests/002.phpt new file mode 100644 index 0000000..5959d4a --- /dev/null +++ b/ext/json/tests/002.phpt @@ -0,0 +1,38 @@ +--TEST-- +json_encode() tests +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +var_dump(json_encode("")); +var_dump(json_encode(NULL)); +var_dump(json_encode(TRUE)); + +var_dump(json_encode(array(""=>""))); +var_dump(json_encode(array(array(1)))); +var_dump(json_encode(array())); + +var_dump(json_encode(array(""=>""), JSON_FORCE_OBJECT)); +var_dump(json_encode(array(array(1)), JSON_FORCE_OBJECT)); +var_dump(json_encode(array(), JSON_FORCE_OBJECT)); + +var_dump(json_encode(1)); +var_dump(json_encode("руссиш")); + + +echo "Done\n"; +?> +--EXPECTF-- +string(2) """" +string(4) "null" +string(4) "true" +string(7) "{"":""}" +string(5) "[[1]]" +string(2) "[]" +string(7) "{"":""}" +string(13) "{"0":{"0":1}}" +string(2) "{}" +string(1) "1" +string(38) ""\u0440\u0443\u0441\u0441\u0438\u0448"" +Done diff --git a/ext/json/tests/003.phpt b/ext/json/tests/003.phpt new file mode 100644 index 0000000..3b52fb0 --- /dev/null +++ b/ext/json/tests/003.phpt @@ -0,0 +1,30 @@ +--TEST-- +json_encode() & endless loop - 1 +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$a = array(); +$a[] = &$a; + +var_dump($a); +var_dump(json_encode($a)); + +/* Break circular data structure to prevent memory leaks */ +unset($a[0]); + +echo "Done\n"; +?> +--EXPECTF-- +array(1) { + [0]=> + &array(1) { + [0]=> + *RECURSION* + } +} + +Warning: json_encode(): recursion detected in %s on line %d +string(8) "[[null]]" +Done diff --git a/ext/json/tests/004.phpt b/ext/json/tests/004.phpt new file mode 100644 index 0000000..1d282f9 --- /dev/null +++ b/ext/json/tests/004.phpt @@ -0,0 +1,24 @@ +--TEST-- +json_encode() & endless loop - 2 +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$a = new stdclass; +$a->prop = $a; + +var_dump($a); +var_dump(json_encode($a)); + +echo "Done\n"; +?> +--EXPECTF-- +object(stdClass)#%d (1) { + ["prop"]=> + *RECURSION* +} + +Warning: json_encode(): recursion detected in %s on line %d +string(22) "{"prop":{"prop":null}}" +Done diff --git a/ext/json/tests/005.phpt b/ext/json/tests/005.phpt new file mode 100644 index 0000000..01a307f --- /dev/null +++ b/ext/json/tests/005.phpt @@ -0,0 +1,23 @@ +--TEST-- +json_encode() & endless loop - 3 +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$a = array(); +$a[] = $a; + +var_dump($a); +var_dump(json_encode($a)); + +echo "Done\n"; +?> +--EXPECTF-- +array(1) { + [0]=> + array(0) { + } +} +string(4) "[[]]" +Done diff --git a/ext/json/tests/006.phpt b/ext/json/tests/006.phpt new file mode 100644 index 0000000..e1d4b46 --- /dev/null +++ b/ext/json/tests/006.phpt @@ -0,0 +1,23 @@ +--TEST-- +json_encode() & extended encoding +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$a = array('<foo>',"'bar'",'"baz"','&blong&'); + +echo "Normal: ", json_encode($a), "\n"; +echo "Tags: ", json_encode($a,JSON_HEX_TAG), "\n"; +echo "Apos: ", json_encode($a,JSON_HEX_APOS), "\n"; +echo "Quot: ", json_encode($a,JSON_HEX_QUOT), "\n"; +echo "Amp: ", json_encode($a,JSON_HEX_AMP), "\n"; +echo "All: ", json_encode($a,JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_HEX_AMP), "\n"; +?> +--EXPECT-- +Normal: ["<foo>","'bar'","\"baz\"","&blong&"] +Tags: ["\u003Cfoo\u003E","'bar'","\"baz\"","&blong&"] +Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&"] +Quot: ["<foo>","'bar'","\u0022baz\u0022","&blong&"] +Amp: ["<foo>","'bar'","\"baz\"","\u0026blong\u0026"] +All: ["\u003Cfoo\u003E","\u0027bar\u0027","\u0022baz\u0022","\u0026blong\u0026"] diff --git a/ext/json/tests/007.phpt b/ext/json/tests/007.phpt new file mode 100644 index 0000000..9ee190a --- /dev/null +++ b/ext/json/tests/007.phpt @@ -0,0 +1,36 @@ +--TEST-- +json_last_error() tests +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +var_dump(json_decode("[1]")); +var_dump(json_last_error()); +var_dump(json_decode("[[1]]", false, 2)); +var_dump(json_last_error()); +var_dump(json_decode("[1}")); +var_dump(json_last_error()); +var_dump(json_decode('["' . chr(0) . 'abcd"]')); +var_dump(json_last_error()); +var_dump(json_decode("[1")); +var_dump(json_last_error()); + + +echo "Done\n"; +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +int(0) +NULL +int(1) +NULL +int(2) +NULL +int(3) +NULL +int(4) +Done + diff --git a/ext/json/tests/008.phpt b/ext/json/tests/008.phpt new file mode 100644 index 0000000..f2354d3 --- /dev/null +++ b/ext/json/tests/008.phpt @@ -0,0 +1,17 @@ +--TEST-- +json_decode() with large integers +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +$json = '{"largenum":123456789012345678901234567890}'; +$x = json_decode($json); +var_dump($x->largenum); +$x = json_decode($json, false, 512, JSON_BIGINT_AS_STRING); +var_dump($x->largenum); +echo "Done\n"; +?> +--EXPECT-- +float(1.2345678901235E+29) +string(30) "123456789012345678901234567890" +Done diff --git a/ext/json/tests/bug40503.phpt b/ext/json/tests/bug40503.phpt new file mode 100644 index 0000000..48f18a4 --- /dev/null +++ b/ext/json/tests/bug40503.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #40503 (json_encode() value corruption on 32bit systems with overflown values) +--INI-- +precision=14 +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +function show_eq($x,$y) { + echo "$x ". ($x==$y ? "==" : "!=") ." $y\n"; +} + +$value = 0x7FFFFFFF; #2147483647; +show_eq("$value", json_encode($value)); +$value++; +show_eq("$value", json_encode($value)); + +?> +--EXPECT-- +2147483647 == 2147483647 +2147483648 == 2147483648 diff --git a/ext/json/tests/bug41034.phpt b/ext/json/tests/bug41034.phpt new file mode 100644 index 0000000..cc77041 --- /dev/null +++ b/ext/json/tests/bug41034.phpt @@ -0,0 +1,12 @@ +--TEST-- +Bug #41034 (json_encode() ignores null byte started keys in arrays) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +echo json_encode(array(0,"\0ab"=>1,"\0null-prefixed value")); +echo "\nDone\n"; +?> +--EXPECT-- +{"0":0,"\u0000ab":1,"1":"\u0000null-prefixed value"} +Done diff --git a/ext/json/tests/bug41067.phpt b/ext/json/tests/bug41067.phpt new file mode 100644 index 0000000..b20e6e1 --- /dev/null +++ b/ext/json/tests/bug41067.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug #41067 (json_encode() problem with UTF-16 input) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +$single_barline = "\360\235\204\200"; +$array = array($single_barline); +print bin2hex($single_barline) . "\n"; +// print $single_barline . "\n\n"; +$json = json_encode($array); +print $json . "\n\n"; +$json_decoded = json_decode($json, true); +// print $json_decoded[0] . "\n"; +print bin2hex($json_decoded[0]) . "\n"; +print "END\n"; +?> +--EXPECT-- +f09d8480 +["\ud834\udd00"] + +f09d8480 +END diff --git a/ext/json/tests/bug41403.phpt b/ext/json/tests/bug41403.phpt new file mode 100644 index 0000000..1a73431 --- /dev/null +++ b/ext/json/tests/bug41403.phpt @@ -0,0 +1,44 @@ +--TEST-- +Bug #41403 (json_decode cannot decode floats if localeconv decimal_point is not '.') +--SKIPIF-- +<?php + +if (!extension_loaded('json')) die('skip'); + +if (setlocale(LC_NUMERIC, "de_DE") === false) { + die("skip no de_DE locale"); +} +?> +--INI-- +precision=14 +--FILE-- +<?php + +setlocale(LC_NUMERIC, 'de_DE'); +var_dump(json_decode('[2.1]')); +var_dump(json_decode('[0.15]')); +var_dump(json_decode('[123.13452345]')); +var_dump(json_decode('[123,13452345]')); + +echo "Done\n"; +?> +--EXPECTF-- +array(1) { + [0]=> + float(2,1) +} +array(1) { + [0]=> + float(0,15) +} +array(1) { + [0]=> + float(123,13452345) +} +array(2) { + [0]=> + int(123) + [1]=> + int(13452345) +} +Done diff --git a/ext/json/tests/bug41504.phpt b/ext/json/tests/bug41504.phpt new file mode 100644 index 0000000..bef4974 --- /dev/null +++ b/ext/json/tests/bug41504.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #41504 (json_decode() converts empty array keys to "_empty_") +--SKIPIF-- +<?php if (!extension_loaded('json')) print 'skip'; ?> +--FILE-- +<?php + +var_dump(json_decode('{"":"value"}', true)); +var_dump(json_decode('{"":"value", "key":"value"}', true)); +var_dump(json_decode('{"key":"value", "":"value"}', true)); + +echo "Done\n"; +?> +--EXPECT-- +array(1) { + [""]=> + string(5) "value" +} +array(2) { + [""]=> + string(5) "value" + ["key"]=> + string(5) "value" +} +array(2) { + ["key"]=> + string(5) "value" + [""]=> + string(5) "value" +} +Done diff --git a/ext/json/tests/bug41567.phpt b/ext/json/tests/bug41567.phpt new file mode 100644 index 0000000..a253a47 --- /dev/null +++ b/ext/json/tests/bug41567.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #41567 (json_encode() double conversion is inconsistent with PHP) +--INI-- +precision=14 +--SKIPIF-- +<?php if (!extension_loaded('json')) print 'skip'; ?> +--FILE-- +<?php + +$a = json_encode(123456789.12345); +var_dump(json_decode($a)); + +echo "Done\n"; +?> +--EXPECT-- +float(123456789.12345) +Done diff --git a/ext/json/tests/bug42090.phpt b/ext/json/tests/bug42090.phpt new file mode 100644 index 0000000..9e5b331 --- /dev/null +++ b/ext/json/tests/bug42090.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #42090 (json_decode causes segmentation fault) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +var_dump( + json_decode('""'), + json_decode('"..".'), + json_decode('"'), + json_decode('""""'), + json_encode('"'), + json_decode(json_encode('"')), + json_decode(json_encode('""')) +); +?> +--EXPECT-- +string(0) "" +NULL +NULL +NULL +string(4) ""\""" +string(1) """ +string(2) """" diff --git a/ext/json/tests/bug42785.phpt b/ext/json/tests/bug42785.phpt new file mode 100644 index 0000000..7bdadbe --- /dev/null +++ b/ext/json/tests/bug42785.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #42785 (Incorrect formatting of double values with non-english locales) +--SKIPIF-- +<?php + if (!extension_loaded("json")) { + print "skip"; + } else if (!setlocale(LC_CTYPE, "de_DE", "de", "german", "ge", "de_DE.ISO8859-1", "ISO8859-1")) { + die("skip locale needed for this test is not supported on this platform"); + } +?> +--FILE-- +<?php +setlocale(LC_ALL, "de_DE", "de", "german", "ge", "de_DE.ISO8859-1", "ISO8859-1"); + +$foo = Array(100.10,"bar"); +var_dump(json_encode($foo)); + +Class bar {} +$bar1 = new bar; +$bar1->a = 100.10; +$bar1->b = "foo"; +var_dump(json_encode($bar1)); +?> +--EXPECT-- +string(13) "[100.1,"bar"]" +string(21) "{"a":100.1,"b":"foo"}" diff --git a/ext/json/tests/bug43941.phpt b/ext/json/tests/bug43941.phpt new file mode 100644 index 0000000..0f86d1d --- /dev/null +++ b/ext/json/tests/bug43941.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #43941 (json_encode() invalid UTF-8) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +var_dump(json_encode("abc")); +var_dump(json_encode("ab\xE0")); +var_dump(json_encode("ab\xE0c")); +var_dump(json_encode(array("ab\xE0", "ab\xE0c", "abc"))); + +echo "Done\n"; +?> +--EXPECTF-- +string(5) ""abc"" +string(4) "null" +string(4) "null" +string(17) "[null,null,"abc"]" +Done + diff --git a/ext/json/tests/bug45791.phpt b/ext/json/tests/bug45791.phpt new file mode 100644 index 0000000..7d37068 --- /dev/null +++ b/ext/json/tests/bug45791.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #45791 (json_decode() does not handle number 0e0) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +var_dump(json_decode('{"zero": 0e0}')); + +?> +--EXPECT-- +object(stdClass)#1 (1) { + ["zero"]=> + float(0) +} diff --git a/ext/json/tests/bug46215.phpt b/ext/json/tests/bug46215.phpt new file mode 100644 index 0000000..0ac460c --- /dev/null +++ b/ext/json/tests/bug46215.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #46215 (json_encode mutates its parameter and has some class-specific state) +--SKIPIF-- +<?php +if (!extension_loaded("json")) { + die('skip JSON extension not available in this build'); +} +?> +--FILE-- +<?php + +class foo { + protected $a = array(); +} + +$a = new foo; +$x = json_encode($a); + +print_r($a); + +?> +--EXPECT-- +foo Object +( + [a:protected] => Array + ( + ) + +) diff --git a/ext/json/tests/bug46944.phpt b/ext/json/tests/bug46944.phpt new file mode 100644 index 0000000..812a548 --- /dev/null +++ b/ext/json/tests/bug46944.phpt @@ -0,0 +1,35 @@ +--TEST-- +Bug #46944 (json_encode() doesn't handle 3 byte utf8 correctly) +--SKIPIF-- +<?php if (!extension_loaded('json')) print 'skip'; ?> +--FILE-- +<?php + +for ($i = 1; $i <= 16; $i++) { + $first = 0xf0|($i >> 2); + $second = 0x8f|($i & 3) << 4; + $string = sprintf("aa%c%c\xbf\xbdzz", $first, $second); + echo json_encode($string) . "\n"; +} + + +echo "Done\n"; +?> +--EXPECT-- +"aa\ud83f\udffdzz" +"aa\ud87f\udffdzz" +"aa\ud8bf\udffdzz" +"aa\ud8ff\udffdzz" +"aa\ud93f\udffdzz" +"aa\ud97f\udffdzz" +"aa\ud9bf\udffdzz" +"aa\ud9ff\udffdzz" +"aa\uda3f\udffdzz" +"aa\uda7f\udffdzz" +"aa\udabf\udffdzz" +"aa\udaff\udffdzz" +"aa\udb3f\udffdzz" +"aa\udb7f\udffdzz" +"aa\udbbf\udffdzz" +"aa\udbff\udffdzz" +Done diff --git a/ext/json/tests/bug47644.phpt b/ext/json/tests/bug47644.phpt new file mode 100644 index 0000000..5e996b6 --- /dev/null +++ b/ext/json/tests/bug47644.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #47644 (valid large integers are truncated) +--SKIPIF-- +<?php + if (!extension_loaded('json')) die('skip: json extension not available'); + if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); +?> +--FILE-- +<?php + +for ($i = 10000000000000000; $i < 10000000000000006; $i++) { + var_dump(json_decode("[$i]")); +} + + +echo "Done\n"; +?> +--EXPECT-- +array(1) { + [0]=> + int(10000000000000000) +} +array(1) { + [0]=> + int(10000000000000001) +} +array(1) { + [0]=> + int(10000000000000002) +} +array(1) { + [0]=> + int(10000000000000003) +} +array(1) { + [0]=> + int(10000000000000004) +} +array(1) { + [0]=> + int(10000000000000005) +} +Done diff --git a/ext/json/tests/bug53946.phpt b/ext/json/tests/bug53946.phpt new file mode 100644 index 0000000..abbb812 --- /dev/null +++ b/ext/json/tests/bug53946.phpt @@ -0,0 +1,16 @@ +--TEST-- +bug #53946 (json_encode() with JSON_UNESCAPED_UNICODE) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +var_dump(json_encode("latin 1234 -/ russian мама мыла раму specialchars \x02 \x08 \n U+1D11E >𝄞<")); +var_dump(json_encode("latin 1234 -/ russian мама мыла раму specialchars \x02 \x08 \n U+1D11E >𝄞<", JSON_UNESCAPED_UNICODE)); +var_dump(json_encode("ab\xE0")); +var_dump(json_encode("ab\xE0", JSON_UNESCAPED_UNICODE)); +?> +--EXPECT-- +string(156) ""latin 1234 -\/ russian \u043c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443 specialchars \u0002 \b \n U+1D11E >\ud834\udd1e<"" +string(100) ""latin 1234 -\/ russian мама мыла раму specialchars \u0002 \b \n U+1D11E >𝄞<"" +string(4) "null" +string(4) "null" diff --git a/ext/json/tests/bug54058.phpt b/ext/json/tests/bug54058.phpt new file mode 100644 index 0000000..3b1136b --- /dev/null +++ b/ext/json/tests/bug54058.phpt @@ -0,0 +1,35 @@ +--TEST-- +Bug #54058 (json_last_error() invalid UTF-8 produces wrong error) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +$bad_utf8 = quoted_printable_decode('=B0'); + +json_encode($bad_utf8); +var_dump(json_last_error()); + +$a = new stdclass; +$a->foo = quoted_printable_decode('=B0'); +json_encode($a); +var_dump(json_last_error()); + +$b = new stdclass; +$b->foo = $bad_utf8; +$b->bar = 1; +json_encode($b); +var_dump(json_last_error()); + +$c = array( + 'foo' => $bad_utf8, + 'bar' => 1 +); +json_encode($c); +var_dump(json_last_error()); +?> +--EXPECTF-- +int(5) +int(5) +int(5) +int(5) diff --git a/ext/json/tests/bug54484.phpt b/ext/json/tests/bug54484.phpt new file mode 100644 index 0000000..d698ab5 --- /dev/null +++ b/ext/json/tests/bug54484.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #54484 (Empty string in json_decode doesn't reset json_last_error) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +json_decode('{"test":"test"}'); +var_dump(json_last_error()); + +json_decode(""); +var_dump(json_last_error()); + + +json_decode("invalid json"); +var_dump(json_last_error()); + + +json_decode(""); +var_dump(json_last_error()); +?> +--EXPECT-- +int(0) +int(0) +int(4) +int(0) diff --git a/ext/json/tests/bug55543.phpt b/ext/json/tests/bug55543.phpt new file mode 100644 index 0000000..8657fe7 --- /dev/null +++ b/ext/json/tests/bug55543.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #55543 (json_encode() with JSON_NUMERIC_CHECK & numeric string properties) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +$a = new stdClass; +$a->{"1"} = "5"; + +var_dump(json_encode($a, JSON_NUMERIC_CHECK)); +?> +--EXPECT-- +string(7) "{"1":5}" diff --git a/ext/json/tests/bug61978.phpt b/ext/json/tests/bug61978.phpt new file mode 100644 index 0000000..2c73297 --- /dev/null +++ b/ext/json/tests/bug61978.phpt @@ -0,0 +1,47 @@ +--TEST-- +Bug #61978 (Object recursion not detected for classes that implement JsonSerializable) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +class JsonTest1 { + public $test; + public $me; + public function __construct() { + $this->test = '123'; + $this->me = $this; + } +} + +class JsonTest2 implements JsonSerializable { + public $test; + public function __construct() { + $this->test = '123'; + } + public function jsonSerialize() { + return array( + 'test' => $this->test, + 'me' => $this + ); + } +} + + +$obj1 = new JsonTest1(); +var_dump(json_encode($obj1)); + +echo "\n==\n"; + +$obj2 = new JsonTest2(); +var_dump(json_encode($obj2)); + +?> +--EXPECTF-- +Warning: json_encode(): recursion detected in %s on line %d +string(44) "{"test":"123","me":{"test":"123","me":null}}" + +== + +Warning: json_encode(): recursion detected in %s on line %d +string(44) "{"test":"123","me":{"test":"123","me":null}}" diff --git a/ext/json/tests/bug63737.phpt b/ext/json/tests/bug63737.phpt new file mode 100644 index 0000000..1fb06d4 --- /dev/null +++ b/ext/json/tests/bug63737.phpt @@ -0,0 +1,32 @@ +--TEST-- +Bug #63737 (json_decode does not properly decode with options parameter) +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +function decode($json) { + $x = json_decode($json); + var_dump($x); + $x = json_decode($json, false, 512, JSON_BIGINT_AS_STRING); + var_dump($x); +} + +decode('123456789012345678901234567890'); +decode('-123456789012345678901234567890'); + +// This shouldn't affect floats, but let's check that. +decode('123456789012345678901234567890.1'); +decode('-123456789012345678901234567890.1'); + +echo "Done\n"; +?> +--EXPECT-- +float(1.2345678901235E+29) +string(30) "123456789012345678901234567890" +float(-1.2345678901235E+29) +string(31) "-123456789012345678901234567890" +float(1.2345678901235E+29) +float(1.2345678901235E+29) +float(-1.2345678901235E+29) +float(-1.2345678901235E+29) +Done diff --git a/ext/json/tests/fail001.phpt b/ext/json/tests/fail001.phpt new file mode 100644 index 0000000..1bf9f12 --- /dev/null +++ b/ext/json/tests/fail001.phpt @@ -0,0 +1,166 @@ +--TEST-- +JSON (http://www.crockford.com/JSON/JSON_checker/test/fail*.json) +--SKIPIF-- +<?php + if (!extension_loaded('json')) die('skip: json extension not available'); +?> +--FILE-- +<?php + +$tests = array('"A JSON payload should be an object or array, not a string."', + '["Unclosed array"', + '{unquoted_key: "keys must be quoted}', + '["extra comma",]', + '["double extra comma",,]', + '[ , "<-- missing value"]', + '["Comma after the close"],', + '["Extra close"]]', + '{"Extra comma": true,}', + '{"Extra value after close": true} "misplaced quoted value"', + '{"Illegal expression": 1 + 2}', + '{"Illegal invocation": alert()}', + '{"Numbers cannot have leading zeroes": 013}', + '{"Numbers cannot be hex": 0x14}', + '["Illegal backslash escape: \\x15"]', + '["Illegal backslash escape: \\\'"]', + '["Illegal backslash escape: \\017"]', + '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]', + '{"Missing colon" null}', + '{"Double colon":: null}', + '{"Comma instead of colon", null}', + '["Colon instead of comma": false]', + '["Bad value", truth]', + "['single quote']"); + +foreach ($tests as $test) +{ + echo 'Testing: ' . $test . "\n"; + echo "AS OBJECT\n"; + var_dump(json_decode($test)); + echo "AS ARRAY\n"; + var_dump(json_decode($test, true)); +} + +?> +--EXPECT-- +Testing: "A JSON payload should be an object or array, not a string." +AS OBJECT +string(58) "A JSON payload should be an object or array, not a string." +AS ARRAY +string(58) "A JSON payload should be an object or array, not a string." +Testing: ["Unclosed array" +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {unquoted_key: "keys must be quoted} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["extra comma",] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["double extra comma",,] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: [ , "<-- missing value"] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["Comma after the close"], +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["Extra close"]] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Extra comma": true,} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Extra value after close": true} "misplaced quoted value" +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Illegal expression": 1 + 2} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Illegal invocation": alert()} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Numbers cannot have leading zeroes": 013} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Numbers cannot be hex": 0x14} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["Illegal backslash escape: \x15"] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["Illegal backslash escape: \'"] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["Illegal backslash escape: \017"] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Missing colon" null} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Double colon":: null} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: {"Comma instead of colon", null} +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["Colon instead of comma": false] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ["Bad value", truth] +AS OBJECT +NULL +AS ARRAY +NULL +Testing: ['single quote'] +AS OBJECT +NULL +AS ARRAY +NULL + diff --git a/ext/json/tests/json_decode_basic.phpt b/ext/json/tests/json_decode_basic.phpt new file mode 100644 index 0000000..6dbeadb --- /dev/null +++ b/ext/json/tests/json_decode_basic.phpt @@ -0,0 +1,187 @@ +--TEST-- +Test json_decode() function : basic functionality +--SKIPIF-- +<?php +if (!extension_loaded("json")) { + die('skip JSON extension not available in this build'); +} +?> +--FILE-- +<?php +/* Prototype : mixed json_decode ( string $json [, bool $assoc ] ) + * Description: Decodes a JSON string + * Source code: ext/json/php_json.c + * Alias to functions: + */ +echo "*** Testing json_decode() : basic functionality ***\n"; + +// array with different values for $string +$inputs = array ( + '0', + '123', + '-123', + '2147483647', + '-2147483648', + '123.456', + '1230', + '-1230', + 'true', + 'false', + 'null', + '"abc"', + '"Hello World\r\n"', + '[]', + '[1,2,3,4,5]', + '{"myInt":99,"myFloat":123.45,"myNull":null,"myBool":true,"myString":"Hello World"}', + '{"Jan":31,"Feb":29,"Mar":31,"April":30,"May":31,"June":30}', + '""', + '{}' +); + +// loop through with each element of the $inputs array to test json_decode() function +$count = 1; +foreach($inputs as $input) { + echo "-- Iteration $count --\n"; + var_dump(json_decode($input)); + var_dump(json_decode($input, TRUE)); + $count ++; +} + +?> +===Done=== +--EXPECTF-- +*** Testing json_decode() : basic functionality *** +-- Iteration 1 -- +int(0) +int(0) +-- Iteration 2 -- +int(123) +int(123) +-- Iteration 3 -- +int(-123) +int(-123) +-- Iteration 4 -- +int(2147483647) +int(2147483647) +-- Iteration 5 -- +int(-2147483648) +int(-2147483648) +-- Iteration 6 -- +float(123.456) +float(123.456) +-- Iteration 7 -- +int(1230) +int(1230) +-- Iteration 8 -- +int(-1230) +int(-1230) +-- Iteration 9 -- +bool(true) +bool(true) +-- Iteration 10 -- +bool(false) +bool(false) +-- Iteration 11 -- +NULL +NULL +-- Iteration 12 -- +string(3) "abc" +string(3) "abc" +-- Iteration 13 -- +string(13) "Hello World +" +string(13) "Hello World +" +-- Iteration 14 -- +array(0) { +} +array(0) { +} +-- Iteration 15 -- +array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) +} +array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) +} +-- Iteration 16 -- +object(stdClass)#%d (5) { + ["myInt"]=> + int(99) + ["myFloat"]=> + float(123.45) + ["myNull"]=> + NULL + ["myBool"]=> + bool(true) + ["myString"]=> + string(11) "Hello World" +} +array(5) { + ["myInt"]=> + int(99) + ["myFloat"]=> + float(123.45) + ["myNull"]=> + NULL + ["myBool"]=> + bool(true) + ["myString"]=> + string(11) "Hello World" +} +-- Iteration 17 -- +object(stdClass)#%d (6) { + ["Jan"]=> + int(31) + ["Feb"]=> + int(29) + ["Mar"]=> + int(31) + ["April"]=> + int(30) + ["May"]=> + int(31) + ["June"]=> + int(30) +} +array(6) { + ["Jan"]=> + int(31) + ["Feb"]=> + int(29) + ["Mar"]=> + int(31) + ["April"]=> + int(30) + ["May"]=> + int(31) + ["June"]=> + int(30) +} +-- Iteration 18 -- +string(0) "" +string(0) "" +-- Iteration 19 -- +object(stdClass)#%d (0) { +} +array(0) { +} +===Done=== diff --git a/ext/json/tests/json_decode_error.phpt b/ext/json/tests/json_decode_error.phpt new file mode 100644 index 0000000..4d5d4e4 --- /dev/null +++ b/ext/json/tests/json_decode_error.phpt @@ -0,0 +1,39 @@ +--TEST-- +Test json_decode() function : error conditions +--SKIPIF-- +<?php +if (!extension_loaded("json")) { + die('skip JSON extension not available in this build'); +} +?> +--FILE-- +<?php +/* Prototype : mixed json_decode ( string $json [, bool $assoc=false [, int $depth=512 ]] ) + * Description: Decodes a JSON string + * Source code: ext/json/php_json.c + * Alias to functions: + */ +echo "*** Testing json_decode() : error conditions ***\n"; + +echo "\n-- Testing json_decode() function with no arguments --\n"; +var_dump( json_decode() ); + +echo "\n-- Testing json_decode() function with more than expected no. of arguments --\n"; +$extra_arg = 10; +var_dump( json_decode('"abc"', TRUE, 512, 0, $extra_arg) ); + +?> +===Done=== +--EXPECTF-- +*** Testing json_decode() : error conditions *** + +-- Testing json_decode() function with no arguments -- + +Warning: json_decode() expects at least 1 parameter, 0 given in %s on line %d +NULL + +-- Testing json_decode() function with more than expected no. of arguments -- + +Warning: json_decode() expects at most 4 parameters, 5 given in %s on line %d +NULL +===Done=== diff --git a/ext/json/tests/json_encode_basic.phpt b/ext/json/tests/json_encode_basic.phpt new file mode 100644 index 0000000..152e244 --- /dev/null +++ b/ext/json/tests/json_encode_basic.phpt @@ -0,0 +1,158 @@ +--TEST-- +Test json_encode() function : basic functionality +--SKIPIF-- +<?php +if (!extension_loaded("json")) { + die('skip JSON extension not available in this build'); +} +?> +--FILE-- +<?php +/* Prototype : string json_encode ( mixed $value ) + * Description: Returns the JSON representation of a value + * Source code: ext/json/php_json.c + * Alias to functions: + */ +echo "*** Testing json_encode() : basic functionality ***\n"; + +//get an unset variable +$unset_var = 10; +unset ($unset_var); + +// get a resource variable +$fp = fopen(__FILE__, "r"); + +// get an object +class sample { +} + +$obj = new sample(); +$obj->MyInt = 99; +$obj->MyFloat = 123.45; +$obj->MyBool = true; +$obj->MyNull = null; +$obj->MyString = "Hello World"; + +// array with different values for $string +$inputs = array ( + + // integers +/*1*/ 0, + 123, + -123, + 2147483647, + -2147483648, + + // floats +/*6*/ 123.456, + 1.23E3, + -1.23E3, + + // boolean +/*9*/ TRUE, + true, + FALSE, + false, + + // NULL +/*13*/ NULL, + null, + + // strings +/*15*/ "abc", + 'abc', + "Hello\t\tWorld\n", + + // arrays +/*18*/ array(), + array(1,2,3,4,5), + array(1 => "Sun", 2=>"Mon", 3 => "Tue", 4 => "Wed", 5 => "Thur", 6 => "Fri", 7 => "Sat"), + array("Jan" => 31, "Feb" => 29, "Mar" => 31, "April" => 30, "May" => 31, "June" => 30), + + // empty data +/*22*/ "", + '', + + // undefined data +/*24*/ @$undefined_var, + + // unset data +/*25*/ @$unset_var, + + // resource variable +/*26*/ $fp, + + // object variable +/*27*/ $obj + +); + +// loop through with each element of the $inputs array to test json_encode() function +$count = 1; +foreach($inputs as $input) { + echo "-- Iteration $count --\n"; + var_dump(json_encode($input)); + $count ++; +} + +?> +===Done=== +--EXPECTF-- +*** Testing json_encode() : basic functionality *** +-- Iteration 1 -- +string(1) "0" +-- Iteration 2 -- +string(3) "123" +-- Iteration 3 -- +string(4) "-123" +-- Iteration 4 -- +string(10) "2147483647" +-- Iteration 5 -- +string(11) "-2147483648" +-- Iteration 6 -- +string(7) "123.456" +-- Iteration 7 -- +string(4) "1230" +-- Iteration 8 -- +string(5) "-1230" +-- Iteration 9 -- +string(4) "true" +-- Iteration 10 -- +string(4) "true" +-- Iteration 11 -- +string(5) "false" +-- Iteration 12 -- +string(5) "false" +-- Iteration 13 -- +string(4) "null" +-- Iteration 14 -- +string(4) "null" +-- Iteration 15 -- +string(5) ""abc"" +-- Iteration 16 -- +string(5) ""abc"" +-- Iteration 17 -- +string(18) ""Hello\t\tWorld\n"" +-- Iteration 18 -- +string(2) "[]" +-- Iteration 19 -- +string(11) "[1,2,3,4,5]" +-- Iteration 20 -- +string(72) "{"1":"Sun","2":"Mon","3":"Tue","4":"Wed","5":"Thur","6":"Fri","7":"Sat"}" +-- Iteration 21 -- +string(58) "{"Jan":31,"Feb":29,"Mar":31,"April":30,"May":31,"June":30}" +-- Iteration 22 -- +string(2) """" +-- Iteration 23 -- +string(2) """" +-- Iteration 24 -- +string(4) "null" +-- Iteration 25 -- +string(4) "null" +-- Iteration 26 -- + +Warning: json_encode(): type is unsupported, encoded as null in %s on line %d +string(4) "null" +-- Iteration 27 -- +string(82) "{"MyInt":99,"MyFloat":123.45,"MyBool":true,"MyNull":null,"MyString":"Hello World"}" +===Done===
\ No newline at end of file diff --git a/ext/json/tests/json_encode_basic_utf8.phpt b/ext/json/tests/json_encode_basic_utf8.phpt new file mode 100644 index 0000000..a8e8b42 --- /dev/null +++ b/ext/json/tests/json_encode_basic_utf8.phpt @@ -0,0 +1,26 @@ +--TEST-- +Test json_encode() function : basic functionality with UTF8 string input +--SKIPIF-- +<?php +if (!extension_loaded("json")) { + die('skip JSON extension not available in this build'); +} +?> +--FILE-- +<?php +/* Prototype : string json_encode ( mixed $value ) + * Description: Returns the JSON representation of a value + * Source code: ext/json/php_json.c + * Alias to functions: + */ +echo "*** Testing json_encode() : basic functionality with UTF-8 input***\n"; + +$utf8_string = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); +var_dump(json_encode($utf8_string)); + +?> +===Done=== +--EXPECTF-- +*** Testing json_encode() : basic functionality with UTF-8 input*** +string(103) ""\u65e5\u672c\u8a9e\u30c6\u30ad\u30b9\u30c8\u3067\u3059\u300201234\uff15\uff16\uff17\uff18\uff19\u3002"" +===Done=== diff --git a/ext/json/tests/json_encode_error.phpt b/ext/json/tests/json_encode_error.phpt new file mode 100644 index 0000000..d130dd9 --- /dev/null +++ b/ext/json/tests/json_encode_error.phpt @@ -0,0 +1,40 @@ +--TEST-- +Test json_encode() function : error conditions +--SKIPIF-- +<?php +if (!extension_loaded("json")) { + die('skip JSON extension not available in this build'); +} +?> +--FILE-- +<?php +/* Prototype : string json_encode ( mixed $value [, int $options=0 ] ) + * Description: Returns the JSON representation of a value + * Source code: ext/json/php_json.c + * Alias to functions: + */ + +echo "*** Testing json_encode() : error conditions ***\n"; + +echo "\n-- Testing json_encode() function with no arguments --\n"; +var_dump( json_encode() ); + +echo "\n-- Testing json_encode() function with more than expected no. of arguments --\n"; +$extra_arg = 10; +var_dump( json_encode("abc", 0, $extra_arg) ); + +?> +===Done=== +--EXPECTF-- +*** Testing json_encode() : error conditions *** + +-- Testing json_encode() function with no arguments -- + +Warning: json_encode() expects at least 1 parameter, 0 given in %s on line %d +NULL + +-- Testing json_encode() function with more than expected no. of arguments -- + +Warning: json_encode() expects at most 2 parameters, 3 given in %s on line %d +NULL +===Done=== diff --git a/ext/json/tests/json_encode_numeric.phpt b/ext/json/tests/json_encode_numeric.phpt new file mode 100644 index 0000000..5392350 --- /dev/null +++ b/ext/json/tests/json_encode_numeric.phpt @@ -0,0 +1,26 @@ +--TEST-- +Test json_encode() function with numeric flag +--SKIPIF-- +<?php +if (!extension_loaded("json")) { + die('skip JSON extension not available in this build'); +} +?> +--FILE-- +<?php +var_dump( + json_encode("1", JSON_NUMERIC_CHECK), + json_encode("9.4324", JSON_NUMERIC_CHECK), + json_encode(array("122321", "3232595.33423"), JSON_NUMERIC_CHECK), + json_encode("1"), + json_encode("9.4324"), + json_encode(array("122321", "3232595.33423")) +); +?> +--EXPECT-- +string(1) "1" +string(6) "9.4324" +string(22) "[122321,3232595.33423]" +string(3) ""1"" +string(8) ""9.4324"" +string(26) "["122321","3232595.33423"]" diff --git a/ext/json/tests/json_encode_pretty_print.phpt b/ext/json/tests/json_encode_pretty_print.phpt new file mode 100644 index 0000000..43b93aa --- /dev/null +++ b/ext/json/tests/json_encode_pretty_print.phpt @@ -0,0 +1,40 @@ +--TEST-- +json_encode() with JSON_PRETTY_PRINT +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +function encode_decode($json) { + $struct = json_decode($json); + $pretty = json_encode($struct, JSON_PRETTY_PRINT); + echo "$pretty\n"; + $pretty = json_decode($pretty); + printf("Match: %d\n", $pretty == $struct); +} + +encode_decode('[1,2,3,[1,2,3]]'); +encode_decode('{"a":1,"b":[1,2],"c":{"d":42}}'); +?> +--EXPECT-- +[ + 1, + 2, + 3, + [ + 1, + 2, + 3 + ] +] +Match: 1 +{ + "a": 1, + "b": [ + 1, + 2 + ], + "c": { + "d": 42 + } +} +Match: 1 diff --git a/ext/json/tests/json_encode_unescaped_slashes.phpt b/ext/json/tests/json_encode_unescaped_slashes.phpt new file mode 100644 index 0000000..72ebae9 --- /dev/null +++ b/ext/json/tests/json_encode_unescaped_slashes.phpt @@ -0,0 +1,12 @@ +--TEST-- +json_decode() tests +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php +var_dump(json_encode('a/b')); +var_dump(json_encode('a/b', JSON_UNESCAPED_SLASHES)); +?> +--EXPECT-- +string(6) ""a\/b"" +string(5) ""a/b"" diff --git a/ext/json/tests/pass001.1.phpt b/ext/json/tests/pass001.1.phpt new file mode 100644 index 0000000..7e15a76 --- /dev/null +++ b/ext/json/tests/pass001.1.phpt @@ -0,0 +1,890 @@ +--TEST-- +JSON (http://www.crockford.com/JSON/JSON_checker/test/pass1.json) +--INI-- +precision=14 +--SKIPIF-- +<?php + if (!extension_loaded('json')) die('skip: json extension not available'); + if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only"); +?> +--FILE-- +<?php +/* Modified to test unescaped UNICODE as keys and values. + * Modified to test numbers with exponents without a decimal point. + * Modified to test empty string values. + * Modified to test a mix of integers and strings as keys. + */ +// Expect warnings about INF. +ini_set("error_reporting", E_ALL & ~E_WARNING); + +$test = " +[ + \"JSON Test Pattern pass1\", + {\"object with 1 member\":[\"array with 1 element\"]}, + {}, + [], + -42, + true, + false, + null, + { + \"integer\": 1234567890, + \"real\": -9876.543210, + \"e\": 0.123456789e-12, + \"E\": 1.234567890E+34, + \"\": 23456789012E666, + \"E no .\": 4E12, + \"zero\": 0, + \"one\": 1, + \"space\": \" \", + \"quote\": \"\\\"\", + \"backslash\": \"\\\\\", + \"controls\": \"\\b\\f\\n\\r\\t\", + \"slash\": \"/ & \\/\", + \"alpha\": \"abcdefghijklmnopqrstuvwyz\", + \"ALPHA\": \"ABCDEFGHIJKLMNOPQRSTUVWYZ\", + \"digit\": \"0123456789\", + \"special\": \"`1~!@#$%^&*()_+-={':[,]}|;.</>?\", + \"hex\": \"\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A\", + \"unicode\": \"\\u30d7\\u30ec\\u30b9\\u30ad\\u30c3\\u30c8\", + \"プレスキット\": \"プレスキット\", + \"empty_string\": \"\", + \"true\": true, + \"false\": false, + \"null\": null, + \"array\":[ ], + \"object\":{ }, + \"123\":{\"456\":{\"abc\":{\"789\":\"def\",\"012\":[1,2,\"5\",500],\"ghi\":[1,2,\"five\",50,\"sixty\"]}}}, + \"address\": \"50 St. James Street\", + \"url\": \"http://www.JSON.org/\", + \"comment\": \"// /* <!-- --\", + \"# -- --> */\": \" \", + \" s p a c e d \" :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + \"compact\": [1,2,3,4,5,6,7], + \"jsontext\": \"{\\\"object with 1 member\\\":[\\\"array with 1 element\\\"]}\", + \"quotes\": \"" \\u0022 %22 0x22 034 "\", + \"\\/\\\\\\\"\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?\" +: \"A key can be any string\" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,\"rosebud\"] +"; + +echo 'Testing: ' . $test . "\n"; +echo "DECODE: AS OBJECT\n"; +$obj = json_decode($test); +var_dump($obj); +echo "DECODE: AS ARRAY\n"; +$arr = json_decode($test, true); +var_dump($arr); + +echo "ENCODE: FROM OBJECT\n"; +$obj_enc = json_encode($obj); +echo $obj_enc . "\n"; +echo "ENCODE: FROM ARRAY\n"; +$arr_enc = json_encode($arr); +echo $arr_enc . "\n"; + +echo "DECODE AGAIN: AS OBJECT\n"; +$obj = json_decode($obj_enc); +var_dump($obj); +echo "DECODE AGAIN: AS ARRAY\n"; +$arr = json_decode($arr_enc, true); +var_dump($arr); + +?> +--EXPECTF-- +Testing: +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E666, + "E no .": 4E12, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "unicode": "\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8", + "プレスキット": "プレスキット", + "empty_string": "", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "123":{"456":{"abc":{"789":"def","012":[1,2,"5",500],"ghi":[1,2,"five",50,"sixty"]}}}, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* <!-- --", + "# -- --> */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + "compact": [1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,"rosebud"] + +DECODE: AS OBJECT +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + object(stdClass)#%d (1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + object(stdClass)#%d (0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + object(stdClass)#%d (36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + ["_empty_"]=> + float(INF) + ["E no ."]=> + float(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + object(stdClass)#%d (0) { + } + ["123"]=> + object(stdClass)#%d (1) { + ["456"]=> + object(stdClass)#%d (1) { + ["abc"]=> + object(stdClass)#%d (3) { + ["789"]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +DECODE: AS ARRAY +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + array(1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + array(0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + array(36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + [""]=> + float(INF) + ["E no ."]=> + float(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + array(0) { + } + [123]=> + array(1) { + [456]=> + array(1) { + ["abc"]=> + array(3) { + [789]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +ENCODE: FROM OBJECT +["JSON Test Pattern pass1",{"object with 1 member":["array with 1 element"]},{},[],-42,true,false,null,{"integer":1234567890,"real":-9876.54321,"e":1.23456789e-13,"E":1.23456789e+34,"_empty_":0,"E no .":4000000000000,"zero":0,"one":1,"space":" ","quote":"\"","backslash":"\\","controls":"\b\f\n\r\t","slash":"\/ & \/","alpha":"abcdefghijklmnopqrstuvwyz","ALPHA":"ABCDEFGHIJKLMNOPQRSTUVWYZ","digit":"0123456789","special":"`1~!@#$%^&*()_+-={':[,]}|;.<\/>?","hex":"\u0123\u4567\u89ab\ucdef\uabcd\uef4a","unicode":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","empty_string":"","true":true,"false":false,"null":null,"array":[],"object":{},"123":{"456":{"abc":{"789":"def","012":[1,2,"5",500],"ghi":[1,2,"five",50,"sixty"]}}},"address":"50 St. James Street","url":"http:\/\/www.JSON.org\/","comment":"\/\/ \/* <!-- --","# -- --> *\/":" "," s p a c e d ":[1,2,3,4,5,6,7],"compact":[1,2,3,4,5,6,7],"jsontext":"{\"object with 1 member\":[\"array with 1 element\"]}","quotes":"" \" %22 0x22 034 "","\/\\\"\ucafe\ubabe\uab98\ufcde\ubcda\uef4a\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',.\/<>?":"A key can be any string"},0.5,98.6,99.44,1066,"rosebud"] +ENCODE: FROM ARRAY +["JSON Test Pattern pass1",{"object with 1 member":["array with 1 element"]},[],[],-42,true,false,null,{"integer":1234567890,"real":-9876.54321,"e":1.23456789e-13,"E":1.23456789e+34,"":0,"E no .":4000000000000,"zero":0,"one":1,"space":" ","quote":"\"","backslash":"\\","controls":"\b\f\n\r\t","slash":"\/ & \/","alpha":"abcdefghijklmnopqrstuvwyz","ALPHA":"ABCDEFGHIJKLMNOPQRSTUVWYZ","digit":"0123456789","special":"`1~!@#$%^&*()_+-={':[,]}|;.<\/>?","hex":"\u0123\u4567\u89ab\ucdef\uabcd\uef4a","unicode":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","empty_string":"","true":true,"false":false,"null":null,"array":[],"object":[],"123":{"456":{"abc":{"789":"def","012":[1,2,"5",500],"ghi":[1,2,"five",50,"sixty"]}}},"address":"50 St. James Street","url":"http:\/\/www.JSON.org\/","comment":"\/\/ \/* <!-- --","# -- --> *\/":" "," s p a c e d ":[1,2,3,4,5,6,7],"compact":[1,2,3,4,5,6,7],"jsontext":"{\"object with 1 member\":[\"array with 1 element\"]}","quotes":"" \" %22 0x22 034 "","\/\\\"\ucafe\ubabe\uab98\ufcde\ubcda\uef4a\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',.\/<>?":"A key can be any string"},0.5,98.6,99.44,1066,"rosebud"] +DECODE AGAIN: AS OBJECT +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + object(stdClass)#%d (1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + object(stdClass)#%d (0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + object(stdClass)#%d (36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + ["_empty_"]=> + int(0) + ["E no ."]=> + %s(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + object(stdClass)#%d (0) { + } + ["123"]=> + object(stdClass)#%d (1) { + ["456"]=> + object(stdClass)#%d (1) { + ["abc"]=> + object(stdClass)#%d (3) { + ["789"]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +DECODE AGAIN: AS ARRAY +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + array(1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + array(0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + array(36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + [""]=> + int(0) + ["E no ."]=> + %s(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + array(0) { + } + [123]=> + array(1) { + [456]=> + array(1) { + ["abc"]=> + array(3) { + [789]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} diff --git a/ext/json/tests/pass001.1_64bit.phpt b/ext/json/tests/pass001.1_64bit.phpt new file mode 100644 index 0000000..9c3e669 --- /dev/null +++ b/ext/json/tests/pass001.1_64bit.phpt @@ -0,0 +1,890 @@ +--TEST-- +JSON (http://www.crockford.com/JSON/JSON_checker/test/pass1.json) +--INI-- +precision=14 +--SKIPIF-- +<?php + if (!extension_loaded('json')) die('skip: json extension not available'); + if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); +?> +--FILE-- +<?php +/* Modified to test unescaped UNICODE as keys and values. + * Modified to test numbers with exponents without a decimal point. + * Modified to test empty string values. + * Modified to test a mix of integers and strings as keys. + */ +// Expect warnings about INF. +ini_set("error_reporting", E_ALL & ~E_WARNING); + +$test = " +[ + \"JSON Test Pattern pass1\", + {\"object with 1 member\":[\"array with 1 element\"]}, + {}, + [], + -42, + true, + false, + null, + { + \"integer\": 1234567890, + \"real\": -9876.543210, + \"e\": 0.123456789e-12, + \"E\": 1.234567890E+34, + \"\": 23456789012E666, + \"E no .\": 4E12, + \"zero\": 0, + \"one\": 1, + \"space\": \" \", + \"quote\": \"\\\"\", + \"backslash\": \"\\\\\", + \"controls\": \"\\b\\f\\n\\r\\t\", + \"slash\": \"/ & \\/\", + \"alpha\": \"abcdefghijklmnopqrstuvwyz\", + \"ALPHA\": \"ABCDEFGHIJKLMNOPQRSTUVWYZ\", + \"digit\": \"0123456789\", + \"special\": \"`1~!@#$%^&*()_+-={':[,]}|;.</>?\", + \"hex\": \"\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A\", + \"unicode\": \"\\u30d7\\u30ec\\u30b9\\u30ad\\u30c3\\u30c8\", + \"プレスキット\": \"プレスキット\", + \"empty_string\": \"\", + \"true\": true, + \"false\": false, + \"null\": null, + \"array\":[ ], + \"object\":{ }, + \"123\":{\"456\":{\"abc\":{\"789\":\"def\",\"012\":[1,2,\"5\",500],\"ghi\":[1,2,\"five\",50,\"sixty\"]}}}, + \"address\": \"50 St. James Street\", + \"url\": \"http://www.JSON.org/\", + \"comment\": \"// /* <!-- --\", + \"# -- --> */\": \" \", + \" s p a c e d \" :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + \"compact\": [1,2,3,4,5,6,7], + \"jsontext\": \"{\\\"object with 1 member\\\":[\\\"array with 1 element\\\"]}\", + \"quotes\": \"" \\u0022 %22 0x22 034 "\", + \"\\/\\\\\\\"\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?\" +: \"A key can be any string\" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,\"rosebud\"] +"; + +echo 'Testing: ' . $test . "\n"; +echo "DECODE: AS OBJECT\n"; +$obj = json_decode($test); +var_dump($obj); +echo "DECODE: AS ARRAY\n"; +$arr = json_decode($test, true); +var_dump($arr); + +echo "ENCODE: FROM OBJECT\n"; +$obj_enc = json_encode($obj); +echo $obj_enc . "\n"; +echo "ENCODE: FROM ARRAY\n"; +$arr_enc = json_encode($arr); +echo $arr_enc . "\n"; + +echo "DECODE AGAIN: AS OBJECT\n"; +$obj = json_decode($obj_enc); +var_dump($obj); +echo "DECODE AGAIN: AS ARRAY\n"; +$arr = json_decode($arr_enc, true); +var_dump($arr); + +?> +--EXPECTF-- +Testing: +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E666, + "E no .": 4E12, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "unicode": "\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8", + "プレスキット": "プレスキット", + "empty_string": "", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "123":{"456":{"abc":{"789":"def","012":[1,2,"5",500],"ghi":[1,2,"five",50,"sixty"]}}}, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* <!-- --", + "# -- --> */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + "compact": [1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,"rosebud"] + +DECODE: AS OBJECT +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + object(stdClass)#%d (1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + object(stdClass)#%d (0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + object(stdClass)#%d (36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + ["_empty_"]=> + float(INF) + ["E no ."]=> + float(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + object(stdClass)#%d (0) { + } + ["123"]=> + object(stdClass)#%d (1) { + ["456"]=> + object(stdClass)#%d (1) { + ["abc"]=> + object(stdClass)#%d (3) { + ["789"]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +DECODE: AS ARRAY +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + array(1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + array(0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + array(36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + [""]=> + float(INF) + ["E no ."]=> + float(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + array(0) { + } + [123]=> + array(1) { + [456]=> + array(1) { + ["abc"]=> + array(3) { + [789]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +ENCODE: FROM OBJECT +["JSON Test Pattern pass1",{"object with 1 member":["array with 1 element"]},{},[],-42,true,false,null,{"integer":1234567890,"real":-9876.54321,"e":1.23456789e-13,"E":1.23456789e+34,"_empty_":0,"E no .":4000000000000,"zero":0,"one":1,"space":" ","quote":"\"","backslash":"\\","controls":"\b\f\n\r\t","slash":"\/ & \/","alpha":"abcdefghijklmnopqrstuvwyz","ALPHA":"ABCDEFGHIJKLMNOPQRSTUVWYZ","digit":"0123456789","special":"`1~!@#$%^&*()_+-={':[,]}|;.<\/>?","hex":"\u0123\u4567\u89ab\ucdef\uabcd\uef4a","unicode":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","empty_string":"","true":true,"false":false,"null":null,"array":[],"object":{},"123":{"456":{"abc":{"789":"def","012":[1,2,"5",500],"ghi":[1,2,"five",50,"sixty"]}}},"address":"50 St. James Street","url":"http:\/\/www.JSON.org\/","comment":"\/\/ \/* <!-- --","# -- --> *\/":" "," s p a c e d ":[1,2,3,4,5,6,7],"compact":[1,2,3,4,5,6,7],"jsontext":"{\"object with 1 member\":[\"array with 1 element\"]}","quotes":"" \" %22 0x22 034 "","\/\\\"\ucafe\ubabe\uab98\ufcde\ubcda\uef4a\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',.\/<>?":"A key can be any string"},0.5,98.6,99.44,1066,"rosebud"] +ENCODE: FROM ARRAY +["JSON Test Pattern pass1",{"object with 1 member":["array with 1 element"]},[],[],-42,true,false,null,{"integer":1234567890,"real":-9876.54321,"e":1.23456789e-13,"E":1.23456789e+34,"":0,"E no .":4000000000000,"zero":0,"one":1,"space":" ","quote":"\"","backslash":"\\","controls":"\b\f\n\r\t","slash":"\/ & \/","alpha":"abcdefghijklmnopqrstuvwyz","ALPHA":"ABCDEFGHIJKLMNOPQRSTUVWYZ","digit":"0123456789","special":"`1~!@#$%^&*()_+-={':[,]}|;.<\/>?","hex":"\u0123\u4567\u89ab\ucdef\uabcd\uef4a","unicode":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8":"\u30d7\u30ec\u30b9\u30ad\u30c3\u30c8","empty_string":"","true":true,"false":false,"null":null,"array":[],"object":[],"123":{"456":{"abc":{"789":"def","012":[1,2,"5",500],"ghi":[1,2,"five",50,"sixty"]}}},"address":"50 St. James Street","url":"http:\/\/www.JSON.org\/","comment":"\/\/ \/* <!-- --","# -- --> *\/":" "," s p a c e d ":[1,2,3,4,5,6,7],"compact":[1,2,3,4,5,6,7],"jsontext":"{\"object with 1 member\":[\"array with 1 element\"]}","quotes":"" \" %22 0x22 034 "","\/\\\"\ucafe\ubabe\uab98\ufcde\ubcda\uef4a\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',.\/<>?":"A key can be any string"},0.5,98.6,99.44,1066,"rosebud"] +DECODE AGAIN: AS OBJECT +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + object(stdClass)#%d (1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + object(stdClass)#%d (0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + object(stdClass)#%d (36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + ["_empty_"]=> + int(0) + ["E no ."]=> + int(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + object(stdClass)#%d (0) { + } + ["123"]=> + object(stdClass)#%d (1) { + ["456"]=> + object(stdClass)#%d (1) { + ["abc"]=> + object(stdClass)#%d (3) { + ["789"]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +DECODE AGAIN: AS ARRAY +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + array(1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + array(0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + array(36) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + [""]=> + int(0) + ["E no ."]=> + int(4000000000000) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["unicode"]=> + string(18) "プレスキット" + ["プレスキット"]=> + string(18) "プレスキット" + ["empty_string"]=> + string(0) "" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + array(0) { + } + [123]=> + array(1) { + [456]=> + array(1) { + ["abc"]=> + array(3) { + [789]=> + string(3) "def" + ["012"]=> + array(4) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(1) "5" + [3]=> + int(500) + } + ["ghi"]=> + array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + string(4) "five" + [3]=> + int(50) + [4]=> + string(5) "sixty" + } + } + } + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} diff --git a/ext/json/tests/pass001.phpt b/ext/json/tests/pass001.phpt new file mode 100644 index 0000000..43be11e --- /dev/null +++ b/ext/json/tests/pass001.phpt @@ -0,0 +1,702 @@ +--TEST-- +JSON (http://www.crockford.com/JSON/JSON_checker/test/pass1.json) +--INI-- +precision=14 +--SKIPIF-- +<?php + if (!extension_loaded('json')) die('skip: json extension not available'); +?> +--FILE-- +<?php +// Expect warnings about INF. +ini_set("error_reporting", E_ALL & ~E_WARNING); + +$test = " +[ + \"JSON Test Pattern pass1\", + {\"object with 1 member\":[\"array with 1 element\"]}, + {}, + [], + -42, + true, + false, + null, + { + \"integer\": 1234567890, + \"real\": -9876.543210, + \"e\": 0.123456789e-12, + \"E\": 1.234567890E+34, + \"\": 23456789012E666, + \"zero\": 0, + \"one\": 1, + \"space\": \" \", + \"quote\": \"\\\"\", + \"backslash\": \"\\\\\", + \"controls\": \"\\b\\f\\n\\r\\t\", + \"slash\": \"/ & \\/\", + \"alpha\": \"abcdefghijklmnopqrstuvwyz\", + \"ALPHA\": \"ABCDEFGHIJKLMNOPQRSTUVWYZ\", + \"digit\": \"0123456789\", + \"special\": \"`1~!@#$%^&*()_+-={':[,]}|;.</>?\", + \"hex\": \"\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A\", + \"true\": true, + \"false\": false, + \"null\": null, + \"array\":[ ], + \"object\":{ }, + \"address\": \"50 St. James Street\", + \"url\": \"http://www.JSON.org/\", + \"comment\": \"// /* <!-- --\", + \"# -- --> */\": \" \", + \" s p a c e d \" :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + \"compact\": [1,2,3,4,5,6,7], + \"jsontext\": \"{\\\"object with 1 member\\\":[\\\"array with 1 element\\\"]}\", + \"quotes\": \"" \\u0022 %22 0x22 034 "\", + \"\\/\\\\\\\"\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?\" +: \"A key can be any string\" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,\"rosebud\"] +"; + +echo 'Testing: ' . $test . "\n"; +echo "DECODE: AS OBJECT\n"; +$obj = json_decode($test); +var_dump($obj); +echo "DECODE: AS ARRAY\n"; +$arr = json_decode($test, true); +var_dump($arr); + +echo "ENCODE: FROM OBJECT\n"; +$obj_enc = json_encode($obj); +echo $obj_enc . "\n"; +echo "ENCODE: FROM ARRAY\n"; +$arr_enc = json_encode($arr); +echo $arr_enc . "\n"; + +echo "DECODE AGAIN: AS OBJECT\n"; +$obj = json_decode($obj_enc); +var_dump($obj); +echo "DECODE AGAIN: AS ARRAY\n"; +$arr = json_decode($arr_enc, true); +var_dump($arr); + +?> +--EXPECT-- +Testing: +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E666, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* <!-- --", + "# -- --> */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ], + "compact": [1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066 + + +,"rosebud"] + +DECODE: AS OBJECT +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + object(stdClass)#1 (1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + object(stdClass)#2 (0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + object(stdClass)#3 (31) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + ["_empty_"]=> + float(INF) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + object(stdClass)#4 (0) { + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +DECODE: AS ARRAY +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + array(1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + array(0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + array(31) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + [""]=> + float(INF) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + array(0) { + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +ENCODE: FROM OBJECT +["JSON Test Pattern pass1",{"object with 1 member":["array with 1 element"]},{},[],-42,true,false,null,{"integer":1234567890,"real":-9876.54321,"e":1.23456789e-13,"E":1.23456789e+34,"_empty_":0,"zero":0,"one":1,"space":" ","quote":"\"","backslash":"\\","controls":"\b\f\n\r\t","slash":"\/ & \/","alpha":"abcdefghijklmnopqrstuvwyz","ALPHA":"ABCDEFGHIJKLMNOPQRSTUVWYZ","digit":"0123456789","special":"`1~!@#$%^&*()_+-={':[,]}|;.<\/>?","hex":"\u0123\u4567\u89ab\ucdef\uabcd\uef4a","true":true,"false":false,"null":null,"array":[],"object":{},"address":"50 St. James Street","url":"http:\/\/www.JSON.org\/","comment":"\/\/ \/* <!-- --","# -- --> *\/":" "," s p a c e d ":[1,2,3,4,5,6,7],"compact":[1,2,3,4,5,6,7],"jsontext":"{\"object with 1 member\":[\"array with 1 element\"]}","quotes":"" \" %22 0x22 034 "","\/\\\"\ucafe\ubabe\uab98\ufcde\ubcda\uef4a\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',.\/<>?":"A key can be any string"},0.5,98.6,99.44,1066,"rosebud"] +ENCODE: FROM ARRAY +["JSON Test Pattern pass1",{"object with 1 member":["array with 1 element"]},[],[],-42,true,false,null,{"integer":1234567890,"real":-9876.54321,"e":1.23456789e-13,"E":1.23456789e+34,"":0,"zero":0,"one":1,"space":" ","quote":"\"","backslash":"\\","controls":"\b\f\n\r\t","slash":"\/ & \/","alpha":"abcdefghijklmnopqrstuvwyz","ALPHA":"ABCDEFGHIJKLMNOPQRSTUVWYZ","digit":"0123456789","special":"`1~!@#$%^&*()_+-={':[,]}|;.<\/>?","hex":"\u0123\u4567\u89ab\ucdef\uabcd\uef4a","true":true,"false":false,"null":null,"array":[],"object":[],"address":"50 St. James Street","url":"http:\/\/www.JSON.org\/","comment":"\/\/ \/* <!-- --","# -- --> *\/":" "," s p a c e d ":[1,2,3,4,5,6,7],"compact":[1,2,3,4,5,6,7],"jsontext":"{\"object with 1 member\":[\"array with 1 element\"]}","quotes":"" \" %22 0x22 034 "","\/\\\"\ucafe\ubabe\uab98\ufcde\ubcda\uef4a\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',.\/<>?":"A key can be any string"},0.5,98.6,99.44,1066,"rosebud"] +DECODE AGAIN: AS OBJECT +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + object(stdClass)#5 (1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + object(stdClass)#6 (0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + object(stdClass)#7 (31) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + ["_empty_"]=> + int(0) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + object(stdClass)#8 (0) { + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} +DECODE AGAIN: AS ARRAY +array(14) { + [0]=> + string(23) "JSON Test Pattern pass1" + [1]=> + array(1) { + ["object with 1 member"]=> + array(1) { + [0]=> + string(20) "array with 1 element" + } + } + [2]=> + array(0) { + } + [3]=> + array(0) { + } + [4]=> + int(-42) + [5]=> + bool(true) + [6]=> + bool(false) + [7]=> + NULL + [8]=> + array(31) { + ["integer"]=> + int(1234567890) + ["real"]=> + float(-9876.54321) + ["e"]=> + float(1.23456789E-13) + ["E"]=> + float(1.23456789E+34) + [""]=> + int(0) + ["zero"]=> + int(0) + ["one"]=> + int(1) + ["space"]=> + string(1) " " + ["quote"]=> + string(1) """ + ["backslash"]=> + string(1) "\" + ["controls"]=> + string(5) " +
" + ["slash"]=> + string(5) "/ & /" + ["alpha"]=> + string(25) "abcdefghijklmnopqrstuvwyz" + ["ALPHA"]=> + string(25) "ABCDEFGHIJKLMNOPQRSTUVWYZ" + ["digit"]=> + string(10) "0123456789" + ["special"]=> + string(31) "`1~!@#$%^&*()_+-={':[,]}|;.</>?" + ["hex"]=> + string(17) "ģ䕧覫췯ꯍ" + ["true"]=> + bool(true) + ["false"]=> + bool(false) + ["null"]=> + NULL + ["array"]=> + array(0) { + } + ["object"]=> + array(0) { + } + ["address"]=> + string(19) "50 St. James Street" + ["url"]=> + string(20) "http://www.JSON.org/" + ["comment"]=> + string(13) "// /* <!-- --" + ["# -- --> */"]=> + string(1) " " + [" s p a c e d "]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["compact"]=> + array(7) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + } + ["jsontext"]=> + string(49) "{"object with 1 member":["array with 1 element"]}" + ["quotes"]=> + string(27) "" " %22 0x22 034 "" + ["/\"쫾몾ꮘﳞ볚 +
`1~!@#$%^&*()_+-=[]{}|;:',./<>?"]=> + string(23) "A key can be any string" + } + [9]=> + float(0.5) + [10]=> + float(98.6) + [11]=> + float(99.44) + [12]=> + int(1066) + [13]=> + string(7) "rosebud" +} diff --git a/ext/json/tests/pass002.phpt b/ext/json/tests/pass002.phpt new file mode 100644 index 0000000..24c7e33 --- /dev/null +++ b/ext/json/tests/pass002.phpt @@ -0,0 +1,275 @@ +--TEST-- +JSON (http://www.crockford.com/JSON/JSON_checker/test/pass2.json) +--SKIPIF-- +<?php + if (!extension_loaded('json')) die('skip: json extension not available'); +?> +--FILE-- +<?php + +$test = '[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]'; +echo 'Testing: ' . $test . "\n"; +echo "DECODE: AS OBJECT\n"; +$obj = json_decode($test); +var_dump($obj); +echo "DECODE: AS ARRAY\n"; +$arr = json_decode($test, true); +var_dump($arr); + +echo "ENCODE: FROM OBJECT\n"; +$obj_enc = json_encode($obj); +echo $obj_enc . "\n"; +echo "ENCODE: FROM ARRAY\n"; +$arr_enc = json_encode($arr); +echo $arr_enc . "\n"; + +echo "DECODE AGAIN: AS OBJECT\n"; +$obj = json_decode($obj_enc); +var_dump($obj); +echo "DECODE AGAIN: AS ARRAY\n"; +$arr = json_decode($arr_enc, true); +var_dump($arr); + +?> +--EXPECT-- +Testing: [[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] +DECODE: AS OBJECT +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + string(12) "Not too deep" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} +DECODE: AS ARRAY +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + string(12) "Not too deep" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} +ENCODE: FROM OBJECT +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] +ENCODE: FROM ARRAY +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] +DECODE AGAIN: AS OBJECT +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + string(12) "Not too deep" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} +DECODE AGAIN: AS ARRAY +array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + array(1) { + [0]=> + string(12) "Not too deep" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} diff --git a/ext/json/tests/pass003.phpt b/ext/json/tests/pass003.phpt new file mode 100644 index 0000000..36da4a1 --- /dev/null +++ b/ext/json/tests/pass003.phpt @@ -0,0 +1,94 @@ +--TEST-- +JSON (http://www.crockford.com/JSON/JSON_checker/test/pass3.json) +--SKIPIF-- +<?php + if (!extension_loaded('json')) die('skip: json extension not available'); +?> +--FILE-- +<?php + +$test = ' +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} +'; + +echo 'Testing: ' . $test . "\n"; +echo "DECODE: AS OBJECT\n"; +$obj = json_decode($test); +var_dump($obj); +echo "DECODE: AS ARRAY\n"; +$arr = json_decode($test, true); +var_dump($arr); + +echo "ENCODE: FROM OBJECT\n"; +$obj_enc = json_encode($obj); +echo $obj_enc . "\n"; +echo "ENCODE: FROM ARRAY\n"; +$arr_enc = json_encode($arr); +echo $arr_enc . "\n"; + +echo "DECODE AGAIN: AS OBJECT\n"; +$obj = json_decode($obj_enc); +var_dump($obj); +echo "DECODE AGAIN: AS ARRAY\n"; +$arr = json_decode($arr_enc, true); +var_dump($arr); + +?> +--EXPECT-- +Testing: +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} + +DECODE: AS OBJECT +object(stdClass)#1 (1) { + ["JSON Test Pattern pass3"]=> + object(stdClass)#2 (2) { + ["The outermost value"]=> + string(27) "must be an object or array." + ["In this test"]=> + string(16) "It is an object." + } +} +DECODE: AS ARRAY +array(1) { + ["JSON Test Pattern pass3"]=> + array(2) { + ["The outermost value"]=> + string(27) "must be an object or array." + ["In this test"]=> + string(16) "It is an object." + } +} +ENCODE: FROM OBJECT +{"JSON Test Pattern pass3":{"The outermost value":"must be an object or array.","In this test":"It is an object."}} +ENCODE: FROM ARRAY +{"JSON Test Pattern pass3":{"The outermost value":"must be an object or array.","In this test":"It is an object."}} +DECODE AGAIN: AS OBJECT +object(stdClass)#3 (1) { + ["JSON Test Pattern pass3"]=> + object(stdClass)#4 (2) { + ["The outermost value"]=> + string(27) "must be an object or array." + ["In this test"]=> + string(16) "It is an object." + } +} +DECODE AGAIN: AS ARRAY +array(1) { + ["JSON Test Pattern pass3"]=> + array(2) { + ["The outermost value"]=> + string(27) "must be an object or array." + ["In this test"]=> + string(16) "It is an object." + } +} diff --git a/ext/json/tests/serialize.phpt b/ext/json/tests/serialize.phpt new file mode 100644 index 0000000..5c513d5 --- /dev/null +++ b/ext/json/tests/serialize.phpt @@ -0,0 +1,80 @@ +--TEST-- +json_encode() Serialization tests +--SKIPIF-- +<?php if (!extension_loaded("json")) print "skip"; ?> +--FILE-- +<?php + +class NonSerializingTest +{ + public $data; + + public function __construct($data) + { + $this->data = $data; + } +} + +class SerializingTest extends NonSerializingTest implements JsonSerializable +{ + public function jsonSerialize() + { + return $this->data; + } +} + +class ValueSerializingTest extends SerializingTest +{ + public function jsonSerialize() + { + return array_values(is_array($this->data) ? $this->data : get_object_vars($this->data)); + } +} + +class SelfSerializingTest extends SerializingTest +{ + public function jsonSerialize() + { + return $this; + } +} + +$adata = array( + 'str' => 'foo', + 'int' => 1, + 'float' => 2.3, + 'bool' => false, + 'nil' => null, + 'arr' => array(1,2,3), + 'obj' => new StdClass, +); + +$ndata = array_values($adata); + +$odata = (object)$adata; + +foreach(array('NonSerializingTest','SerializingTest','ValueSerializingTest','SelfSerializingTest') as $class) { + echo "==$class==\n"; + echo json_encode(new $class($adata)), "\n"; + echo json_encode(new $class($ndata)), "\n"; + echo json_encode(new $class($odata)), "\n"; +} +--EXPECT-- +==NonSerializingTest== +{"data":{"str":"foo","int":1,"float":2.3,"bool":false,"nil":null,"arr":[1,2,3],"obj":{}}} +{"data":["foo",1,2.3,false,null,[1,2,3],{}]} +{"data":{"str":"foo","int":1,"float":2.3,"bool":false,"nil":null,"arr":[1,2,3],"obj":{}}} +==SerializingTest== +{"str":"foo","int":1,"float":2.3,"bool":false,"nil":null,"arr":[1,2,3],"obj":{}} +["foo",1,2.3,false,null,[1,2,3],{}] +{"str":"foo","int":1,"float":2.3,"bool":false,"nil":null,"arr":[1,2,3],"obj":{}} +==ValueSerializingTest== +["foo",1,2.3,false,null,[1,2,3],{}] +["foo",1,2.3,false,null,[1,2,3],{}] +["foo",1,2.3,false,null,[1,2,3],{}] +==SelfSerializingTest== +{"data":{"str":"foo","int":1,"float":2.3,"bool":false,"nil":null,"arr":[1,2,3],"obj":{}}} +{"data":["foo",1,2.3,false,null,[1,2,3],{}]} +{"data":{"str":"foo","int":1,"float":2.3,"bool":false,"nil":null,"arr":[1,2,3],"obj":{}}} + + |