summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/JSON/cyclic-stringify.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--js/src/tests/non262/JSON/cyclic-stringify.js100
1 files changed, 100 insertions, 0 deletions
diff --git a/js/src/tests/non262/JSON/cyclic-stringify.js b/js/src/tests/non262/JSON/cyclic-stringify.js
new file mode 100644
index 0000000000..5eb6273a97
--- /dev/null
+++ b/js/src/tests/non262/JSON/cyclic-stringify.js
@@ -0,0 +1,100 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/licenses/publicdomain/
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 578273;
+var summary =
+ "ES5: Properly detect cycles in JSON.stringify (throw TypeError, check for " +
+ "cycles rather than imprecisely rely on recursion limits)";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+// objects
+
+var count = 0;
+var desc =
+ {
+ get: function() { count++; return obj; },
+ enumerable: true,
+ configurable: true
+ };
+var obj = Object.defineProperty({ p1: 0 }, "p2", desc);
+
+try
+{
+ var str = JSON.stringify(obj);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 1,
+ "cyclic data structures not detected immediately");
+}
+
+count = 0;
+var obj2 = Object.defineProperty({}, "obj", desc);
+try
+{
+ var str = JSON.stringify(obj2);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 2,
+ "cyclic data structures not detected immediately");
+}
+
+
+// arrays
+
+var count = 0;
+var desc =
+ {
+ get: function() { count++; return arr; },
+ enumerable: true,
+ configurable: true
+ };
+var arr = Object.defineProperty([], "0", desc);
+
+try
+{
+ var str = JSON.stringify(arr);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 1,
+ "cyclic data structures not detected immediately");
+}
+
+count = 0;
+var arr2 = Object.defineProperty([], "0", desc);
+try
+{
+ var str = JSON.stringify(arr2);
+ assertEq(false, true, "should have thrown, got " + str);
+}
+catch (e)
+{
+ assertEq(e instanceof TypeError, true,
+ "wrong error type: " + e.constructor.name);
+ assertEq(count, 2,
+ "cyclic data structures not detected immediately");
+}
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);
+
+print("Tests complete");