590 lines
20 KiB
JavaScript
590 lines
20 KiB
JavaScript
|
|
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');
|
|
});
|
|
result.push(function(jsonObject){
|
|
return jsonObject.parse('\\')
|
|
});
|
|
result[result.length - 1].throws = true;
|
|
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);
|
|
}
|
|
}
|
|
|