Checking pause locations when stepping in, out, and over class constructors and methods.


== Running test suite: Debugger.stepping.classes
-- Running test case: Debugger.stepping.ClassBasicStepOver
EXPRESSION: setTimeout(entryClassBasic)
STEPS: over, over, over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryClassBasic:58:5
     54    class Child2 extends Base {};
     55    
     56    function entryClassBasic() {
 ->  57        |debugger;
     58        let o = new Child;
     59        o.baseMethod();
     60        o.childMethod();

ACTION: step-over
PAUSE AT entryClassBasic:59:5
     55    
     56    function entryClassBasic() {
     57        debugger;
 ->  58        |let o = new Child;
     59        o.baseMethod();
     60        o.childMethod();
     61        o.method();

ACTION: step-over
PAUSE AT entryClassBasic:60:5
     56    function entryClassBasic() {
     57        debugger;
     58        let o = new Child;
 ->  59        |o.baseMethod();
     60        o.childMethod();
     61        o.method();
     62    }

ACTION: step-over
PAUSE AT entryClassBasic:61:5
     57        debugger;
     58        let o = new Child;
     59        o.baseMethod();
 ->  60        |o.childMethod();
     61        o.method();
     62    }
     63    

ACTION: step-over
PAUSE AT entryClassBasic:62:5
     58        let o = new Child;
     59        o.baseMethod();
     60        o.childMethod();
 ->  61        |o.method();
     62    }
     63    
     64    function entryClassDefaultConstructor() {

ACTION: step-over
PAUSE AT entryClassBasic:63:2
     59        o.baseMethod();
     60        o.childMethod();
     61        o.method();
 ->  62    }|
     63    
     64    function entryClassDefaultConstructor() {
     65        debugger;

ACTION: resume
RESUMED
PASS: Should have used all steps.

-- Running test case: Debugger.stepping.ClassBasicStepIn
EXPRESSION: setTimeout(entryClassBasic)
STEPS: over, in, in, out, over, over, in, out, in, out, in, in, out, out, resume
PAUSED (debugger-statement)
PAUSE AT entryClassBasic:58:5
     54    class Child2 extends Base {};
     55    
     56    function entryClassBasic() {
 ->  57        |debugger;
     58        let o = new Child;
     59        o.baseMethod();
     60        o.childMethod();

ACTION: step-over
PAUSE AT entryClassBasic:59:5
     55    
     56    function entryClassBasic() {
     57        debugger;
 ->  58        |let o = new Child;
     59        o.baseMethod();
     60        o.childMethod();
     61        o.method();

ACTION: step-in
PAUSE AT Child:35:9
     31    class Child extends Base {
     32        constructor()
     33        {
 ->  34            |super();
     35            this._child = true;
     36        }
     37    

ACTION: step-in
PAUSE AT Base:18:9
     14    class Base {
     15        constructor()
     16        {
 ->  17            |this._base = true;
     18        }
     19    
     20        baseMethod()

ACTION: step-out
PAUSE AT Child:36:9
     32        constructor()
     33        {
     34            super();
 ->  35            |this._child = true;
     36        }
     37    
     38        childMethod()

ACTION: step-over
PAUSE AT Child:37:6
     33        {
     34            super();
     35            this._child = true;
 ->  36        }|
     37    
     38        childMethod()
     39        {

ACTION: step-over
PAUSE AT entryClassBasic:60:5
     56    function entryClassBasic() {
     57        debugger;
     58        let o = new Child;
 ->  59        |o.baseMethod();
     60        o.childMethod();
     61        o.method();
     62    }

ACTION: step-in
PAUSE AT baseMethod:23:9
     19    
     20        baseMethod()
     21        {
 ->  22            |a();
     23        }
     24    
     25        method()

ACTION: step-out
PAUSE AT entryClassBasic:61:5
     57        debugger;
     58        let o = new Child;
     59        o.baseMethod();
 ->  60        |o.childMethod();
     61        o.method();
     62    }
     63    

ACTION: step-in
PAUSE AT childMethod:41:9
     37    
     38        childMethod()
     39        {
 ->  40            |b();
     41        }
     42    
     43        method()

ACTION: step-out
PAUSE AT entryClassBasic:62:5
     58        let o = new Child;
     59        o.baseMethod();
     60        o.childMethod();
 ->  61        |o.method();
     62    }
     63    
     64    function entryClassDefaultConstructor() {

ACTION: step-in
PAUSE AT method:46:9
     42    
     43        method()
     44        {
 ->  45            |super.method();
     46            b();
     47        }
     48    

ACTION: step-in
PAUSE AT method:28:9
     24    
     25        method()
     26        {
 ->  27            |a();
     28        }
     29    }
     30    

ACTION: step-out
PAUSE AT method:47:9
     43        method()
     44        {
     45            super.method();
 ->  46            |b();
     47        }
     48    
     49        get name() { return this._name; }

ACTION: step-out
PAUSE AT entryClassBasic:63:2
     59        o.baseMethod();
     60        o.childMethod();
     61        o.method();
 ->  62    }|
     63    
     64    function entryClassDefaultConstructor() {
     65        debugger;

ACTION: resume
RESUMED
PASS: Should have used all steps.

-- Running test case: Debugger.stepping.ClassDefaultConstructor
EXPRESSION: setTimeout(entryClassDefaultConstructor)
STEPS: over, in, in, out, out, resume
PAUSED (debugger-statement)
PAUSE AT entryClassDefaultConstructor:66:5
     62    }
     63    
     64    function entryClassDefaultConstructor() {
 ->  65        |debugger;
     66        let o = new Child2;
     67    }
     68    

ACTION: step-over
PAUSE AT entryClassDefaultConstructor:67:5
     63    
     64    function entryClassDefaultConstructor() {
     65        debugger;
 ->  66        |let o = new Child2;
     67    }
     68    
     69    function entryClassGetterSetter() {

ACTION: step-in
PAUSE AT Child2:1:23
--- Source Unavailable ---

ACTION: step-in
PAUSE AT Base:18:9
     14    class Base {
     15        constructor()
     16        {
 ->  17            |this._base = true;
     18        }
     19    
     20        baseMethod()

ACTION: step-out
PAUSE AT Child2:1:40
--- Source Unavailable ---

ACTION: step-out
PAUSE AT entryClassDefaultConstructor:68:2
     64    function entryClassDefaultConstructor() {
     65        debugger;
     66        let o = new Child2;
 ->  67    }|
     68    
     69    function entryClassGetterSetter() {
     70        let o = new Child;

ACTION: resume
RESUMED
PASS: Should have used all steps.

-- Running test case: Debugger.stepping.ClassGetterSetter
EXPRESSION: setTimeout(entryClassGetterSetter)
STEPS: over, in, out, in, out, resume
PAUSED (debugger-statement)
PAUSE AT entryClassGetterSetter:72:5
     68    
     69    function entryClassGetterSetter() {
     70        let o = new Child;
 ->  71        |debugger;
     72        var name = o.name;
     73        o.name = "Name";
     74    }

ACTION: step-over
PAUSE AT entryClassGetterSetter:73:5
     69    function entryClassGetterSetter() {
     70        let o = new Child;
     71        debugger;
 ->  72        |var name = o.name;
     73        o.name = "Name";
     74    }
     75    

ACTION: step-in
PAUSE AT name:50:18
     46            b();
     47        }
     48    
 ->  49        get name() { |return this._name; }
     50        set name(x) { this._name = x; }
     51        
     52    }

ACTION: step-out
PAUSE AT entryClassGetterSetter:74:5
     70        let o = new Child;
     71        debugger;
     72        var name = o.name;
 ->  73        |o.name = "Name";
     74    }
     75    
     76    // ---------

ACTION: step-in
PAUSE AT name:51:19
     47        }
     48    
     49        get name() { return this._name; }
 ->  50        set name(x) { |this._name = x; }
     51        
     52    }
     53    

ACTION: step-out
PAUSE AT entryClassGetterSetter:75:2
     71        debugger;
     72        var name = o.name;
     73        o.name = "Name";
 ->  74    }|
     75    
     76    // ---------
     77    

ACTION: resume
RESUMED
PASS: Should have used all steps.

