//-------------------------------------------------------------------------------------------------------
// 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 + ""); }

function doEval(str)
{
    write(str + " : " + eval(str));
}


var overwrite = "hello";

write("Global object builtin properties");

var globProps = [ "NaN", "Infinity", "undefined"];

for(var i=0;i<globProps.length;i++)
{
   doEval("delete " +  globProps[i]);
   doEval(globProps[i]);
}

for(var i=0;i<globProps.length;i++)
{
   doEval(globProps[i] + "= \"hello\";");
   doEval(globProps[i]);
}

write("Math Object builtin properties");

var mathProps = ["PI", "E", "LN10", "LN2", "LOG2E", "LOG10E", "SQRT1_2", "SQRT2"];


for(var i=0;i<mathProps.length;i++)
{
   doEval("Math." + mathProps[i] + " = overwrite");
   doEval("Math." + mathProps[i]);
}

for(var i=0;i<mathProps.length;i++)
{
   doEval("delete Math." +  mathProps[i]);
   doEval("Math." + mathProps[i]);
}

write("Number Object builtin properties");

var numberProps = ["MAX_VALUE", "MIN_VALUE", "NaN", "NEGATIVE_INFINITY", "POSITIVE_INFINITY"];


for(var i=0;i<numberProps.length;i++)
{
   doEval("Number." + numberProps[i] + " = overwrite");
   doEval("Number." + numberProps[i]);
}

for(var i=0;i<mathProps.length;i++)
{
   doEval("delete Number." +  numberProps[i]);
   doEval("Number." + numberProps[i]);
}
