summaryrefslogtreecommitdiffstats
path: root/LayoutTests/fast/js/resources/JSON-parse.js
diff options
context:
space:
mode:
Diffstat (limited to 'LayoutTests/fast/js/resources/JSON-parse.js')
-rw-r--r--LayoutTests/fast/js/resources/JSON-parse.js576
1 files changed, 576 insertions, 0 deletions
diff --git a/LayoutTests/fast/js/resources/JSON-parse.js b/LayoutTests/fast/js/resources/JSON-parse.js
new file mode 100644
index 0000000..b78df25
--- /dev/null
+++ b/LayoutTests/fast/js/resources/JSON-parse.js
@@ -0,0 +1,576 @@
+
+function createTests() {
+ var result = [];
+ result.push(function(jsonObject){
+ return jsonObject.parse();
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('1');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('-1');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('Infinity');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('NaN');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('null');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('undefined');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{}');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('({})');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{a}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{a:}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{a:5}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{a:5,}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"a"}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"a":}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"a":5}');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"__proto__":5}');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"a":5,}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"a":5,,}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"a":5,"a",}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"a":(5,"a"),}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('[]');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('[1]');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('[1,]');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('[1,2]');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('[1,2,,]');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('[1,2,,4]');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('""');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"\'"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\"');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\z"');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\\z"');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\\\z"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\tz"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\tz"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\nz"');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\nz"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\rz"');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\rz"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\/z"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\/z"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\bz"');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\bz"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\rz"');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\rz"');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\uz" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u0z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u00z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u000z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u0000z" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u000Az" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u000az" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u000Gz" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u000gz" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u00A0z" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u00a0z" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u00G0z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u00g0z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u0A00z" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u0a00z" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u0G00z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\u0g00z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\uA000z" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\ua000z" ');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\uG000z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a\\ug000z" ');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('00');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('01');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('0.a');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('0x0');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('2e1.3');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('2e-+10');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('2e+-10');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('2e3e4');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('-01.0');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('-01');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('-01.a');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('1.e1');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{/* block comments are not allowed */}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('{// line comments are not allowed \n}');
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ return jsonObject.parse('true');
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('false');
+ });
+ var simpleArray = ['a', 'b', 'c'];
+ var simpleObject = {a:"1", b:"2", c:"3"};
+ var complexArray = ['a', 'b', 'c',,,simpleObject, simpleArray, [simpleObject,simpleArray]];
+ var complexObject = {a:"1", b:"2", c:"3", d:4.5e10, g: 0.45e-5, h: 0.0, i: 0, j:.5, k:0., l:-0, m:-0.0, n:-0., o:-.5, p:-0.45e-10, q:-4.5e10, e:null, "":12, f: simpleArray, array: complexArray};
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(simpleObject));
+ });
+ result[result.length - 1].expected = JSON.stringify(simpleObject);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject));
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject));
+ });
+ result[result.length - 1].expected = JSON.stringify(complexObject);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(simpleObject,null,100));
+ });
+ result[result.length - 1].expected = JSON.stringify(simpleObject);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject,null,100));
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject,null,100));
+ });
+ result[result.length - 1].expected = JSON.stringify(complexObject);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(simpleObject,null," "));
+ });
+ result[result.length - 1].expected = JSON.stringify(simpleObject);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject,null," "));
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject,null," "));
+ });
+ result[result.length - 1].expected = JSON.stringify(complexObject);
+
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(simpleObject,null,"\t"));
+ });
+ result[result.length - 1].expected = JSON.stringify(simpleObject);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject,null,"\t"));
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject,null,"\t"));
+ });
+ result[result.length - 1].expected = JSON.stringify(complexObject);
+
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(simpleObject,null,"\n"));
+ });
+ result[result.length - 1].expected = JSON.stringify(simpleObject);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject,null,"\n"));
+ });
+ result[result.length - 1].expected = JSON.stringify(complexObject);
+ function log(key, value) {
+ var o = {};
+ o[key] = value;
+ o.keyType = typeof key;
+ return o;
+ }
+ result.push(function(jsonObject){
+ return jsonObject.parse("true", log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse("false", log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse("null", log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse("1", log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse("1.5", log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('"a string"', log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(simpleArray), log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexArray), log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(simpleObject), log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(complexObject), log);
+ });
+ result.push(function(jsonObject){
+ return jsonObject.parse('{"__proto__":{"a":5}}', log);
+ });
+ var logOrderString;
+ function logOrder(key, value) {
+ logOrderString += key +":"+JSON.stringify(value);
+ return null;
+ }
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse("true", logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse("false", logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse("null", logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse("1", logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse("1.5", logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse('"a string"', logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse(JSON.stringify(simpleArray), logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse(JSON.stringify(complexArray), logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse(JSON.stringify(simpleObject), logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ return jsonObject.parse(JSON.stringify(complexObject), logOrder);
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse("true", logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse("false", logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse("null", logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse("1", logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse("1.5", logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse('"a string"', logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse(JSON.stringify(simpleArray), logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse(JSON.stringify(complexArray), logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse(JSON.stringify(simpleObject), logOrder);
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ logOrderString = "";
+ jsonObject.parse(JSON.stringify(complexObject), logOrder);
+ return logOrderString;
+ });
+ var callCount = 0;
+ function throwAfterFifthCall(key, value) {
+ logOrder(key, value);
+ if (++callCount > 5)
+ throw "from reviver";
+ return null;
+ }
+ result.push(function(jsonObject){
+ callCount = 0;
+ logOrderString = "";
+ return jsonObject.parse(JSON.stringify(complexArray), throwAfterFifthCall);
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ callCount = 0;
+ logOrderString = "";
+ return jsonObject.parse(JSON.stringify(simpleObject), throwAfterFifthCall);
+ });
+ result.push(function(jsonObject){
+ callCount = 0;
+ logOrderString = "";
+ return jsonObject.parse(JSON.stringify(complexObject), throwAfterFifthCall);
+ });
+ result[result.length - 1].throws = true;
+ result.push(function(jsonObject){
+ callCount = 0;
+ logOrderString = "";
+ try { jsonObject.parse(JSON.stringify(complexArray), throwAfterFifthCall); } catch (e) {}
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ callCount = 0;
+ logOrderString = "";
+ try { jsonObject.parse(JSON.stringify(simpleObject), throwAfterFifthCall); } catch (e) {}
+ return logOrderString;
+ });
+ result.push(function(jsonObject){
+ callCount = 0;
+ logOrderString = "";
+ try { jsonObject.parse(JSON.stringify(complexObject), throwAfterFifthCall); } catch (e) {}
+ return logOrderString;
+ });
+ var unicode = "";
+ for (var i = 0; i < 1<<16; i++)
+ unicode += String.fromCharCode(i);
+ result.push(function(jsonObject){
+ return jsonObject.parse(JSON.stringify(unicode));
+ });
+ result[result.length - 1].unstringifiedExpected = unicode;
+ return result;
+}
+var tests = createTests();
+for (var i = 0; i < tests.length; i++) {
+ try {
+ debug(tests[i]);
+ if (tests[i].throws) {
+ shouldThrow('tests[i](nativeJSON)');
+ try {
+ var threw = false;
+ tests[i](JSON);
+ } catch(e) {
+ var threw = true;
+ }
+ if (!threw)
+ debug("json2.js did not throw for a test we expect to throw.");
+ } else if (tests[i].expected)
+ try { shouldBe('JSON.stringify(tests[i](nativeJSON))', "tests[i].expected") } catch(e) { debug("threw - " + e)}
+ else if (tests[i].unstringifiedExpected)
+ try { shouldBe('tests[i](nativeJSON)', "tests[i].unstringifiedExpected") } catch(e) { debug("threw - " + e)}
+ else
+ try { shouldBe('JSON.stringify(tests[i](nativeJSON))', 'JSON.stringify(tests[i](JSON))') } catch(e) { debug("threw - " + e) };
+ }catch(e){
+ debug(e);
+ }
+}
+successfullyParsed = true;
+