//-------------------------------------------------------------------------------------------------------
// 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 count = 0;
function check(scen) {
    var str = "check" + ++count + ": " + scen;
    try {
        var result = eval(scen);
        str += " #" + result;
    } catch (e) {
        str += " @" + e.message;
    }
    
    write(str);
}

var Test0 = function F_Test0()
{
}

var Test1 = function F_Test1()
{
    write(F_Test1);
}

// funcexpression assigned a value
var Test2 = function F_Test2()
{
    write(F_Test2);
    F_Test2 = 100;
    write(F_Test2);
}

//variable with same name
var Test3 = function F_Test3()
{
    write("Test3: " + F_Test3);
    var F_Test3;
    write("Test3: " + F_Test3);
}

// variable with same name with init
var Test4 = function F_Test4()
{
    write("Test4: " + F_Test4);
    var F_Test4 = 100;
    write("Test4: " + F_Test4);
}

// variable with same name with init
var Test5 = function F_Test5()
{
    write("Test5: " + F_Test5);
    var F_Test5;
    F_Test5 = 100;
    write("Test5: " + F_Test5);
}

// argument with same name
var Test6 = function F_Test6(F_Test6)
{
    write("Test6: " + F_Test6);
}

// argument with same name and assignment
var Test7 = function F_Test7(F_Test7)
{
    write("Test7: " + F_Test7);
    F_Test7 = 100;
    write("Test7: " + F_Test7);
}

// argument with same name and assignment
var Test8 = function F_Test8(F_Test8)
{
    write("Test8: " + F_Test8);
    F_Test8 = 100;
    write("Test8: " + F_Test8);
    write("Test8: " + arguments[0]);
}

// argument with same name and assignment
var Test9 = function F_Test9(F_Test9)
{
    write("Test9: " + F_Test9);
    arguments[0] = 100;
    write("Test9: " + F_Test9);
    write("Test9: " + arguments[0]);
}

eval("var Test10 = function F_Test10(){}");

var Test11 = function F_Test11()
{
    eval('write("Test11: " + F_Test11)');
}

eval("var Test12 = function F_Test12(){eval('write(\"Test12: \" + F_Test12)');}");

// funcexpression assigned a value
var Test13 = function F_Test13()
{
    write("Test13: " + F_Test13);
    eval("F_Test13 = 100");
    write("Test13: " + F_Test13);
}

// variable with same name with init
var Test14 = function F_Test14()
{
    write("Test14: " + F_Test14);
    eval("var F_Test14 = 100;");
    write("Test14: " + F_Test14);
}

// variable with same name with init
var Test15 = function F_Test15()
{
    write("Test15: " + F_Test15);
    eval("var F_Test15;");
    write("Test15: " + F_Test15);
    eval("F_Test15 = 100;");
    write("Test15: " + F_Test15);
}

// argument with same name
var Test16 = function F_Test16(F_Test16)
{
    eval("write(F_Test16)");
}

// argument with same name and assignment
var Test17 = function F_Test17(F_Test17)
{
    write("Test17: " + F_Test17);
    eval("F_Test17 = 100;");
    write("Test17: " + F_Test17);
}

// argument with same name and assignment
var Test18 = function F_Test18(F_Test18)
{
    write("Test18: " + F_Test18);
    eval("F_Test18 = 100;");
    write("Test18: " + F_Test18);
    write("Test18: " + arguments[0]);
}

// argument with same name and assignment
var Test19 = function F_Test19(F_Test19)
{
    write("Test19: " + F_Test19);
    eval("arguments[0] = 100;");
    write("Test19: " + F_Test19);
    write("Test19: " + arguments[0]);
}

var Test20 = function F_Test20()
{
  function inner20()
  {
      eval("var F_Test20 = 10");
      write(F_Test20);   
  } 
  inner20();
  WScript.Echo(F_Test20);
  return 0;
}

var Test21 = function F_Test21() 
{
    try {
        var x = function y() {
            var a = function b() {
                eval("WScript.Echo(y)");
                eval("y = 'legacy only'");
                eval("WScript.Echo(y)");
            }
            a();
        }
        x();
    } catch (ex) {
        WScript.Echo(ex);
    }
}

var Test22 = function F_Test22()
{
    eval('try {} catch(e) {} (function e(x){}); WScript.Echo(e);');
    return e;
}

var Test23 = function F_Test23() {
    var x = 1;
    new (function g() { 
        with({}) { 
            WScript.Echo('typeof g === ' + typeof g);
            WScript.Echo('typeof F_Test23 === ' + typeof F_Test23);
            WScript.Echo('typeof x === ' + typeof x);
            if (!x) 
                g(); 
        } 
    } );
}

var numTests = 24;

for (var i=0;i<numTests;i++)
{
    check("Test" + i + "();");
    check("Test" + i + "('hello');");
    check("F_Test" + i + "();");
}
