1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
function assertStringify(v, expect)
{
assertEq(JSON.stringify(v), expect);
}
assertStringify({}, "{}");
assertStringify([], "[]");
assertStringify({"foo":"bar"}, '{"foo":"bar"}');
assertStringify({"null":null}, '{"null":null}');
assertStringify({"five":5}, '{"five":5}');
assertStringify({"five":5, "six":6}, '{"five":5,"six":6}');
assertStringify({"x":{"y":"z"}}, '{"x":{"y":"z"}}');
assertStringify({"w":{"x":{"y":"z"}}}, '{"w":{"x":{"y":"z"}}}');
assertStringify([1,2,3], '[1,2,3]');
assertStringify({"w":{"x":{"y":[1,2,3]}}}, '{"w":{"x":{"y":[1,2,3]}}}');
assertStringify({"false":false}, '{"false":false}');
assertStringify({"true":true}, '{"true":true}');
assertStringify({"child has two members": {"this":"one", 2:"and this one"}},
'{"child has two members":{"2":"and this one","this":"one"}}');
assertStringify({"x":{"a":"b","c":{"y":"z"},"f":"g"}},
'{"x":{"a":"b","c":{"y":"z"},"f":"g"}}');
assertStringify({"x":[1,{"y":"z"},3]}, '{"x":[1,{"y":"z"},3]}');
assertStringify([new String("hmm")], '["hmm"]');
assertStringify([new Boolean(true)], '[true]');
assertStringify([new Number(42)], '[42]');
assertStringify([new Date(Date.UTC(1978, 8, 13, 12, 24, 34, 23))],
'["1978-09-13T12:24:34.023Z"]');
assertStringify([1,,3], '[1,null,3]');
assertStringify({"mm\"mm":"hmm"}, '{"mm\\\"mm":"hmm"}');
assertStringify({"mm\"mm\"mm":"hmm"}, '{"mm\\\"mm\\\"mm":"hmm"}');
assertStringify({'"':"hmm"}, '{"\\\"":"hmm"}');
assertStringify({'\\':"hmm"}, '{"\\\\":"hmm"}');
assertStringify({'mmm\\mmm':"hmm"}, '{"mmm\\\\mmm":"hmm"}');
assertStringify({'mmm\\mmm\\mmm':"hmm"}, '{"mmm\\\\mmm\\\\mmm":"hmm"}');
assertStringify({"mm\u000bmm":"hmm"}, '{"mm\\u000bmm":"hmm"}');
assertStringify({"mm\u0000mm":"hmm"}, '{"mm\\u0000mm":"hmm"}');
var x = {"free":"variable"};
assertStringify(x, '{"free":"variable"}');
assertStringify({"y":x}, '{"y":{"free":"variable"}}');
// array prop
assertStringify({ a: [1,2,3] }, '{"a":[1,2,3]}');
assertStringify({"y": { foo: function(hmm) { return hmm; } } }, '{"y":{}}');
// test toJSON
var hmm = { toJSON: function() { return {"foo":"bar"} } };
assertStringify({"hmm":hmm}, '{"hmm":{"foo":"bar"}}');
assertStringify(hmm, '{"foo":"bar"}'); // on the root
// toJSON on prototype
var Y = function() {
this.not = "there?";
this.d = "e";
};
Y.prototype = {
not: "there?",
toJSON: function() { return {"foo":"bar"}}
};
var y = new Y();
assertStringify(y.toJSON(), '{"foo":"bar"}');
assertStringify(y, '{"foo":"bar"}');
// return undefined from toJSON
assertStringify({"hmm": { toJSON: function() { return; } } }, '{}');
// array with named prop
var x = new Array();
x[0] = 1;
x.foo = "bar";
assertStringify(x, '[1]');
// prototype
var X = function() { this.a = "b" };
X.prototype = { c: "d" };
assertStringify(new X(), '{"a":"b"}');
/******************************************************************************/
if (typeof reportCompare === "function")
reportCompare(true, true);
print("Tests complete");
|