1425bb815Sopenharmony_ci// Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci// 3425bb815Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci// you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci// You may obtain a copy of the License at 6425bb815Sopenharmony_ci// 7425bb815Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci// 9425bb815Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci// See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci// limitations under the License. 14425bb815Sopenharmony_ci 15425bb815Sopenharmony_ci// Checking quoting strings 16425bb815Sopenharmony_ciassert (JSON.stringify ("") === '""'); 17425bb815Sopenharmony_ci 18425bb815Sopenharmony_cinormal_string = "asdasd"; 19425bb815Sopenharmony_ciassert (JSON.stringify (normal_string) == '"asdasd"'); 20425bb815Sopenharmony_ci 21425bb815Sopenharmony_ciformat_characters = "\ba\fs\nd\ra\tsd"; 22425bb815Sopenharmony_ciassert (JSON.stringify (format_characters) == '"\\ba\\fs\\nd\\ra\\tsd"'); 23425bb815Sopenharmony_ci 24425bb815Sopenharmony_cictl_string = "asdasd"; 25425bb815Sopenharmony_ciassert (JSON.stringify (ctl_string) == '"asd\\u001fasd"'); 26425bb815Sopenharmony_ci 27425bb815Sopenharmony_ciescpad_string = "\"asda\sd"; 28425bb815Sopenharmony_ciassert (JSON.stringify (escpad_string) == '"\\"asdasd"'); 29425bb815Sopenharmony_ci 30425bb815Sopenharmony_ciassert (JSON.stringify('\u2040') == '"⁀"'); 31425bb815Sopenharmony_ciassert (JSON.stringify('abc\u2040\u2030cba') == '"abc⁀‰cba"'); 32425bb815Sopenharmony_ci 33425bb815Sopenharmony_ci// Checking primitive types 34425bb815Sopenharmony_ciassert (JSON.stringify (1) === '1'); 35425bb815Sopenharmony_ciassert (JSON.stringify (true) === 'true'); 36425bb815Sopenharmony_ciassert (JSON.stringify ("foo") === '"foo"'); 37425bb815Sopenharmony_ciassert (JSON.stringify (null) === 'null'); 38425bb815Sopenharmony_ciassert (JSON.stringify (undefined) === undefined); 39425bb815Sopenharmony_ci 40425bb815Sopenharmony_ciassert (JSON.stringify (new Number(1)) === '1'); 41425bb815Sopenharmony_ciassert (JSON.stringify (new Boolean(true)) === 'true'); 42425bb815Sopenharmony_ciassert (JSON.stringify (new String("foo")) === '"foo"'); 43425bb815Sopenharmony_ci 44425bb815Sopenharmony_ci// Checking objects 45425bb815Sopenharmony_ciempty_object = {} 46425bb815Sopenharmony_ciassert (JSON.stringify (empty_object) == '{}'); 47425bb815Sopenharmony_ci 48425bb815Sopenharmony_ciempty_object = {}; 49425bb815Sopenharmony_ciempty_object.a = undefined; 50425bb815Sopenharmony_ci 51425bb815Sopenharmony_ciassert (JSON.stringify (empty_object) == '{}'); 52425bb815Sopenharmony_ci 53425bb815Sopenharmony_cip_object = { "a": 1, "b": true, "c": "foo", "d": null, "e": undefined }; 54425bb815Sopenharmony_ciassert (JSON.stringify (p_object) == '{"a":1,"b":true,"c":"foo","d":null}'); 55425bb815Sopenharmony_ci 56425bb815Sopenharmony_cio_object = { "a": new Number(1), "b": new Boolean(true), "c": new String("foo") }; 57425bb815Sopenharmony_ciassert (JSON.stringify (o_object) == '{"a":1,"b":true,"c":"foo"}'); 58425bb815Sopenharmony_ci 59425bb815Sopenharmony_cichild = { "a": 1, "b": new String("\nfoo"), "c": undefined }; 60425bb815Sopenharmony_ciparent = { "a": true, "b": child, "c": null}; 61425bb815Sopenharmony_ci 62425bb815Sopenharmony_ciassert (JSON.stringify (parent) == '{"a":true,"b":{"a":1,"b":"\\nfoo"},"c":null}'); 63425bb815Sopenharmony_ci 64425bb815Sopenharmony_cirecursive_object = {}; 65425bb815Sopenharmony_cirecursive_object.a = 2; 66425bb815Sopenharmony_cirecursive_object.b = recursive_object; 67425bb815Sopenharmony_ci 68425bb815Sopenharmony_citry { 69425bb815Sopenharmony_ci JSON.stringify (recursive_object) 70425bb815Sopenharmony_ci // Should not be reached. 71425bb815Sopenharmony_ci assert (false); 72425bb815Sopenharmony_ci} catch (e) { 73425bb815Sopenharmony_ci assert (e instanceof TypeError); 74425bb815Sopenharmony_ci} 75425bb815Sopenharmony_ci 76425bb815Sopenharmony_ci// Checking arrays 77425bb815Sopenharmony_ciempty_array = []; 78425bb815Sopenharmony_ciassert (JSON.stringify (empty_array) == '[]'); 79425bb815Sopenharmony_ci 80425bb815Sopenharmony_ciarray = [undefined]; 81425bb815Sopenharmony_ciassert (JSON.stringify (array) == '[null]'); 82425bb815Sopenharmony_ci 83425bb815Sopenharmony_cip_array = [1, true, "foo", null, undefined]; 84425bb815Sopenharmony_ciassert (JSON.stringify (p_array) == '[1,true,"foo",null,null]'); 85425bb815Sopenharmony_ci 86425bb815Sopenharmony_cio_array = [new Number(1), new Boolean(true), new String("foo")]; 87425bb815Sopenharmony_ciassert (JSON.stringify (o_array) == '[1,true,"foo"]'); 88425bb815Sopenharmony_ci 89425bb815Sopenharmony_cichild = [ 1, new String("\nfoo"), undefined ]; 90425bb815Sopenharmony_ciparent = [ true, child, null ]; 91425bb815Sopenharmony_ci 92425bb815Sopenharmony_ciassert (JSON.stringify (parent) == '[true,[1,"\\nfoo",null],null]'); 93425bb815Sopenharmony_ci 94425bb815Sopenharmony_cirecursive_array = []; 95425bb815Sopenharmony_cirecursive_array[0] = 2; 96425bb815Sopenharmony_cirecursive_array[1] = recursive_array; 97425bb815Sopenharmony_ci 98425bb815Sopenharmony_citry { 99425bb815Sopenharmony_ci JSON.stringify (recursive_array) 100425bb815Sopenharmony_ci // Should not be reached. 101425bb815Sopenharmony_ci assert (false); 102425bb815Sopenharmony_ci} catch (e) { 103425bb815Sopenharmony_ci assert (e instanceof TypeError); 104425bb815Sopenharmony_ci} 105425bb815Sopenharmony_ci 106425bb815Sopenharmony_ciobject = {"a": 1, "b": [1, true, {"a": "foo"}]}; 107425bb815Sopenharmony_ciassert (JSON.stringify (object) == '{"a":1,"b":[1,true,{"a":"foo"}]}'); 108425bb815Sopenharmony_ci 109425bb815Sopenharmony_ciobject = {"a": [1], "b": {}}; 110425bb815Sopenharmony_ciassert (JSON.stringify(object) === '{"a":[1],"b":{}}'); 111425bb815Sopenharmony_ci 112425bb815Sopenharmony_ciarray = [1, {"a": 2, "b": true, c: [3]}]; 113425bb815Sopenharmony_ciassert (JSON.stringify (array) == '[1,{"a":2,"b":true,"c":[3]}]'); 114425bb815Sopenharmony_ci 115425bb815Sopenharmony_ci// Filtering / replacing 116425bb815Sopenharmony_cito_json_object = {}; 117425bb815Sopenharmony_cito_json_object.a = 2; 118425bb815Sopenharmony_cito_json_object.toJSON = function (key) { return 3; }; 119425bb815Sopenharmony_ci 120425bb815Sopenharmony_ciassert (JSON.stringify (to_json_object) === "3"); 121425bb815Sopenharmony_ci 122425bb815Sopenharmony_cifunction replacer_function (key, value) 123425bb815Sopenharmony_ci{ 124425bb815Sopenharmony_ci if (typeof(value) == "string") 125425bb815Sopenharmony_ci return "FOO"; 126425bb815Sopenharmony_ci return value; 127425bb815Sopenharmony_ci} 128425bb815Sopenharmony_ci 129425bb815Sopenharmony_ciobject = { "a": "JSON", "b": new String("JSON"), "c": 3 }; 130425bb815Sopenharmony_ciassert (JSON.stringify (object, replacer_function) == '{"a":"FOO","b":"JSON","c":3}'); 131425bb815Sopenharmony_ci 132425bb815Sopenharmony_cifilter = ["a", "b"]; 133425bb815Sopenharmony_ciassert (JSON.stringify (object, filter) == '{"a":"JSON","b":"JSON"}'); 134425bb815Sopenharmony_ci 135425bb815Sopenharmony_ciassert (JSON.stringify ([], [ 'foo', 'foo' ]) === '[]'); 136425bb815Sopenharmony_ci 137425bb815Sopenharmony_cinumber = new Number(2.2); 138425bb815Sopenharmony_cinumber.toString = {}; 139425bb815Sopenharmony_cinumber.valueOf = []; 140425bb815Sopenharmony_ci 141425bb815Sopenharmony_citry 142425bb815Sopenharmony_ci{ 143425bb815Sopenharmony_ci JSON.stringify([], [number]); 144425bb815Sopenharmony_ci // Should not be reached. 145425bb815Sopenharmony_ci assert (false); 146425bb815Sopenharmony_ci} 147425bb815Sopenharmony_cicatch (e) 148425bb815Sopenharmony_ci{ 149425bb815Sopenharmony_ci assert (e instanceof TypeError); 150425bb815Sopenharmony_ci} 151425bb815Sopenharmony_ci 152425bb815Sopenharmony_ci// Throw error in the replacer function 153425bb815Sopenharmony_cifunction replacer_thrower (key, value) 154425bb815Sopenharmony_ci{ 155425bb815Sopenharmony_ci throw new ReferenceError("foo"); 156425bb815Sopenharmony_ci return value; 157425bb815Sopenharmony_ci} 158425bb815Sopenharmony_ci 159425bb815Sopenharmony_citry { 160425bb815Sopenharmony_ci JSON.stringify (object, replacer_thrower) 161425bb815Sopenharmony_ci // Should not be reached. 162425bb815Sopenharmony_ci assert (false); 163425bb815Sopenharmony_ci} catch (e) { 164425bb815Sopenharmony_ci assert (e.message === "foo"); 165425bb815Sopenharmony_ci assert (e instanceof ReferenceError); 166425bb815Sopenharmony_ci} 167425bb815Sopenharmony_ci 168425bb815Sopenharmony_ci// Checking replacer with different primitive types 169425bb815Sopenharmony_ciobject = { "a": 2 }; 170425bb815Sopenharmony_ciassert (JSON.stringify (object, 3) == '{"a":2}'); 171425bb815Sopenharmony_ciassert (JSON.stringify (object, true) == '{"a":2}'); 172425bb815Sopenharmony_ciassert (JSON.stringify (object, null) == '{"a":2}'); 173425bb815Sopenharmony_ciassert (JSON.stringify (object, undefined) == '{"a":2}'); 174425bb815Sopenharmony_ciassert (JSON.stringify (object, "foo") == '{"a":2}'); 175425bb815Sopenharmony_ci 176425bb815Sopenharmony_ci// Checking replacer with different primitive types 177425bb815Sopenharmony_ciassert (JSON.stringify (object, new Boolean (true)) == '{"a":2}'); 178425bb815Sopenharmony_ciassert (JSON.stringify (object, new Number (3)) == '{"a":2}'); 179425bb815Sopenharmony_ciassert (JSON.stringify (object, new String ("foo")) == '{"a":2}'); 180425bb815Sopenharmony_ciassert (JSON.stringify (object, { "a": 3 }) == '{"a":2}'); 181425bb815Sopenharmony_ci 182425bb815Sopenharmony_ci// Checking JSON formatting 183425bb815Sopenharmony_ciobject = {"a": 2}; 184425bb815Sopenharmony_ciassert (JSON.stringify (object, null, " ") == '{\n "a": 2\n}'); 185425bb815Sopenharmony_ciassert (JSON.stringify (object, null, "asd") == '{\nasd"a": 2\n}'); 186425bb815Sopenharmony_ciassert (JSON.stringify (object, null, "asd0123456789") == '{\nasd0123456"a": 2\n}'); 187425bb815Sopenharmony_ciassert (JSON.stringify (object, null, "asd\u20400123456789") == '{\nasd⁀012345"a": 2\n}'); 188425bb815Sopenharmony_ciassert (JSON.stringify (object, null, 100) == '{\n "a": 2\n}'); 189425bb815Sopenharmony_ciassert (JSON.stringify (object, null, -5) == '{"a":2}'); 190425bb815Sopenharmony_ci 191425bb815Sopenharmony_ciarray = [2]; 192425bb815Sopenharmony_ciassert (JSON.stringify (array, null, " ") == '[\n 2\n]'); 193425bb815Sopenharmony_ciassert (JSON.stringify (array, null, "asd") == '[\nasd2\n]'); 194425bb815Sopenharmony_ciassert (JSON.stringify (array, null, "asd0123456789") == '[\nasd01234562\n]'); 195425bb815Sopenharmony_ciassert (JSON.stringify (array, null, "asd\u20400123456789") == '[\nasd⁀0123452\n]'); 196425bb815Sopenharmony_ciassert (JSON.stringify (array, null, 100) == '[\n 2\n]'); 197425bb815Sopenharmony_ciassert (JSON.stringify (array, null, -5) == '[2]'); 198425bb815Sopenharmony_ci 199425bb815Sopenharmony_cinested_object = {"a": 2, "b": {"c": 1, "d": true}}; 200425bb815Sopenharmony_ciassert (JSON.stringify (nested_object, null, 2) == '{\n "a": 2,\n "b": {\n "c": 1,\n "d": true\n }\n}'); 201425bb815Sopenharmony_ci 202425bb815Sopenharmony_cinested_array = [2, [1,true]]; 203425bb815Sopenharmony_ciassert (JSON.stringify (nested_array, null, 2) == '[\n 2,\n [\n 1,\n true\n ]\n]'); 204425bb815Sopenharmony_ci 205425bb815Sopenharmony_ci// Checking space (formatting parameter) with different primititve types 206425bb815Sopenharmony_ciobject = { "a": 2 }; 207425bb815Sopenharmony_ciassert (JSON.stringify (object, null, true) == '{"a":2}'); 208425bb815Sopenharmony_ciassert (JSON.stringify (object, null, null) == '{"a":2}'); 209425bb815Sopenharmony_ciassert (JSON.stringify (object, null, undefined) == '{"a":2}'); 210425bb815Sopenharmony_ci 211425bb815Sopenharmony_ci// Checking space (formatting parameter) with different object types 212425bb815Sopenharmony_ciassert (JSON.stringify (object, null, new Boolean (true)) == '{"a":2}'); 213425bb815Sopenharmony_ciassert (JSON.stringify (object, null, [1, 2, 3] ) == '{"a":2}'); 214425bb815Sopenharmony_ciassert (JSON.stringify (object, null, { "a": 3 }) == '{"a":2}'); 215