| Index: test/mjsunit/json2.js
|
| diff --git a/test/mjsunit/json2.js b/test/mjsunit/json2.js
|
| index c4392401ce74cfe501666182de515313b2771896..33e0aecd1e2928994a1cc478b3b7a15f0a3d4cc9 100644
|
| --- a/test/mjsunit/json2.js
|
| +++ b/test/mjsunit/json2.js
|
| @@ -27,6 +27,89 @@
|
|
|
| // Flags: --allow-natives-syntax
|
|
|
| +// Test JSON.stringify on the global object.
|
| +var a = 12345;
|
| +assertTrue(JSON.stringify(this).indexOf('"a":12345') > 0);
|
| +
|
| +// Test JSON.stringify of array in dictionary mode.
|
| +var array_1 = [];
|
| +var array_2 = [];
|
| +array_1[100000] = 1;
|
| +array_2[100000] = function() { return 1; };
|
| +var nulls = "";
|
| +for (var i = 0; i < 100000; i++) {
|
| + nulls += 'null,';
|
| +}
|
| +expected_1 = '[' + nulls + '1]';
|
| +expected_2 = '[' + nulls + 'null]';
|
| +assertEquals(expected_1, JSON.stringify(array_1));
|
| +assertEquals(expected_2, JSON.stringify(array_2));
|
| +
|
| +// Test JSValue with custom prototype.
|
| +var num_wrapper = Object(42);
|
| +num_wrapper.__proto__ = { __proto__: null,
|
| + toString: function() { return true; } };
|
| +assertEquals('1', JSON.stringify(num_wrapper));
|
| +
|
| +var str_wrapper = Object('2');
|
| +str_wrapper.__proto__ = { __proto__: null,
|
| + toString: function() { return true; } };
|
| +assertEquals('"true"', JSON.stringify(str_wrapper));
|
| +
|
| +var bool_wrapper = Object(false);
|
| +bool_wrapper.__proto__ = { __proto__: null,
|
| + toString: function() { return true; } };
|
| +// Note that toString function is not evaluated here!
|
| +assertEquals('false', JSON.stringify(bool_wrapper));
|
| +
|
| +// Test getters.
|
| +var counter = 0;
|
| +var getter_obj = { get getter() {
|
| + counter++;
|
| + return 123;
|
| + } };
|
| +assertEquals('{"getter":123}', JSON.stringify(getter_obj));
|
| +assertEquals(1, counter);
|
| +
|
| +// Test toJSON function.
|
| +var tojson_obj = { toJSON: function() {
|
| + counter++;
|
| + return [1, 2];
|
| + },
|
| + a: 1};
|
| +assertEquals('[1,2]', JSON.stringify(tojson_obj));
|
| +assertEquals(2, counter);
|
| +
|
| +// Test that we don't recursively look for the toJSON function.
|
| +var tojson_proto_obj = { a: 'fail' };
|
| +tojson_proto_obj.__proto__ = { toJSON: function() {
|
| + counter++;
|
| + return tojson_obj;
|
| + } };
|
| +assertEquals('{"a":1}', JSON.stringify(tojson_proto_obj));
|
| +
|
| +// Test toJSON produced by a getter.
|
| +var tojson_via_getter = { get toJSON() {
|
| + return function(x) {
|
| + counter++;
|
| + return 321;
|
| + };
|
| + },
|
| + a: 1 };
|
| +assertEquals('321', JSON.stringify(tojson_via_getter));
|
| +
|
| +// Test toJSON with key.
|
| +tojson_obj = { toJSON: function(key) { return key + key; } };
|
| +var tojson_with_key_1 = { a: tojson_obj, b: tojson_obj };
|
| +assertEquals('{"a":"aa","b":"bb"}', JSON.stringify(tojson_with_key_1));
|
| +var tojson_with_key_2 = [ tojson_obj, tojson_obj ];
|
| +assertEquals('["00","11"]', JSON.stringify(tojson_with_key_2));
|
| +
|
| +// Test toJSON with exception.
|
| +var tojson_ex = { toJSON: function(key) { throw "123" } };
|
| +assertThrows(function() { JSON.stringify(tojson_ex); });
|
| +
|
| +// Test holes in arrays.
|
| var fast_smi = [1, 2, 3, 4];
|
| fast_smi.__proto__ = [7, 7, 7, 7];
|
| delete fast_smi[2];
|
|
|