Javascript  |  577行  |  19.43 KB


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;