BreakPointTests.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using Esprima;
  2. using Jint.Runtime.Debugger;
  3. using Xunit;
  4. namespace Jint.Tests.Runtime.Debugger
  5. {
  6. public class BreakPointTests
  7. {
  8. [Fact]
  9. public void BreakPointBreaksAtPosition()
  10. {
  11. string script = @"let x = 1, y = 2;
  12. if (x === 1)
  13. {
  14. x++; y *= 2;
  15. }";
  16. var engine = new Engine(options => options.DebugMode());
  17. bool didBreak = false;
  18. engine.Break += (sender, info) =>
  19. {
  20. Assert.Equal(4, info.CurrentStatement.Location.Start.Line);
  21. Assert.Equal(5, info.CurrentStatement.Location.Start.Column);
  22. didBreak = true;
  23. return StepMode.None;
  24. };
  25. engine.BreakPoints.Add(new BreakPoint(4, 5));
  26. engine.Execute(script);
  27. Assert.True(didBreak);
  28. }
  29. [Fact]
  30. public void BreakPointBreaksInCorrectSource()
  31. {
  32. string script1 = @"let x = 1, y = 2;
  33. if (x === 1)
  34. {
  35. x++; y *= 2;
  36. }";
  37. string script2 = @"function test(x)
  38. {
  39. return x + 2;
  40. }";
  41. string script3 = @"const z = 3;
  42. test(z);";
  43. var engine = new Engine(options => { options.DebugMode(); });
  44. engine.BreakPoints.Add(new BreakPoint("script2", 3, 0));
  45. bool didBreak = false;
  46. engine.Break += (sender, info) =>
  47. {
  48. Assert.Equal("script2", info.CurrentStatement.Location.Source);
  49. Assert.Equal(3, info.CurrentStatement.Location.Start.Line);
  50. Assert.Equal(0, info.CurrentStatement.Location.Start.Column);
  51. didBreak = true;
  52. return StepMode.None;
  53. };
  54. // We need to specify the source to the parser.
  55. // And we need locations too (Jint specifies that in its default options)
  56. engine.Execute(script1, new ParserOptions("script1") { Loc = true });
  57. Assert.False(didBreak);
  58. engine.Execute(script2, new ParserOptions("script2") { Loc = true });
  59. Assert.False(didBreak);
  60. // Note that it's actually script3 that executes the function in script2
  61. // and triggers the breakpoint
  62. engine.Execute(script3, new ParserOptions("script3") { Loc = true });
  63. Assert.True(didBreak);
  64. }
  65. [Fact]
  66. public void DebuggerStatementTriggersBreak()
  67. {
  68. string script = @"'dummy';
  69. debugger;
  70. 'dummy';";
  71. var engine = new Engine(options => options
  72. .DebugMode()
  73. .DebuggerStatementHandling(DebuggerStatementHandling.Script));
  74. bool didBreak = false;
  75. engine.Break += (sender, info) =>
  76. {
  77. didBreak = true;
  78. return StepMode.None;
  79. };
  80. engine.Execute(script);
  81. Assert.True(didBreak);
  82. }
  83. [Fact(Skip = "Non-source breakpoint is triggered before Statement, while debugger statement is now triggered by ExecuteInternal")]
  84. public void DebuggerStatementAndBreakpointTriggerSingleBreak()
  85. {
  86. string script = @"'dummy';
  87. debugger;
  88. 'dummy';";
  89. var engine = new Engine(options => options
  90. .DebugMode()
  91. .DebuggerStatementHandling(DebuggerStatementHandling.Script));
  92. engine.BreakPoints.Add(new BreakPoint(2, 0));
  93. int breakTriggered = 0;
  94. engine.Break += (sender, info) =>
  95. {
  96. breakTriggered++;
  97. return StepMode.None;
  98. };
  99. engine.Execute(script);
  100. Assert.Equal(1, breakTriggered);
  101. }
  102. [Fact]
  103. public void BreakpointOverridesStepOut()
  104. {
  105. string script = @"function test()
  106. {
  107. 'dummy';
  108. 'source';
  109. 'dummy';
  110. 'target';
  111. }
  112. test();";
  113. var engine = new Engine(options => options.DebugMode());
  114. engine.BreakPoints.Add(new BreakPoint(4, 0));
  115. engine.BreakPoints.Add(new BreakPoint(6, 0));
  116. int step = 0;
  117. engine.Break += (sender, info) =>
  118. {
  119. step++;
  120. switch (step)
  121. {
  122. case 1:
  123. return StepMode.Out;
  124. case 2:
  125. Assert.True(info.ReachedLiteral("target"));
  126. break;
  127. }
  128. return StepMode.None;
  129. };
  130. engine.Execute(script);
  131. Assert.Equal(2, step);
  132. }
  133. }
  134. }