// Copyright 2014 the V8 project authors. All rights reserved.
// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1.  Redistributions of source code must retain the above copyright
//     notice, this list of conditions and the following disclaimer.
// 2.  Redistributions in binary form must reproduce the above copyright
//     notice, this list of conditions and the following disclaimer in the
//     documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


function createTests() {
    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:undefined, e:null, "":12, get f(){ return simpleArray; }, array: complexArray};
    var simpleArrayWithProto = ['d', 'e', 'f'];
    simpleArrayWithProto.__proto__ = simpleObject;
    var simpleObjectWithProto = {d:"4", e:"5", f:"6", __proto__:simpleObject};
    var complexArrayWithProto = ['d', 'e', 'f',,,simpleObjectWithProto, simpleArrayWithProto, [simpleObjectWithProto,simpleArrayWithProto]];
    complexArrayWithProto.__proto__ = simpleObjectWithProto;
    var complexObjectWithProto = {d:"4", e:"5", f:"6", g:undefined, h:null, "":12, get i(){ return simpleArrayWithProto; }, array2: complexArrayWithProto, __proto__:complexObject};
    var objectWithSideEffectGetter = {get b() {this.foo=1;}};
    var objectWithSideEffectGetterAndProto = {__proto__:{foo:"bar"}, get b() {this.foo=1;}};
    var arrayWithSideEffectGetter = [];
    arrayWithSideEffectGetter.__defineGetter__("b", function(){this.foo=1;});
    var arrayWithSideEffectGetterAndProto = [];
    arrayWithSideEffectGetterAndProto.__defineGetter__("b", function(){this.foo=1;});
    arrayWithSideEffectGetterAndProto.__proto__ = {foo:"bar"};
    var result = [];
    result.push(function (jsonObject){
        return jsonObject.stringify(1);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(1.5);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(-1);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(-1.5);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(null);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify("string");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Number(0));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Number(1));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Number(1.5));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Number(-1));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Number(-1.5));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new String("a string object"));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Boolean(true));
    });
    result.push(function (jsonObject){
        var value = new Number(1);
        value.valueOf = function() { return 2; }
        return jsonObject.stringify(value);
    });
    result[result.length - 1].expected = '2';
    result.push(function (jsonObject){
        var value = new Boolean(true);
        value.valueOf = function() { return 2; }
        return jsonObject.stringify(value);
    });
    result[result.length - 1].expected = '2';
    result.push(function (jsonObject){
        var value = new String("fail");
        value.toString = function() { return "converted string"; }
        return jsonObject.stringify(value);
    });
    result[result.length - 1].expected = '"converted string"';
    result.push(function (jsonObject){
        return jsonObject.stringify(true);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(false);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Date(0));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON});
    });
    result[result.length - 1].throws = true;
    result.push(function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return "custom toISOString"; }});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ return {}; }});
    });
    result[result.length - 1].throws = true;
    result.push(function (jsonObject){
        return jsonObject.stringify({toJSON: Date.prototype.toJSON, toISOString: function(){ throw "An exception"; }});
    });
    result[result.length - 1].throws = true;
    result.push(function (jsonObject){
        var d = new Date(0);
        d.toISOString = null;
        return jsonObject.stringify(d);
    });
    result[result.length - 1].throws = true;
    result.push(function (jsonObject){
        var d = new Date(0);
        d.toJSON = undefined;
        return jsonObject.stringify(d);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({get Foo() { return "bar"; }});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({get Foo() { this.foo="wibble"; return "bar"; }});
    });
    result.push(function (jsonObject){
        var count = 0;
        jsonObject.stringify({get Foo() { count++; return "bar"; }});
        return count;
    });
    result.push(function (jsonObject){
        var count = 0;
        return jsonObject.stringify({get Foo() { count++; delete this.bar; return "bar"; }, bar: "wibble"});
    });
    result.push(function (jsonObject){
        var count = 0;
        return jsonObject.stringify({a:"1", b:"2", c:"3", 5:4, 4:5, 2:6, 1:7});
    });
    result.push(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;
    });
    result.push(function (jsonObject){
        var allString = true;
        jsonObject.stringify([1,2,3,4,5], function(k,v){allString = allString && (typeof k == "string"); return v});
        return allString;
    });
    result.push(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);
    });
    result.push(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);
    });
    result.push(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);
    });
    result.push(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);
    });
    result.push(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);
    });
    result[result.length - 1].expected = '{"1":"1","2":"2","NaN":"NaN","Infinity":"Infinity","-Infinity":"-Infinity","str":"str"}';
    result.push(function (jsonObject){
        var allString = true;
        var array = ["1","2","3"];
        return jsonObject.stringify({1:'a', 2:'b', 3:'c'}, array);
    });
    result.push(function (jsonObject){
        var allString = true;
        var array = ["1","2","3"];
        return jsonObject.stringify(simpleArray, array);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArray, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArray, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArray, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArray, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 10);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, 11);
    });
    result[result.length - 1].expected = JSON.stringify(simpleObject, null, 10);
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "          ");
    });
    result[result.length - 1].expected = JSON.stringify(simpleObject, null, 10);
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObject, null, "           ");
    });
    result[result.length - 1].expected = JSON.stringify(simpleObject, null, 10);
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArray, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArray, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArray, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArray, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObject, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObject, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObject, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObject, null, 4);
    });
    result.push(function (jsonObject){
        var allString = true;
        var array = ["1","2","3"];
        return jsonObject.stringify(simpleArrayWithProto, array);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleArrayWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 10);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, 11);
    });
    result[result.length - 1].expected = JSON.stringify(simpleObjectWithProto, null, 10);
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "          ");
    });
    result[result.length - 1].expected = JSON.stringify(simpleObjectWithProto, null, 10);
    result.push(function (jsonObject){
        return jsonObject.stringify(simpleObjectWithProto, null, "           ");
    });
    result[result.length - 1].expected = JSON.stringify(simpleObjectWithProto, null, 10);
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexArrayWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, "  ");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, "ab");
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(complexObjectWithProto, null, 4);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(objectWithSideEffectGetter);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(objectWithSideEffectGetterAndProto);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(arrayWithSideEffectGetter);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(arrayWithSideEffectGetterAndProto);
    });
    var replaceTracker;
    function replaceFunc(key, value) {
        replaceTracker += key + "("+(typeof key)+")" + JSON.stringify(value) + ";";
        return value;
    }
    result.push(function (jsonObject){
        replaceTracker = "";
        jsonObject.stringify([1,2,3,,,,4,5,6], replaceFunc);
        return replaceTracker;
    });
    result[result.length - 1].expected = '(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;'
    result.push(function (jsonObject){
        replaceTracker = "";
        jsonObject.stringify({a:"a", b:"b", c:"c", 3: "d", 2: "e", 1: "f"}, replaceFunc);
        return replaceTracker;
    });
    result[result.length - 1].expected = '(string){"1":"f","2":"e","3":"d","a":"a","b":"b","c":"c"};1(string)"f";2(string)"e";3(string)"d";a(string)"a";b(string)"b";c(string)"c";';
    result.push(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;
    });
    result.push(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);
    });
    result.push(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;
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({a:"1", get b() { this.a="foo"; return "getter"; }, c:"3"});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({a:"1", get b() { this.c="foo"; return "getter"; }, c:"3"});
    });
    result.push(function (jsonObject){
        var setterCalled = false;
        jsonObject.stringify({a:"1", set b(s) { setterCalled = true; return "setter"; }, c:"3"});
        return setterCalled;
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({a:"1", get b(){ return "getter"; }, set b(s) { return "setter"; }, c:"3"});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(new Array(10));
    });
    result.push(function (jsonObject){
        return jsonObject.stringify([undefined,,null,0,false]);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({p1:undefined,p2:null,p3:0,p4:false});
    });
    var cycleTracker = "";
    var cyclicObject = { get preSelf1() { cycleTracker+="preSelf1,"; return "preSelf1"; },
                             preSelf2: {toJSON:function(){cycleTracker+="preSelf2,"; return "preSelf2"}},
                             self: [],
                         get postSelf1() { cycleTracker+="postSelf1,"; return "postSelf1" },
                             postSelf2: {toJSON:function(){cycleTracker+="postSelf2,"; return "postSelf2"}},
                             toJSON : function(key) { cycleTracker += key + "("+(typeof key)+"):" + this; return this; }
                       };
    cyclicObject.self = cyclicObject;
    result.push(function (jsonObject){
        cycleTracker = "";
        return jsonObject.stringify(cyclicObject);
    });
    result[result.length - 1].throws = true;
    result.push(function (jsonObject){
        cycleTracker = "";
        try { jsonObject.stringify(cyclicObject); } catch(e) { cycleTracker += " -> exception" }
        return cycleTracker;
    });
    result[result.length - 1].expected = "(string):[object Object]preSelf1,preSelf2,self(string):[object Object] -> exception"
    var cyclicArray = [{toJSON : function(key,value) { cycleTracker += key + "("+(typeof key)+"):" + this; cycleTracker += "first,"; return this; }},
                       cyclicArray,
                       {toJSON : function(key,value) { cycleTracker += key + "("+(typeof key)+"):" + this; cycleTracker += "second,"; return this; }}];
    cyclicArray[1] = cyclicArray;
    result.push(function (jsonObject){
        cycleTracker = "";
        return jsonObject.stringify(cyclicArray);
    });
    result[result.length - 1].throws = true;
    result.push(function (jsonObject){
        cycleTracker = "";
        try { jsonObject.stringify(cyclicArray); } catch(e) { cycleTracker += " -> exception" }
        return cycleTracker;
    });
    result[result.length - 1].expected = "0(number):[object Object]first, -> exception";
    function createArray(len, o) { var r = []; for (var i = 0; i < len; i++) r[i] = o; return r; }
    var getterCalls;
    var magicObject = createArray(10, {abcdefg: [1,2,5,"ab", null, undefined, true, false,,],
                                       get calls() {return ++getterCalls; },
                                       "123":createArray(15, "foo"),
                                       "":{a:"b"}});
    result.push(function (jsonObject){
        getterCalls = 0;
        return jsonObject.stringify(magicObject) + " :: getter calls = " + getterCalls;
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(undefined);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify(null);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({toJSON:function(){ return undefined; }});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({toJSON:function(){ return null; }});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify([{toJSON:function(){ return undefined; }}]);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify([{toJSON:function(){ return null; }}]);
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({a:{toJSON:function(){ return undefined; }}});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({a:{toJSON:function(){ return null; }}});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({a:{toJSON:function(){ return function(){}; }}});
    });
    result.push(function (jsonObject){
        return jsonObject.stringify({a:function(){}});
    });
    result.push(function (jsonObject){
        var deepObject = {};
        for (var i = 0; i < 1000; i++)
            deepObject = {next:deepObject};
        return jsonObject.stringify(deepObject);
    });
    result.push(function (jsonObject){
        var deepArray = [];
        for (var i = 0; i < 1024; i++)
            deepArray = [deepArray];
        return jsonObject.stringify(deepArray);
    });
    result.push(function (jsonObject){
        var depth = 0;
        function toDeepVirtualJSONObject() {
            if (++depth >= 1000)
                return {};
            var r = {};
            r.toJSON = toDeepVirtualJSONObject;
            return {recurse: r};
        }
        return jsonObject.stringify(toDeepVirtualJSONObject());
    });
    result.push(function (jsonObject){
        var depth = 0;
        function toDeepVirtualJSONArray() {
            if (++depth >= 1024)
                return [];
            var r = [];
            r.toJSON = toDeepJSONArray;
            return [r];
        }
        return jsonObject.stringify(toDeepVirtualJSONArray());
    });
    var fullCharsetString = "";
    for (var i = 0; i < 65536; i++)
        fullCharsetString += String.fromCharCode(i);
    result.push(function (jsonObject){
        return jsonObject.stringify(fullCharsetString);
    });
    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)');
        else if (tests[i].expected)
            shouldBe('tests[i](nativeJSON)',  "tests[i].expected");
        else
            shouldBe('tests[i](nativeJSON)',  "tests[i](JSON)");
    }catch(e){}
}
