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

// TrimStackTracePath is needed because same file is run in version 1/2 where LoadScriptFile is not defined
function TrimStackTracePath(obj)
{
    return obj;
}
if (this.WScript && typeof this.WScript.LoadScriptFile === "function")
{
    this.WScript.LoadScriptFile("TrimStackTracePath.js");
}

function PadString(s, l)
{
    while (s.length < l)
    {
        s += ' ';
    }
    return s;
}
function DumpObject(o)
{
    var a = new Array();
    for (var i in o)
    {
        a[a.length] = i;
    }
    a[a.length] = "description"; // Explicitly adding the known non-enumerable members
    a[a.length] = "number";
    a[a.length] = "stack";
    a.sort();
    for (var i = 0; i < a.length; i++)
    {
        if (a[i] === "stack")
        {
            o[a[i]] = TrimStackTracePath(o[a[i]]);
        }
        WScript.Echo(PadString(a[i], 15) + "= " + PadString("(" + typeof(o[a[i]]) + ")", 10) + o[a[i]]);
    }
    WScript.Echo(PadString("toString()", 15) + "= " + o.toString());
}

function Test(s)
{
    WScript.Echo(s);
    DumpObject(eval("new " + s));
    WScript.Echo();
}

function safeCall(f)
{
    var args = [];
    for (var a = 1; a < arguments.length; ++a)
        args.push(arguments[a]);
    try
    {
        return f.apply(this, args);
    }
    catch (ex)
    {
        WScript.Echo(ex.name + ": " + ex.message);
    }
}

Test("EvalError");
Test("RangeError('This is a range error')");
Test("ReferenceError");
Test("SyntaxError");
Test("TypeError('This is a type error')");
Test("URIError");
safeCall(Test, "RegExpError");
safeCall(Test, "ConversionError");
