funcDeclConflict.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. this.WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
  6. function f1_f(){};
  7. var f2_v = 123;
  8. function f3_f(){};
  9. var f4_v = 123;
  10. let f5_l = 123;
  11. const f6_c = 123;
  12. var ex = "0";
  13. // Top level function in script does not conflict with another top level function
  14. WScript.LoadScript("function f1_f(){};");
  15. // Top level function in script does not conflict with same-named var
  16. WScript.LoadScript("function f2_v(){};");
  17. // Top level function in eval does not conflict with another top level function
  18. eval("function f3_f(){};");
  19. // Top level function in eval does not conflict with same-named var
  20. eval("function f4_v(){};");
  21. // Top level function in script conflicts with top level let
  22. try { WScript.LoadScript("function f5_l(){};"); } catch (e) { ex = e.message }
  23. assert.areEqual("Let/Const redeclaration", ex);
  24. ex = "1";
  25. // Top level function in script conflicts with top level const
  26. try { WScript.LoadScript("function f6_c(){};"); } catch (e) { ex = e.message }
  27. assert.areEqual("Let/Const redeclaration", ex);
  28. ex = "2";
  29. // Top level function in eval conflicts with top level let
  30. try { eval("function f5_l(){};") } catch (e) { ex = e.message}
  31. assert.areEqual("Let/Const redeclaration", ex);
  32. ex = "3";
  33. // Top level function in eval conflicts with top level const
  34. try { eval("function f6_c(){};") } catch (e) { ex = e.message }
  35. assert.areEqual("Let/Const redeclaration", ex);
  36. ex = "4";
  37. (function ff() {
  38. if (true) {
  39. let fo5_l = 123;
  40. if (true) {
  41. // TODO: this is blocked by https://github.com/Microsoft/ChakraCore/issues/5070
  42. //
  43. // Top level function in eval conflicts with outer function level let
  44. try { eval("function fo5_l(){};") } catch (e) { ex = e.message }
  45. assert.areEqual("4", ex);
  46. ex = "5";
  47. }
  48. }
  49. if (true) {
  50. // Top level function in eval conflicts with outer function level const
  51. try { eval("function fo6_c(){};") } catch (e) { ex = e.message }
  52. }
  53. assert.areEqual("Let/Const redeclaration", ex);
  54. ex = "6";
  55. const fo6_c = 123;
  56. })();
  57. (function ffs() {
  58. 'use strict';
  59. let fos5_l = 123;
  60. // Top level function in eval conflicts with outer function level let (strict)
  61. eval("function fos5_l(){};");
  62. if (true) {
  63. // Top level function in eval conflicts with outer function level const (strict)
  64. eval("function fos6_c(){};");
  65. }
  66. const fos6_c = 123;
  67. })();
  68. (function ffl() {
  69. let fo5_l_sl = 123;
  70. // Top level function in eval conflicts with outer function level let
  71. try { eval("function fo5_l_sl(){};") } catch (e) { ex = e.message }
  72. assert.areEqual("Let/Const redeclaration", ex);
  73. ex = "7";
  74. // Top level function in eval conflicts with outer function level const
  75. try { eval("function fo6_c_sl(){};") } catch (e) { ex = e.message }
  76. assert.areEqual("Let/Const redeclaration", ex);
  77. ex = "8";
  78. const fo6_c_sl = 123;
  79. })();
  80. (function ffsl() {
  81. 'use strict';
  82. let fos5_l = 123;
  83. // Top level function in eval conflicts with outer function level let (strict)
  84. WScript.LoadScript("function fos5_l_sl(){};");
  85. // Top level function in eval conflicts with outer function level const (strict)
  86. WScript.LoadScript("function fos6_c_sl(){};");
  87. const fos6_c_sl = 123;
  88. })();
  89. (function ffn() {
  90. let fo5_l_nf = 123;
  91. // Top level function in "new Function" does not conflict with outer function level let
  92. f = (new Function("return function fo5_l_nf(){};"))();
  93. // Top level function in "new Function" does not conflict with outer function level const
  94. f = (new Function("return function fo6_c_nf(){};"))();
  95. assert.areEqual("function fo6_c_nf(){}", f.toString());
  96. const fo6_c_nf = 123;
  97. })();
  98. // Top level function in eval does not conflict with top level const, in a class (since strict is assumed)
  99. class C1
  100. {
  101. static M()
  102. {
  103. eval("function f6_c(){};");
  104. }
  105. }
  106. C1.M();
  107. // Top level function in eval does not conflict with class level get
  108. class C2
  109. {
  110. get f7_l() {return "q";};
  111. static M()
  112. {
  113. eval("function f7_l(){};");
  114. }
  115. }
  116. C2.M();
  117. WScript.RegisterModuleSource("mod0.js", `
  118. import 'mod1.js';
  119. let qwer = 12;
  120. `);
  121. WScript.RegisterModuleSource("mod1.js",`
  122. // no redeclaration here since modules are not introducing global names.
  123. export function qwer(){};
  124. `);
  125. WScript.LoadScriptFile("mod0.js", "module");
  126. WScript.Echo("PASS");