diff options
Diffstat (limited to 'LayoutTests/fast/js/resources/JSON-parse.js')
-rw-r--r-- | LayoutTests/fast/js/resources/JSON-parse.js | 576 |
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; + |