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

function write(v) { WScript.Echo(v + ""); }

var errorCount = 0;

// global

var globalList = [
    ["eval",1],
    ["parseInt",2],
    ["parseFloat",1],
    ["isNaN",1],
    ["isFinite",1],
    ["decodeURI",1],
    ["encodeURI",1],
    ["decodeURIComponent",1],
    ["encodeURIComponent",1],
    ["Object",0],
    ["Function",1],
    ["Array",1],
    ["String",1],
    ["Boolean",1],
    ["Number",1],
    ["Date",7],
    ["RegExp",2],
    ["Error",1],
    ["EvalError",1],
    ["RangeError",1],
    ["ReferenceError",1],
    ["SyntaxError",1],
    ["TypeError",1],
    ["URIError",1]
]

// Object
var objList = [
    //TODO ["constructor",0],
    ["toString",0],
    ["toLocaleString",0],
    ["valueOf",0],
    ["hasOwnProperty",1] ,
    ["isPrototypeOf",1] ,
    ["propertyIsEnumerable",1]
]

// Function
var funcList = [
    ["constructor",1],
    ["toString",0],
    ["apply",2 ],
    ["call", 1]
]

// Array
var arrList = [
    // FuncName, length
    ["constructor",1],
    ["toString",0],
    ["toLocaleString", 0],
    ["concat", 1],
    ["join",1],
    ["pop",0],
    ["push",1],
    ["reverse",0],
    ["shift",0],
    ["slice",2],
    ["sort",1],
    ["splice",2],
    ["unshift",1]
];


// String
var stringList = [
    ["constructor",1],
    ["toString",0],
    ["valueOf",0],
    ["charAt",1],
    ["charCodeAt",1],
    ["concat",1],
    ["indexOf",2],
    ["lastIndexOf",2],
    ["localeCompare",1],
    ["match",1],
    ["replace",1],
    ["search",0],
    ["slice",0],
    ["split",2],
    ["substring",2],
    ["toLowerCase",0],
    ["toLocaleLowerCase",0],
    ["toUpperCase",0],
    ["toLocaleUpperCase",0],

    // not in ECMA spec

    ["anchor",1],
    ["big",0],
    ["blink",0],
    ["bold",0],
    ["fixed",0],
    ["fontcolor",1],
    ["fontsize",1],
    ["italics",0],
    ["link",1],
    ["small",0],
    ["strike",0],
    ["sub",0],
    ["sup",0],
    ["substr",2]
]

var stringList2 = [
    ["fromCharCode", 0]
];

// Boolean
var boolList = [
    ["constructor",1],
    ["toString",0],
    ["valueOf",0]
]

//Number

var numberList = [
    ["constructor",1],
    ["toString",1],
    ["toLocaleString",0],
    ["valueOf",0],
    ["toFixed",1],
    ["toExponential",1],
    ["toPrecision",1]
]

// Math object is a single object  - 18
var mathList = [

    ["abs",1],
    ["acos",1],
    ["asin",1],
    ["atan",1],
    ["atan2",2],
    ["ceil",1],
    ["cos",1],
    ["exp",1],
    ["floor",1],
    ["log",1],
    ["max",2],
    ["min",2],
    ["pow",2],
    ["random",0],
    ["round",1],
    ["sin",1],
    ["sqrt",1],
    ["tan",1]
]

// Date Prototype object
var dateList = [
    ["constructor",7],

    ["toString",0],
    ["toDateString",0],
    ["toTimeString",0],
    ["toLocaleString",0],
    ["toLocaleDateString",0],

    ["valueOf",0],

    ["getTime",0],

    ["getFullYear",0],
    ["getUTCFullYear",0],

    ["getMonth",0],
    ["getUTCMonth",0],

    ["getDate",0],
    ["getUTCDate",0],

    ["getDay",0],
    ["getUTCDay",0],

    ["getHours",0],
    ["getUTCHours",0],

    ["getMinutes",0],
    ["getUTCMinutes",0],

    ["getSeconds",0],
    ["getUTCSeconds",0],

    ["getMilliseconds",0],
    ["getUTCMilliseconds",0],

    ["getTimezoneOffset",0],

    ["setTime",1],

    ["setMilliseconds",1],
    ["setUTCMilliseconds",1],

    ["setSeconds",2],
    ["setUTCSeconds",2],

    ["setMinutes",3],
    ["setUTCMinutes",3],

    ["setHours",4],
    ["setUTCHours",4],

    ["setDate",1],
    ["setUTCDate",1],

    ["setMonth",2],
    ["setUTCMonth",2],

    ["setFullYear",3],
    ["setUTCFullYear",3],

    ["toUTCString",0],

    // not in ECMA spec

    ["toGMTString",0],
    ["toLocaleTimeString",0 ],
    ["toUTCString",0],

    ["setYear",1],
    ["getYear",0]

    // TODO ["getVarDate",0]
]

// static date functions
var dateList2 = [
    ["parse",1],
    ["UTC",7]
]



// RegExp object

var regxpList = [
    ["constructor",2],
    ["exec",1],
    ["test",1],
    ["toString",0] //,
    // not in ECMA spec
    // TODO ["compile",2]

]


// Error object

var errorList = [
    ["constructor",1],
    ["name",5],
    ["message",0],
    ["toString",0]
]


function doEval(scen) {
    try {
        var res = eval(scen);
        write(res);
    } catch (e) {
        write("   Exception: " + scen + ".  :: " + e.message);
    }
}

var somevar = 0;

function TestToString(list, str) {
    for (var i=0; i<list.length; i++) {
        var fname = list[i][0];
        var fullStr = str+fname+".toString()";
        doEval(fullStr);
    }
}

TestToString(globalList,"");

TestToString(objList, "Object.prototype.");

TestToString(funcList, "Function.prototype.");

TestToString(arrList, "Array.prototype.");

TestToString(stringList, "String.prototype.");
TestToString(stringList2, "String.");

TestToString(boolList, "Boolean.prototype.");

TestToString(numberList, "Number.prototype.");

TestToString(mathList, "Math.");

TestToString(dateList, "Date.prototype.");
TestToString(dateList2,"Date.");

TestToString(regxpList, "RegExp.prototype.");

TestToString(errorList, "Error.prototype.");


if ( errorCount > 0 ) {
    throw Error(errorCount + " Test(s) Failed");
}
