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