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]; |