]> granicus.if.org Git - php/commitdiff
Add tests for JSON based on tests found on json.org:
authorOmar Kilani <omar@php.net>
Tue, 31 Jan 2006 09:00:14 +0000 (09:00 +0000)
committerOmar Kilani <omar@php.net>
Tue, 31 Jan 2006 09:00:14 +0000 (09:00 +0000)
http://www.crockford.com/JSON/JSON_checker/test/

ext/json/tests/fail001.phpt [new file with mode: 0644]
ext/json/tests/pass001.1.phpt [new file with mode: 0644]
ext/json/tests/pass001.phpt [new file with mode: 0644]
ext/json/tests/pass002.phpt [new file with mode: 0644]
ext/json/tests/pass003.phpt [new file with mode: 0644]

diff --git a/ext/json/tests/fail001.phpt b/ext/json/tests/fail001.phpt
new file mode 100644 (file)
index 0000000..4ee3780
--- /dev/null
@@ -0,0 +1,166 @@
+--TEST--
+JSON Test Pattern fail1 -> fail24
+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
+NULL
+AS ARRAY
+NULL
+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/pass001.1.phpt b/ext/json/tests/pass001.1.phpt
new file mode 100644 (file)
index 0000000..bb333b2
--- /dev/null
@@ -0,0 +1,741 @@
+--TEST--
+JSON Test Pattern pass1.1
+Modified to test unescaped UNICODE as keys and values.
+Modified to test numbers with exponents without a decimal point.
+http://www.crockford.com/JSON/JSON_checker/test/pass1.json
+--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,
+        \"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\",
+        \"プレスキット\": \"プレスキット\",
+        \"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\": \"&#34; \\u0022 %22 0x22 034 &#x22;\",
+        \"\\/\\\\\\\"\\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,
+        "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",
+        "プレスキット": "プレスキット",
+        "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": "&#34; \u0022 %22 0x22 034 &#x22;",
+        "\/\\\"\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 (34) {
+    ["integer"]=>
+    int(1234567890)
+    ["real"]=>
+    float(-9876.54321)
+    ["e"]=>
+    float(1.23456789E-13)
+    ["E"]=>
+    float(1.23456789E+34)
+    ["_empty_"]=>
+    float(INF)
+    ["E no ."]=>
+    float(4.0E+12)
+    ["zero"]=>
+    int(0)
+    ["one"]=>
+    int(1)
+    ["space"]=>
+    string(1) " "
+    ["quote"]=>
+    string(1) """
+    ["backslash"]=>
+    string(1) "\"
+    ["controls"]=>
+    string(5) "\b\f
+
+       "
+    ["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) "プレスキット"
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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(34) {
+    ["integer"]=>
+    int(1234567890)
+    ["real"]=>
+    float(-9876.54321)
+    ["e"]=>
+    float(1.23456789E-13)
+    ["E"]=>
+    float(1.23456789E+34)
+    ["_empty_"]=>
+    float(INF)
+    ["E no ."]=>
+    float(4.0E+12)
+    ["zero"]=>
+    int(0)
+    ["one"]=>
+    int(1)
+    ["space"]=>
+    string(1) " "
+    ["quote"]=>
+    string(1) """
+    ["backslash"]=>
+    string(1) "\"
+    ["controls"]=>
+    string(5) "\b\f
+
+       "
+    ["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) "プレスキット"
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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 .":4.0e+12,"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","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":"&#34; \" %22 0x22 034 &#x22;","\/\\\"\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,"_empty_":0,"E no .":4.0e+12,"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","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":"&#34; \" %22 0x22 034 &#x22;","\/\\\"\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 (34) {
+    ["integer"]=>
+    int(1234567890)
+    ["real"]=>
+    float(-9876.54321)
+    ["e"]=>
+    float(1.23456789E-13)
+    ["E"]=>
+    float(1.23456789E+34)
+    ["_empty_"]=>
+    int(0)
+    ["E no ."]=>
+    float(4.0E+12)
+    ["zero"]=>
+    int(0)
+    ["one"]=>
+    int(1)
+    ["space"]=>
+    string(1) " "
+    ["quote"]=>
+    string(1) """
+    ["backslash"]=>
+    string(1) "\"
+    ["controls"]=>
+    string(5) "\b\f
+
+       "
+    ["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) "プレスキット"
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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(34) {
+    ["integer"]=>
+    int(1234567890)
+    ["real"]=>
+    float(-9876.54321)
+    ["e"]=>
+    float(1.23456789E-13)
+    ["E"]=>
+    float(1.23456789E+34)
+    ["_empty_"]=>
+    int(0)
+    ["E no ."]=>
+    float(4.0E+12)
+    ["zero"]=>
+    int(0)
+    ["one"]=>
+    int(1)
+    ["space"]=>
+    string(1) " "
+    ["quote"]=>
+    string(1) """
+    ["backslash"]=>
+    string(1) "\"
+    ["controls"]=>
+    string(5) "\b\f
+
+       "
+    ["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) "プレスキット"
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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 (file)
index 0000000..aff970b
--- /dev/null
@@ -0,0 +1,709 @@
+--TEST--
+JSON Test Pattern pass1
+http://www.crockford.com/JSON/JSON_checker/test/pass1.json
+--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\": \"&#34; \\u0022 %22 0x22 034 &#x22;\",
+        \"\\/\\\\\\\"\\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": "&#34; \u0022 %22 0x22 034 &#x22;",
+        "\/\\\"\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) "\b\f
+
+       "
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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)
+    ["_empty_"]=>
+    float(INF)
+    ["zero"]=>
+    int(0)
+    ["one"]=>
+    int(1)
+    ["space"]=>
+    string(1) " "
+    ["quote"]=>
+    string(1) """
+    ["backslash"]=>
+    string(1) "\"
+    ["controls"]=>
+    string(5) "\b\f
+
+       "
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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":"&#34; \" %22 0x22 034 &#x22;","\/\\\"\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,"_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":"&#34; \" %22 0x22 034 &#x22;","\/\\\"\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) "\b\f
+
+       "
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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)
+    ["_empty_"]=>
+    int(0)
+    ["zero"]=>
+    int(0)
+    ["one"]=>
+    int(1)
+    ["space"]=>
+    string(1) " "
+    ["quote"]=>
+    string(1) """
+    ["backslash"]=>
+    string(1) "\"
+    ["controls"]=>
+    string(5) "\b\f
+
+       "
+    ["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) "&#34; " %22 0x22 034 &#x22;"
+    ["/\"쫾몾ꮘﳞ볚\b\f
+
+       `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 (file)
index 0000000..a0e527a
--- /dev/null
@@ -0,0 +1,276 @@
+--TEST--
+JSON Test Pattern pass2
+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 (file)
index 0000000..506ff05
--- /dev/null
@@ -0,0 +1,95 @@
+--TEST--
+JSON Test Pattern pass3
+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."
+  }
+}