StepFlowTests.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. string 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. string 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. string 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.IsType<ExpressionStatement>(node), // 'dummy';
  78. node => Assert.IsType<UpdateExpression>(node), // x++;
  79. node => Assert.IsType<BinaryExpression>(node), // x < 2
  80. node => Assert.IsType<ExpressionStatement>(node), // '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. string 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.IsType<ExpressionStatement>(node), // 'dummy';
  101. node => Assert.IsType<VariableDeclaration>(node), // item
  102. node => Assert.IsType<ExpressionStatement>(node) // 'dummy';
  103. );
  104. }
  105. [Fact]
  106. public void StepsThroughForInLoop()
  107. {
  108. string 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 SkipsFunctionBody()
  127. {
  128. string script = @"
  129. function test()
  130. {
  131. 'dummy';
  132. }
  133. test();
  134. ";
  135. var nodes = CollectStepNodes(script);
  136. Assert.Collection(nodes,
  137. node => Assert.IsType<FunctionDeclaration>(node), // function(test) ...;
  138. node => Assert.IsType<ExpressionStatement>(node), // test();
  139. node => Assert.IsType<Directive>(node), // 'dummy';
  140. node => Assert.Null(node) // return point
  141. );
  142. }
  143. }
  144. }