blob: b53272c450210b6cb06ae7ee54c08e37de822f06 [file] [log] [blame]
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[result.length - 1].jsonParseExpected = '{"__proto__":5}';
result[result.length - 1].evalExpected = '{}';
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[result.length - 1].throws = true; // rfc4627 does not allow literal tab characters in JSON source
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);
});
result[result.length - 1].jsonParseExpected = '{"":{"__proto__":{"keyType":"string"}},"keyType":"string"}';
result[result.length - 1].evalExpected = '{"":{},"keyType":"string"}';
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 if (tests[i].evalExpected) {
debug("json2.js uses eval and will differ when parsing JSON with __proto__.");
try { shouldNotBe('JSON.stringify(tests[i](nativeJSON))', 'JSON.stringify(tests[i](JSON))') } catch(e) { debug("threw - " + e) };
try { shouldBe('JSON.stringify(tests[i](nativeJSON))', 'tests[i].jsonParseExpected') } catch(e) { debug("threw - " + e) };
try { shouldBe('JSON.stringify(tests[i](JSON))', 'tests[i].evalExpected') } 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);
}
}