//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

var echo = WScript.Echo;

function guarded_call(func) {
    try {
        func();
    } catch (e) {
        echo(e.name + " : " + e.message);
    }
}

var testCount = 0;
function scenario(title) {
    if (testCount > 0) {
        echo("\n");
    }
    echo((testCount++) + ".", title);
}

scenario("Non Object");
var nonObjList = [
    1, NaN, true, null, undefined
];
for (var i = 0; i < nonObjList.length; i++) {
    var o = nonObjList[i];
    guarded_call(function () {
        echo(o, "-->", Array.prototype.toLocaleString.apply(o));
    });
}

scenario("Object, length not uint32");
var badLength = [
    true, "abc", 1.234, {}
];
for (var i = 0; i < badLength.length; i++) {
    var len = badLength[i];
    var o = { length: len };
    guarded_call(function () {
        echo("length:", len, "-->", Array.prototype.toLocaleString.apply(o));
    });
}

scenario("Array: normal");
var o = [
    0, 1.23, NaN, true, "abc", {}, [], [0, 1, 2]
];

// 0.toLocaleString() is supposed to be 0. However our baseline has an exception.
// So, do not break it while supporting cross platform locale output
var output = Array.prototype.toLocaleString.apply(o);
if ( output == "0, 1.23, NaN, true, abc, [object Object], , 0, 1, 2" ) {
    echo("0.00, 1.23, NaN, true, abc, [object Object], , 0.00, 1.00, 2.00");
} else {
    echo(output);
}

scenario("Array: element toLocaleString not callable");
var o = [
    0,
    {toLocaleString: 123}
];
guarded_call(function () {
    echo(Array.prototype.toLocaleString.apply(o));
});

scenario("Array: element toLocaleString");
var o = [
    0,
    { toLocaleString: function () { return "anObject"; } },
    undefined,
    null,
    { toLocaleString: function () { return "another Object"; } },
    [
        1,
        { toLocaleString: function () { return "a 3rd Object"; } },
        2
    ]
];

// 0.toLocaleString() is supposed to be 0. However our baseline has an exception.
// So, do not break it while supporting cross platform locale output
output = Array.prototype.toLocaleString.apply(o);
if ( output == "0, anObject, , , another Object, 1, a 3rd Object, 2" ) {
    echo("0.00, anObject, , , another Object, 1.00, a 3rd Object, 2.00");
} else {
    echo(output);
}

scenario("Object: normal");
var o = {
    0: 0,
    1: 1.23,
    2: NaN,
    3: true,
    4: "abc",
    5: {},
    6: [],
    7: [0, 1, 2],
    length: 8,
    8: "should not appear",
    "-1": "should not appear"
};

// 0.toLocaleString() is supposed to be 0. However our baseline has an exception.
// So, do not break it while supporting cross platform locale output
guarded_call(function () {
    output = Array.prototype.toLocaleString.apply(o);
    if ( output == "0, 1.23, NaN, true, abc, [object Object], , 0, 1, 2" ) {
        echo("0.00, 1.23, NaN, true, abc, [object Object], , 0.00, 1.00, 2.00");
    } else {
        echo(output);
    }
});

scenario("Object: element toLocaleString not callable");
var o = {
    0: 0,
    1: { toLocaleString: 123 },
    length: 2
};
guarded_call(function () {
    echo(Array.prototype.toLocaleString.apply(o));
});

scenario("Object: element toLocaleString");
var o = {
    0: 0,
    1: { toLocaleString: function () { return "anObject"; } },
    2: undefined,
    3: null,
    4: { toLocaleString: function () { return "another Object"; } },
    5: [
        1,
        { toLocaleString: function () { return "a 3rd Object"; } },
        2
    ],
    length: 6,
    6: "should not appear",
    7: "should not appear",
    "-1": "should not appear"
};

// 0.toLocaleString() is supposed to be 0. However our baseline has an exception.
// So, do not break it while supporting cross platform locale output
guarded_call(function () {
    output = Array.prototype.toLocaleString.apply(o);
    if ( output == "0, anObject, , , another Object, 1, a 3rd Object, 2" ) {
        echo("0.00, anObject, , , another Object, 1.00, a 3rd Object, 2.00");
    } else {
        echo(output);
    }
});
