function (jsonObject){
        return jsonObject.stringify(1);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(1.5);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(-1);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(-1.5);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(null);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify("string");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Number(0));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Number(1));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Number(1.5));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Number(-1));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Number(-1.5));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new String("a string object"));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Boolean(true));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var value = new Number(1);
        value.valueOf = function() { return 2; }
        return jsonObject.stringify(value);
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        var value = new Boolean(true);
        value.valueOf = function() { return 2; }
        return jsonObject.stringify(value);
    }
FAIL tests[i](nativeJSON) should be 2. Was true.
function (jsonObject){
        var value = new String("fail");
        value.toString = function() { return "converted string"; }
        return jsonObject.stringify(value);
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        return jsonObject.stringify(true);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(false);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Date(0));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON});
    }
PASS tests[i](nativeJSON) threw exception TypeError: toISOString is not a function.
function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return "custom toISOString"; }});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return {}; }});
    }
FAIL tests[i](nativeJSON) should throw an exception. Was {}.
function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ throw "An exception"; }});
    }
PASS tests[i](nativeJSON) threw exception An exception.
function (jsonObject){
        var d = new Date(0);
        d.toISOString = null;
        return jsonObject.stringify(d);
    }
PASS tests[i](nativeJSON) threw exception TypeError: toISOString is not a function.
function (jsonObject){
        var d = new Date(0);
        d.toJSON = undefined;
        return jsonObject.stringify(d);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({get Foo() { return "bar"; }});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({get Foo() { this.foo="wibble"; return "bar"; }});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var count = 0;
        jsonObject.stringify({get Foo() { count++; return "bar"; }});
        return count;
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var count = 0;
        return jsonObject.stringify({get Foo() { count++; delete this.bar; return "bar"; }, bar: "wibble"});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var count = 0;
        return jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7}, function(k,v){allString = allString && (typeof k == "string"); return v});
        return allString;
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        jsonObject.stringify([1,2,3,4,5], function(k,v){allString = allString && (typeof k == "string"); return v});
        return allString;
    }
FAIL tests[i](nativeJSON) should be false. Was true.
function (jsonObject){
        var allString = true;
        var array = [];
        return jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7}, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        var array = ["a"];
        return jsonObject.stringify({get a(){return 1;array[1]="b";array[2]="c"}, b:"2", c:"3"}, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
        return jsonObject.stringify(simpleObject, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
        return jsonObject.stringify(simpleObjectWithProto, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        var array = [1, new Number(2), NaN, Infinity, -Infinity, new String("str")];
        return jsonObject.stringify({"1":"1","2":"2","NaN":"NaN","Infinity":"Infinity","-Infinity":"-Infinity","str":"str"}, array);
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        var allString = true;
        var array = ["1","2","3"];
        return jsonObject.stringify({1:'a', 2:'b', 3:'c'}, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        var array = ["1","2","3"];
        return jsonObject.stringify(simpleArray, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArray, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArray, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArray, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArray, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 10);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 11);
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "          ");
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "           ");
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        return jsonObject.stringify(complexArray, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexArray, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexArray, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexArray, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObject, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObject, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObject, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObject, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        var array = ["1","2","3"];
        return jsonObject.stringify(simpleArrayWithProto, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 10);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 11);
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "          ");
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "           ");
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, "  ");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, "ab");
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, 4);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(objectWithSideEffectGetter);
    }
FAIL tests[i](nativeJSON) should be {"foo":1}. Was {}.
function (jsonObject){
        return jsonObject.stringify(objectWithSideEffectGetterAndProto);
    }
FAIL tests[i](nativeJSON) should be {"foo":1}. Was {}.
function (jsonObject){
        return jsonObject.stringify(arrayWithSideEffectGetter);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(arrayWithSideEffectGetterAndProto);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        replaceTracker = "";
        jsonObject.stringify([1,2,3,,,,4,5,6], replaceFunc);
        return replaceTracker;
    }
FAIL tests[i](nativeJSON) should be (string)[1,2,3,null,null,null,4,5,6];0(number)1;1(number)2;2(number)3;3(number)undefined;4(number)undefined;5(number)undefined;6(number)4;7(number)5;8(number)6;. Was (string)[1,2,3,null,null,null,4,5,6];0(string)1;1(string)2;2(string)3;3(string)undefined;4(string)undefined;5(string)undefined;6(string)4;7(string)5;8(string)6;.
function (jsonObject){
        replaceTracker = "";
        jsonObject.stringify({a:"a", b:"b", c:"c", 3: "d", 2: "e", 1: "f"}, replaceFunc);
        return replaceTracker;
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        var count = 0;
        var array = [{toString:function(){count++; array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}];
        jsonObject.stringify(simpleObject, array);
        return count;
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var allString = true;
        var array = [{toString:function(){array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}, 'b', 'c'];
        return jsonObject.stringify(simpleObject, array);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var count = 0;
        var array = [{toString:function(){count++; array[0]='a'; array[1]='c'; array[2]='b'; return 'a'}}, 'b', 'c'];
        jsonObject.stringify(simpleObject, array);
        return count;
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({a:"1", get b() { this.a="foo"; return "getter"; }, c:"3"});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({a:"1", get b() { this.c="foo"; return "getter"; }, c:"3"});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var setterCalled = false;
        jsonObject.stringify({a:"1", set b(s) { setterCalled = true; return "setter"; }, c:"3"});
        return setterCalled;
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({a:"1", get b(){ return "getter"; }, set b(s) { return "setter"; }, c:"3"});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(new Array(10));
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify([undefined,,null,0,false]);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({p1:undefined,p2:null,p3:0,p4:false});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        cycleTracker = "";
        return jsonObject.stringify(cyclicObject);
    }
PASS tests[i](nativeJSON) threw exception TypeError: Converting circular structure to JSON.
function (jsonObject){
        cycleTracker = "";
        try { jsonObject.stringify(cyclicObject); } catch(e) { cycleTracker += " -> exception" }
        return cycleTracker;
    }
PASS tests[i](nativeJSON) is tests[i].expected
function (jsonObject){
        cycleTracker = "";
        return jsonObject.stringify(cyclicArray);
    }
PASS tests[i](nativeJSON) threw exception TypeError: Converting circular structure to JSON.
function (jsonObject){
        cycleTracker = "";
        try { jsonObject.stringify(cyclicArray); } catch(e) { cycleTracker += " -> exception" }
        return cycleTracker;
    }
FAIL tests[i](nativeJSON) should be 0(number):[object Object]first, -> exception. Was 0(string):[object Object]first, -> exception.
function (jsonObject){
        getterCalls = 0;
        return jsonObject.stringify(magicObject) + " :: getter calls = " + getterCalls;
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(undefined);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify(null);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({toJSON:function(){ return undefined; }});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({toJSON:function(){ return null; }});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify([{toJSON:function(){ return undefined; }}]);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify([{toJSON:function(){ return null; }}]);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({a:{toJSON:function(){ return undefined; }}});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({a:{toJSON:function(){ return null; }}});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({a:{toJSON:function(){ return function(){}; }}});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        return jsonObject.stringify({a:function(){}});
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var deepObject = {};
        for (var i = 0; i < 1000; i++)
            deepObject = {next:deepObject};
        return jsonObject.stringify(deepObject);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var deepArray = [];
        for (var i = 0; i < 1024; i++)
            deepArray = [deepArray];
        return jsonObject.stringify(deepArray);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var depth = 0;
        function toDeepVirtualJSONObject() {
            if (++depth >= 1000)
                return {};
            var r = {};
            r.toJSON = toDeepVirtualJSONObject;
            return {recurse: r};
        }
        return jsonObject.stringify(toDeepVirtualJSONObject());
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
function (jsonObject){
        var depth = 0;
        function toDeepVirtualJSONArray() {
            if (++depth >= 1024)
                return [];
            var r = [];
            r.toJSON = toDeepJSONArray;
            return [r];
        }
        return jsonObject.stringify(toDeepVirtualJSONArray());
    }
function (jsonObject){
        return jsonObject.stringify(fullCharsetString);
    }
PASS tests[i](nativeJSON) is tests[i](JSON)
PASS successfullyParsed is true

TEST COMPLETE

