blob: 20087514bbc92f30192345368c3350a843e52d2b [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
this.WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
function f1_f(){};
var f2_v = 123;
function f3_f(){};
var f4_v = 123;
let f5_l = 123;
const f6_c = 123;
var ex = "0";
// Top level function in script does not conflict with another top level function
WScript.LoadScript("function f1_f(){};");
// Top level function in script does not conflict with same-named var
WScript.LoadScript("function f2_v(){};");
// Top level function in eval does not conflict with another top level function
eval("function f3_f(){};");
// Top level function in eval does not conflict with same-named var
eval("function f4_v(){};");
// Top level function in script conflicts with top level let
try { WScript.LoadScript("function f5_l(){};"); } catch (e) { ex = e.message }
assert.areEqual("Let/Const redeclaration", ex);
ex = "1";
// Top level function in script conflicts with top level const
try { WScript.LoadScript("function f6_c(){};"); } catch (e) { ex = e.message }
assert.areEqual("Let/Const redeclaration", ex);
ex = "2";
// Top level function in eval conflicts with top level let
try { eval("function f5_l(){};") } catch (e) { ex = e.message}
assert.areEqual("Let/Const redeclaration", ex);
ex = "3";
// Top level function in eval conflicts with top level const
try { eval("function f6_c(){};") } catch (e) { ex = e.message }
assert.areEqual("Let/Const redeclaration", ex);
ex = "4";
(function ff() {
if (true) {
let fo5_l = 123;
if (true) {
// TODO: this is blocked by https://github.com/Microsoft/ChakraCore/issues/5070
//
// Top level function in eval conflicts with outer function level let
try { eval("function fo5_l(){};") } catch (e) { ex = e.message }
assert.areEqual("4", ex);
ex = "5";
}
}
if (true) {
// Top level function in eval conflicts with outer function level const
try { eval("function fo6_c(){};") } catch (e) { ex = e.message }
}
assert.areEqual("Let/Const redeclaration", ex);
ex = "6";
const fo6_c = 123;
})();
(function ffs() {
'use strict';
let fos5_l = 123;
// Top level function in eval conflicts with outer function level let (strict)
eval("function fos5_l(){};");
if (true) {
// Top level function in eval conflicts with outer function level const (strict)
eval("function fos6_c(){};");
}
const fos6_c = 123;
})();
(function ffl() {
let fo5_l_sl = 123;
// Top level function in eval conflicts with outer function level let
try { eval("function fo5_l_sl(){};") } catch (e) { ex = e.message }
assert.areEqual("Let/Const redeclaration", ex);
ex = "7";
// Top level function in eval conflicts with outer function level const
try { eval("function fo6_c_sl(){};") } catch (e) { ex = e.message }
assert.areEqual("Let/Const redeclaration", ex);
ex = "8";
const fo6_c_sl = 123;
})();
(function ffsl() {
'use strict';
let fos5_l = 123;
// Top level function in eval conflicts with outer function level let (strict)
WScript.LoadScript("function fos5_l_sl(){};");
// Top level function in eval conflicts with outer function level const (strict)
WScript.LoadScript("function fos6_c_sl(){};");
const fos6_c_sl = 123;
})();
(function ffn() {
let fo5_l_nf = 123;
// Top level function in "new Function" does not conflict with outer function level let
f = (new Function("return function fo5_l_nf(){};"))();
// Top level function in "new Function" does not conflict with outer function level const
f = (new Function("return function fo6_c_nf(){};"))();
assert.areEqual("function fo6_c_nf(){}", f.toString());
const fo6_c_nf = 123;
})();
// Top level function in eval does not conflict with top level const, in a class (since strict is assumed)
class C1
{
static M()
{
eval("function f6_c(){};");
}
}
C1.M();
// Top level function in eval does not conflict with class level get
class C2
{
get f7_l() {return "q";};
static M()
{
eval("function f7_l(){};");
}
}
C2.M();
WScript.RegisterModuleSource("mod0.js", `
import 'mod1.js';
let qwer = 12;
`);
WScript.RegisterModuleSource("mod1.js",`
// no redeclaration here since modules are not introducing global names.
export function qwer(){};
`);
WScript.LoadScriptFile("mod0.js", "module");
WScript.Echo("PASS");