123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- using Jint.Runtime.Debugger;
- using Xunit;
- namespace Jint.Tests.Runtime.Debugger
- {
- public class CallStackTests
- {
- [Fact]
- public void NamesRegularFunction()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("regularFunction", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"function regularFunction() { debugger; }
- regularFunction()");
- Assert.True(didBreak);
- }
- [Fact]
- public void NamesFunctionExpression()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("functionExpression", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"const functionExpression = function() { debugger; }
- functionExpression()");
- Assert.True(didBreak);
- }
- [Fact]
- public void NamesNamedFunctionExpression()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("namedFunction", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"const functionExpression = function namedFunction() { debugger; }
- functionExpression()");
- Assert.True(didBreak);
- }
- [Fact]
- public void NamesArrowFunction()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("arrowFunction", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"const arrowFunction = () => { debugger; }
- arrowFunction()");
- Assert.True(didBreak);
- }
- [Fact]
- public void NamesNewFunction()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- // Ideally, this should be "(anonymous)", but FunctionConstructor sets the "anonymous" name.
- Assert.Equal("anonymous", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"const newFunction = new Function('debugger;');
- newFunction()");
- Assert.True(didBreak);
- }
- [Fact]
- public void NamesMemberFunction()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("memberFunction", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"const obj = { memberFunction() { debugger; } };
- obj.memberFunction()");
- Assert.True(didBreak);
- }
- [Fact]
- public void NamesAnonymousFunction()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("(anonymous)", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"(function()
- {
- debugger;
- }());");
- Assert.True(didBreak);
- }
- [Fact(Skip = "Debugger has no accessor awareness yet")]
- public void NamesGetAccessor()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("get accessor", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"
- const obj = {
- get accessor()
- {
- debugger;
- return 'test';
- }
- };
- const x = obj.accessor;");
- Assert.True(didBreak);
- }
- [Fact(Skip = "Debugger has no accessor awareness yet")]
- public void NamesSetAccessor()
- {
- var engine = new Engine(options => options
- .DebugMode()
- .DebuggerStatementHandling(DebuggerStatementHandling.Script));
- bool didBreak = false;
- engine.Break += (sender, info) =>
- {
- didBreak = true;
- Assert.Equal("set accessor", info.CallStack.Peek());
- return StepMode.None;
- };
- engine.Execute(
- @"
- const obj = {
- set accessor(value)
- {
- debugger;
- this.value = value;
- }
- };
- obj.accessor = 42;");
- Assert.True(didBreak);
- }
- }
- }
|