StepFlowTests.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using Esprima.Ast;
  2. using Jint.Runtime.Debugger;
  3. namespace Jint.Tests.Runtime.Debugger
  4. {
  5. public class StepFlowTests
  6. {
  7. private List<Node> CollectStepNodes(string script)
  8. {
  9. var engine = new Engine(options => options
  10. .DebugMode()
  11. .InitialStepMode(StepMode.Into));
  12. var nodes = new List<Node>();
  13. engine.DebugHandler.Step += (sender, info) =>
  14. {
  15. nodes.Add(info.CurrentNode);
  16. return StepMode.Into;
  17. };
  18. engine.Execute(script);
  19. return nodes;
  20. }
  21. [Fact]
  22. public void StepsThroughWhileLoop()
  23. {
  24. var script = @"
  25. let x = 0;
  26. while (x < 2)
  27. {
  28. x++;
  29. }
  30. ";
  31. var nodes = CollectStepNodes(script);
  32. Assert.Collection(nodes,
  33. node => Assert.IsType<VariableDeclaration>(node), // let x = 0;
  34. node => Assert.IsType<WhileStatement>(node), // while ...
  35. node => Assert.IsType<BinaryExpression>(node), // x < 2
  36. node => Assert.IsType<ExpressionStatement>(node), // x++;
  37. node => Assert.IsType<BinaryExpression>(node), // x < 2
  38. node => Assert.IsType<ExpressionStatement>(node), // x++;
  39. node => Assert.IsType<BinaryExpression>(node) // x < 2 (false)
  40. );
  41. }
  42. [Fact]
  43. public void StepsThroughDoWhileLoop()
  44. {
  45. var script = @"
  46. let x = 0;
  47. do
  48. {
  49. x++;
  50. }
  51. while (x < 2)
  52. ";
  53. var nodes = CollectStepNodes(script);
  54. Assert.Collection(nodes,
  55. node => Assert.IsType<VariableDeclaration>(node), // let x = 0;
  56. node => Assert.IsType<DoWhileStatement>(node), // do ...
  57. node => Assert.IsType<ExpressionStatement>(node), // x++;
  58. node => Assert.IsType<BinaryExpression>(node), // x < 2
  59. node => Assert.IsType<ExpressionStatement>(node), // x++;
  60. node => Assert.IsType<BinaryExpression>(node) // x < 2 (false)
  61. );
  62. }
  63. [Fact]
  64. public void StepsThroughForLoop()
  65. {
  66. var script = @"
  67. for (let x = 0; x < 2; x++)
  68. {
  69. 'dummy';
  70. }
  71. ";
  72. var nodes = CollectStepNodes(script);
  73. Assert.Collection(nodes,
  74. node => Assert.IsType<ForStatement>(node), // for ...
  75. node => Assert.IsType<VariableDeclaration>(node), // let x = 0
  76. node => Assert.IsType<BinaryExpression>(node), // x < 2
  77. node => Assert.True(node.IsLiteral("dummy")), // 'dummy';
  78. node => Assert.IsType<UpdateExpression>(node), // x++;
  79. node => Assert.IsType<BinaryExpression>(node), // x < 2
  80. node => Assert.True(node.IsLiteral("dummy")), // 'dummy';
  81. node => Assert.IsType<UpdateExpression>(node), // x++;
  82. node => Assert.IsType<BinaryExpression>(node) // x < 2 (false)
  83. );
  84. }
  85. [Fact]
  86. public void StepsThroughForOfLoop()
  87. {
  88. var script = @"
  89. const arr = [1, 2];
  90. for (const item of arr)
  91. {
  92. 'dummy';
  93. }
  94. ";
  95. var nodes = CollectStepNodes(script);
  96. Assert.Collection(nodes,
  97. node => Assert.IsType<VariableDeclaration>(node), // let arr = [1, 2];
  98. node => Assert.IsType<ForOfStatement>(node), // for ...
  99. node => Assert.IsType<VariableDeclaration>(node), // item
  100. node => Assert.True(node.IsLiteral("dummy")), // 'dummy';
  101. node => Assert.IsType<VariableDeclaration>(node), // item
  102. node => Assert.True(node.IsLiteral("dummy")) // 'dummy';
  103. );
  104. }
  105. [Fact]
  106. public void StepsThroughForInLoop()
  107. {
  108. var script = @"
  109. const obj = { x: 1, y: 2 };
  110. for (const key in obj)
  111. {
  112. 'dummy';
  113. }
  114. ";
  115. var nodes = CollectStepNodes(script);
  116. Assert.Collection(nodes,
  117. node => Assert.IsType<VariableDeclaration>(node), // let obj = { x: 1, y: 2 };
  118. node => Assert.IsType<ForInStatement>(node), // for ...
  119. node => Assert.IsType<VariableDeclaration>(node), // key
  120. node => Assert.IsType<ExpressionStatement>(node), // 'dummy';
  121. node => Assert.IsType<VariableDeclaration>(node), // key
  122. node => Assert.IsType<ExpressionStatement>(node) // 'dummy';
  123. );
  124. }
  125. [Fact]
  126. public void StepsThroughConstructor()
  127. {
  128. var script = @"
  129. class Test
  130. {
  131. constructor()
  132. {
  133. 'in constructor';
  134. }
  135. }
  136. new Test();
  137. 'after construction';
  138. ";
  139. var nodes = CollectStepNodes(script);
  140. Assert.Collection(nodes,
  141. node => Assert.IsType<ClassDeclaration>(node), // class Test
  142. node => Assert.IsType<ExpressionStatement>(node), // new Test();
  143. node => Assert.True(node.IsLiteral("in constructor")), // 'in constructor()'
  144. node => Assert.Null(node), // return point
  145. node => Assert.True(node.IsLiteral("after construction"))
  146. );
  147. }
  148. [Fact]
  149. public void SkipsFunctionBody()
  150. {
  151. var script = @"
  152. function test()
  153. {
  154. 'dummy';
  155. }
  156. test();
  157. ";
  158. var nodes = CollectStepNodes(script);
  159. Assert.Collection(nodes,
  160. node => Assert.IsType<FunctionDeclaration>(node), // function(test) ...;
  161. node => Assert.IsType<ExpressionStatement>(node), // test();
  162. node => Assert.True(node.IsLiteral("dummy")), // 'dummy';
  163. node => Assert.Null(node) // return point
  164. );
  165. }
  166. [Fact]
  167. public void SkipsReturnPointOfImplicitConstructor()
  168. {
  169. var script = @"
  170. class Test
  171. {
  172. }
  173. new Test();
  174. 'dummy';
  175. ";
  176. var nodes = CollectStepNodes(script);
  177. Assert.Collection(nodes,
  178. node => Assert.IsType<ClassDeclaration>(node), // class Test
  179. node => Assert.IsType<ExpressionStatement>(node), // new Test();
  180. node => Assert.True(node.IsLiteral("dummy")) // 'dummy';
  181. );
  182. }
  183. }
  184. }