emptyCases.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. /*
  6. ***************************UNIT TEST FOR SWITCH CASE OPTIMIZATION*****************************
  7. * Empty case statements
  8. */
  9. /*
  10. ***************************************TEST 1*****************************************
  11. * For empty test cases and an object present in the mid of empty test cases
  12. *
  13. */
  14. function f(x)
  15. {
  16. switch(x)
  17. {
  18. case 1:
  19. WScript.Echo(1);
  20. break;
  21. case 2:
  22. WScript.Echo(2);
  23. break;
  24. case 3:
  25. WScript.Echo(3);
  26. break;
  27. case 4:
  28. WScript.Echo(4);
  29. break;
  30. // empty integer case statements intercepted by an object
  31. case 5:
  32. case 6:
  33. case f: // object case - optimization should break the flow here
  34. case 8:
  35. case 9:
  36. WScript.Echo(9);
  37. break;
  38. case f:
  39. WScript.Echo(10);
  40. break;
  41. case 11:
  42. WScript.Echo(11);
  43. break;
  44. case 12:
  45. WScript.Echo(12);
  46. break;
  47. //Following four case statements are empty case statements with just a single case block
  48. //(optimizer will generate special instructions for such kind)
  49. case 13:
  50. case 14:
  51. case 15:
  52. case 16:
  53. WScript.Echo(16);
  54. break;
  55. case 17:
  56. WScript.Echo(17);
  57. break;
  58. case 18:
  59. WScript.Echo(18);
  60. break;
  61. case 19:
  62. WScript.Echo(19);
  63. break;
  64. case 20:
  65. WScript.Echo(20);
  66. default:
  67. WScript.Echo('default');
  68. break;
  69. }
  70. }
  71. for (i = 1; i < 20; i++) {
  72. f(i);
  73. }
  74. f(100); //default
  75. f(0); //default
  76. /*
  77. *****************************************TEST 2****************************************************
  78. * Test for case statements values in unsorted order
  79. * Set of Empty case statements are placed on the top, middle and at the bottom of the switch statement
  80. */
  81. function g(x)
  82. {
  83. switch(x)
  84. {
  85. /*empty case statements*/
  86. case 20:
  87. case 19:
  88. case 18:
  89. case 17:
  90. WScript.Echo(17);
  91. break;
  92. case 16:
  93. WScript.Echo(16);
  94. break;
  95. case 15:
  96. WScript.Echo(15);
  97. break;
  98. case 14:
  99. WScript.Echo(14);
  100. break;
  101. case 13:
  102. WScript.Echo(13);
  103. break;
  104. /*empty case statements*/
  105. case 12:
  106. case 11:
  107. case 10:
  108. case 9:
  109. WScript.Echo(9);
  110. break;
  111. case 8:
  112. WScript.Echo(8);
  113. break;
  114. case 7:
  115. WScript.Echo(7);
  116. break;
  117. case 6:
  118. WScript.Echo(6);
  119. break;
  120. /*empty case statements*/
  121. case 5:
  122. case 4:
  123. case 3:
  124. case 2:
  125. case 1:
  126. /* No default statement and no break at the end of the switch */
  127. }
  128. }
  129. g(1);
  130. g(2);
  131. g(3);
  132. g(4);
  133. g(5);
  134. g(6);
  135. g(7);
  136. g(8);
  137. g(9);
  138. g(10);
  139. g(11);
  140. g(12);
  141. g(13);
  142. g(14);
  143. g(15);
  144. g(16);
  145. g(17);
  146. g(18);
  147. g(19);
  148. g(20);
  149. g(100);
  150. g(0);
  151. /*
  152. ********************************TEST 3********************************
  153. ** All empty case statements
  154. */
  155. function h(x)
  156. {
  157. switch(x)
  158. {
  159. case 1:
  160. case 2:
  161. case 3:
  162. case 4:
  163. case 5:
  164. case 6:
  165. case 7:
  166. case 8:
  167. case 9:
  168. case 10:
  169. case 11:
  170. case 12:
  171. case 13:
  172. case 14:
  173. case 15:
  174. case 16:
  175. default:
  176. WScript.Echo('default');
  177. break;
  178. }
  179. }
  180. for(i=0;i<=13;i++)
  181. {
  182. h(i);
  183. }
  184. h('hello');
  185. for(i=14;i<=18;i++)
  186. {
  187. h(i);
  188. }