2
0

StepFlowTests.cs 5.7 KB

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