Checking pause locations when stepping in, out, and over if/else control flow.


== Running test suite: Debugger.stepping.control-flow
-- Running test case: Debugger.stepping.IfSingleStatement
EXPRESSION: setTimeout(entryIfSingleStatement)
STEPS: over, over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfSingleStatement:16:5
     12
     13
     14    function entryIfSingleStatement() {
 ->  15        |debugger;
     16        if (truthy)
     17            a();
     18        if (falsey)

ACTION: step-over
PAUSE AT entryIfSingleStatement:17:9
     13
     14    function entryIfSingleStatement() {
     15        debugger;
 ->  16        if (|truthy)
     17            a();
     18        if (falsey)
     19            a();

ACTION: step-over
PAUSE AT entryIfSingleStatement:18:9
     14    function entryIfSingleStatement() {
     15        debugger;
     16        if (truthy)
 ->  17            |a();
     18        if (falsey)
     19            a();
     20    }

ACTION: step-over
PAUSE AT entryIfSingleStatement:19:9
     15        debugger;
     16        if (truthy)
     17            a();
 ->  18        if (|falsey)
     19            a();
     20    }
     21

ACTION: step-over
PAUSE AT entryIfSingleStatement:21:2
     17            a();
     18        if (falsey)
     19            a();
 ->  20    }|
     21
     22    function entryIfMultiStatement() {
     23        debugger;

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

-- Running test case: Debugger.stepping.IfMultiStatement
EXPRESSION: setTimeout(entryIfMultiStatement)
STEPS: over, over, over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfMultiStatement:24:5
     20    }
     21
     22    function entryIfMultiStatement() {
 ->  23        |debugger;
     24        if (truthy) {
     25            a();
     26            a();

ACTION: step-over
PAUSE AT entryIfMultiStatement:25:9
     21
     22    function entryIfMultiStatement() {
     23        debugger;
 ->  24        if (|truthy) {
     25            a();
     26            a();
     27        }

ACTION: step-over
PAUSE AT entryIfMultiStatement:26:9
     22    function entryIfMultiStatement() {
     23        debugger;
     24        if (truthy) {
 ->  25            |a();
     26            a();
     27        }
     28        if (falsey) {

ACTION: step-over
PAUSE AT entryIfMultiStatement:27:9
     23        debugger;
     24        if (truthy) {
     25            a();
 ->  26            |a();
     27        }
     28        if (falsey) {
     29            a();

ACTION: step-over
PAUSE AT entryIfMultiStatement:29:9
     25            a();
     26            a();
     27        }
 ->  28        if (|falsey) {
     29            a();
     30            a();
     31        }

ACTION: step-over
PAUSE AT entryIfMultiStatement:33:2
     29            a();
     30            a();
     31        }
 ->  32    }|
     33
     34    function entryIfElse() {
     35        debugger;

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

-- Running test case: Debugger.stepping.IfElse1
EXPRESSION: setTimeout(entryIfElse)
STEPS: over, over, over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfElse:36:5
     32    }
     33
     34    function entryIfElse() {
 ->  35        |debugger;
     36        if (truthy)
     37            a();
     38        else

ACTION: step-over
PAUSE AT entryIfElse:37:9
     33
     34    function entryIfElse() {
     35        debugger;
 ->  36        if (|truthy)
     37            a();
     38        else
     39            a();

ACTION: step-over
PAUSE AT entryIfElse:38:9
     34    function entryIfElse() {
     35        debugger;
     36        if (truthy)
 ->  37            |a();
     38        else
     39            a();
     40        if (falsey)

ACTION: step-over
PAUSE AT entryIfElse:41:9
     37            a();
     38        else
     39            a();
 ->  40        if (|falsey)
     41            a();
     42        else
     43            a();

ACTION: step-over
PAUSE AT entryIfElse:44:9
     40        if (falsey)
     41            a();
     42        else
 ->  43            |a();
     44    }
     45
     46    function entryIfElseChain() {

ACTION: step-over
PAUSE AT entryIfElse:45:2
     41            a();
     42        else
     43            a();
 ->  44    }|
     45
     46    function entryIfElseChain() {
     47        debugger;

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

-- Running test case: Debugger.stepping.IfElse2
EXPRESSION: setTimeout(entryIfElseChain)
STEPS: over, over, over, over, over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfElseChain:48:5
     44    }
     45
     46    function entryIfElseChain() {
 ->  47        |debugger;
     48        if (falsey)
     49            a();
     50        else if (truthy)

ACTION: step-over
PAUSE AT entryIfElseChain:49:9
     45
     46    function entryIfElseChain() {
     47        debugger;
 ->  48        if (|falsey)
     49            a();
     50        else if (truthy)
     51            a();

ACTION: step-over
PAUSE AT entryIfElseChain:51:14
     47        debugger;
     48        if (falsey)
     49            a();
 ->  50        else if (|truthy)
     51            a();
     52        else
     53            a();

ACTION: step-over
PAUSE AT entryIfElseChain:52:9
     48        if (falsey)
     49            a();
     50        else if (truthy)
 ->  51            |a();
     52        else
     53            a();
     54

ACTION: step-over
PAUSE AT entryIfElseChain:56:9
     52        else
     53            a();
     54
 ->  55        if (|falsey)
     56            a();
     57        else if (falsey)
     58            a();

ACTION: step-over
PAUSE AT entryIfElseChain:58:14
     54
     55        if (falsey)
     56            a();
 ->  57        else if (|falsey)
     58            a();
     59        else
     60            a();

ACTION: step-over
PAUSE AT entryIfElseChain:61:9
     57        else if (falsey)
     58            a();
     59        else
 ->  60            |a();
     61    }
     62
     63    function entryIfWithCall() {

ACTION: step-over
PAUSE AT entryIfElseChain:62:2
     58            a();
     59        else
     60            a();
 ->  61    }|
     62
     63    function entryIfWithCall() {
     64        debugger;

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

-- Running test case: Debugger.stepping.IfWithCall1
EXPRESSION: setTimeout(entryIfWithCall)
STEPS: over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfWithCall:65:5
     61    }
     62
     63    function entryIfWithCall() {
 ->  64        |debugger;
     65        if (a() && a())
     66            a();
     67    }

ACTION: step-over
PAUSE AT entryIfWithCall:66:9
     62
     63    function entryIfWithCall() {
     64        debugger;
 ->  65        if (|a() && a())
     66            a();
     67    }
     68

ACTION: step-over
PAUSE AT entryIfWithCall:67:9
     63    function entryIfWithCall() {
     64        debugger;
     65        if (a() && a())
 ->  66            |a();
     67    }
     68
     69    function entryTernary() {

ACTION: step-over
PAUSE AT entryIfWithCall:68:2
     64        debugger;
     65        if (a() && a())
     66            a();
 ->  67    }|
     68
     69    function entryTernary() {
     70        let t = () => truthy;

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

-- Running test case: Debugger.stepping.IfWithCall2
EXPRESSION: setTimeout(entryIfWithCall)
STEPS: over, in, out, in, out, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfWithCall:65:5
     61    }
     62
     63    function entryIfWithCall() {
 ->  64        |debugger;
     65        if (a() && a())
     66            a();
     67    }

ACTION: step-over
PAUSE AT entryIfWithCall:66:9
     62
     63    function entryIfWithCall() {
     64        debugger;
 ->  65        if (|a() && a())
     66            a();
     67    }
     68

ACTION: step-in
PAUSE AT a:11:16
      7    var value = 1;
      8    var truthy = true;
      9    var falsey = false;
 ->  10    function a() { |return value; }
     11    function b() { return value; }
     12
     13

ACTION: step-out
PAUSE AT entryIfWithCall:66:16
     62
     63    function entryIfWithCall() {
     64        debugger;
 ->  65        if (a() && |a())
     66            a();
     67    }
     68

ACTION: step-in
PAUSE AT a:11:16
      7    var value = 1;
      8    var truthy = true;
      9    var falsey = false;
 ->  10    function a() { |return value; }
     11    function b() { return value; }
     12
     13

ACTION: step-out
PAUSE AT entryIfWithCall:67:9
     63    function entryIfWithCall() {
     64        debugger;
     65        if (a() && a())
 ->  66            |a();
     67    }
     68
     69    function entryTernary() {

ACTION: step-over
PAUSE AT entryIfWithCall:68:2
     64        debugger;
     65        if (a() && a())
     66            a();
 ->  67    }|
     68
     69    function entryTernary() {
     70        let t = () => truthy;

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

-- Running test case: Debugger.stepping.TernaryStepOver
EXPRESSION: setTimeout(entryTernary)
STEPS: over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryTernary:73:5
     69    function entryTernary() {
     70        let t = () => truthy;
     71        let f = () => falsey;
 ->  72        |debugger;
     73        let x = t() ? a() : b();
     74        let y = f() ? a() : b();
     75    }

ACTION: step-over
PAUSE AT entryTernary:74:5
     70        let t = () => truthy;
     71        let f = () => falsey;
     72        debugger;
 ->  73        |let x = t() ? a() : b();
     74        let y = f() ? a() : b();
     75    }
     76

ACTION: step-over
PAUSE AT entryTernary:75:5
     71        let f = () => falsey;
     72        debugger;
     73        let x = t() ? a() : b();
 ->  74        |let y = f() ? a() : b();
     75    }
     76
     77    function entryIfConstantBranch() {

ACTION: step-over
PAUSE AT entryTernary:76:2
     72        debugger;
     73        let x = t() ? a() : b();
     74        let y = f() ? a() : b();
 ->  75    }|
     76
     77    function entryIfConstantBranch() {
     78        debugger;

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

-- Running test case: Debugger.stepping.TernaryStepIn
EXPRESSION: setTimeout(entryTernary)
STEPS: over, in, out, in, out, in, out, in, out, resume
PAUSED (debugger-statement)
PAUSE AT entryTernary:73:5
     69    function entryTernary() {
     70        let t = () => truthy;
     71        let f = () => falsey;
 ->  72        |debugger;
     73        let x = t() ? a() : b();
     74        let y = f() ? a() : b();
     75    }

ACTION: step-over
PAUSE AT entryTernary:74:5
     70        let t = () => truthy;
     71        let f = () => falsey;
     72        debugger;
 ->  73        |let x = t() ? a() : b();
     74        let y = f() ? a() : b();
     75    }
     76

ACTION: step-in
PAUSE AT t:71:19
     67    }
     68
     69    function entryTernary() {
 ->  70        let t = () => |truthy;
     71        let f = () => falsey;
     72        debugger;
     73        let x = t() ? a() : b();

ACTION: step-out
PAUSE AT entryTernary:74:19
     70        let t = () => truthy;
     71        let f = () => falsey;
     72        debugger;
 ->  73        let x = t() ? |a() : b();
     74        let y = f() ? a() : b();
     75    }
     76

ACTION: step-in
PAUSE AT a:11:16
      7    var value = 1;
      8    var truthy = true;
      9    var falsey = false;
 ->  10    function a() { |return value; }
     11    function b() { return value; }
     12
     13

ACTION: step-out
PAUSE AT entryTernary:75:5
     71        let f = () => falsey;
     72        debugger;
     73        let x = t() ? a() : b();
 ->  74        |let y = f() ? a() : b();
     75    }
     76
     77    function entryIfConstantBranch() {

ACTION: step-in
PAUSE AT f:72:19
     68
     69    function entryTernary() {
     70        let t = () => truthy;
 ->  71        let f = () => |falsey;
     72        debugger;
     73        let x = t() ? a() : b();
     74        let y = f() ? a() : b();

ACTION: step-out
PAUSE AT entryTernary:75:25
     71        let f = () => falsey;
     72        debugger;
     73        let x = t() ? a() : b();
 ->  74        let y = f() ? a() : |b();
     75    }
     76
     77    function entryIfConstantBranch() {

ACTION: step-in
PAUSE AT b:12:16
      8    var truthy = true;
      9    var falsey = false;
     10    function a() { return value; }
 ->  11    function b() { |return value; }
     12
     13
     14    function entryIfSingleStatement() {

ACTION: step-out
PAUSE AT entryTernary:76:2
     72        debugger;
     73        let x = t() ? a() : b();
     74        let y = f() ? a() : b();
 ->  75    }|
     76
     77    function entryIfConstantBranch() {
     78        debugger;

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

-- Running test case: Debugger.stepping.ConstantBranch
EXPRESSION: setTimeout(entryIfConstantBranch)
STEPS: over, over, over, over, over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfConstantBranch:79:5
     75    }
     76
     77    function entryIfConstantBranch() {
 ->  78        |debugger;
     79        if (true)
     80            a();
     81        if (false)

ACTION: step-over
PAUSE AT entryIfConstantBranch:80:9
     76
     77    function entryIfConstantBranch() {
     78        debugger;
 ->  79        if (|true)
     80            a();
     81        if (false)
     82            a();

ACTION: step-over
PAUSE AT entryIfConstantBranch:81:9
     77    function entryIfConstantBranch() {
     78        debugger;
     79        if (true)
 ->  80            |a();
     81        if (false)
     82            a();
     83        if (0)

ACTION: step-over
PAUSE AT entryIfConstantBranch:82:9
     78        debugger;
     79        if (true)
     80            a();
 ->  81        if (|false)
     82            a();
     83        if (0)
     84            a();

ACTION: step-over
PAUSE AT entryIfConstantBranch:84:9
     80            a();
     81        if (false)
     82            a();
 ->  83        if (|0)
     84            a();
     85        if (null)
     86            a();

ACTION: step-over
PAUSE AT entryIfConstantBranch:86:9
     82            a();
     83        if (0)
     84            a();
 ->  85        if (|null)
     86            a();
     87    }
     88

ACTION: step-over
PAUSE AT entryIfConstantBranch:88:2
     84            a();
     85        if (null)
     86            a();
 ->  87    }|
     88
     89    function entryIfWithLogicalOperation() {
     90        debugger;

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

-- Running test case: Debugger.stepping.IfWithLogicalOperation
EXPRESSION: setTimeout(entryIfWithLogicalOperation)
STEPS: over, in, out, in, out, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfWithLogicalOperation:91:5
     87    }
     88
     89    function entryIfWithLogicalOperation() {
 ->  90        |debugger;
     91        if (true && a() && a())
     92            b();
     93    }

ACTION: step-over
PAUSE AT entryIfWithLogicalOperation:92:9
     88
     89    function entryIfWithLogicalOperation() {
     90        debugger;
 ->  91        if (|true && a() && a())
     92            b();
     93    }
     94

ACTION: step-in
PAUSE AT a:11:16
      7    var value = 1;
      8    var truthy = true;
      9    var falsey = false;
 ->  10    function a() { |return value; }
     11    function b() { return value; }
     12
     13

ACTION: step-out
PAUSE AT entryIfWithLogicalOperation:92:24
     88
     89    function entryIfWithLogicalOperation() {
     90        debugger;
 ->  91        if (true && a() && |a())
     92            b();
     93    }
     94

ACTION: step-in
PAUSE AT a:11:16
      7    var value = 1;
      8    var truthy = true;
      9    var falsey = false;
 ->  10    function a() { |return value; }
     11    function b() { return value; }
     12
     13

ACTION: step-out
PAUSE AT entryIfWithLogicalOperation:93:9
     89    function entryIfWithLogicalOperation() {
     90        debugger;
     91        if (true && a() && a())
 ->  92            |b();
     93    }
     94
     95    function entryIfWithBinaryOperation() {

ACTION: step-over
PAUSE AT entryIfWithLogicalOperation:94:2
     90        debugger;
     91        if (true && a() && a())
     92            b();
 ->  93    }|
     94
     95    function entryIfWithBinaryOperation() {
     96        let i = a();

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

-- Running test case: Debugger.stepping.IfWithBinaryOperation
EXPRESSION: setTimeout(entryIfWithBinaryOperation)
STEPS: over, in, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfWithBinaryOperation:98:5
     94
     95    function entryIfWithBinaryOperation() {
     96        let i = a();
 ->  97        |debugger;
     98        if (i < 2)
     99            b();
    100    }

ACTION: step-over
PAUSE AT entryIfWithBinaryOperation:99:9
     95    function entryIfWithBinaryOperation() {
     96        let i = a();
     97        debugger;
 ->  98        if (|i < 2)
     99            b();
    100    }
    101

ACTION: step-in
PAUSE AT entryIfWithBinaryOperation:100:9
     96        let i = a();
     97        debugger;
     98        if (i < 2)
 ->  99            |b();
    100    }
    101
    102    function entryIfWithNotOperation() {

ACTION: step-over
PAUSE AT entryIfWithBinaryOperation:101:2
     97        debugger;
     98        if (i < 2)
     99            b();
 -> 100    }|
    101
    102    function entryIfWithNotOperation() {
    103        debugger;

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

-- Running test case: Debugger.stepping.IfWithNotOperation
EXPRESSION: setTimeout(entryIfWithNotOperation)
STEPS: over, in, over, in, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfWithNotOperation:104:5
    100    }
    101
    102    function entryIfWithNotOperation() {
 -> 103        |debugger;
    104        if (!false)
    105            a();
    106        if (!!true)

ACTION: step-over
PAUSE AT entryIfWithNotOperation:105:9
    101
    102    function entryIfWithNotOperation() {
    103        debugger;
 -> 104        if (|!false)
    105            a();
    106        if (!!true)
    107            a();

ACTION: step-in
PAUSE AT entryIfWithNotOperation:106:9
    102    function entryIfWithNotOperation() {
    103        debugger;
    104        if (!false)
 -> 105            |a();
    106        if (!!true)
    107            a();
    108    }

ACTION: step-over
PAUSE AT entryIfWithNotOperation:107:9
    103        debugger;
    104        if (!false)
    105            a();
 -> 106        if (|!!true)
    107            a();
    108    }
    109

ACTION: step-in
PAUSE AT entryIfWithNotOperation:108:9
    104        if (!false)
    105            a();
    106        if (!!true)
 -> 107            |a();
    108    }
    109
    110    function entryIfWithCommas() {

ACTION: step-over
PAUSE AT entryIfWithNotOperation:109:2
    105            a();
    106        if (!!true)
    107            a();
 -> 108    }|
    109
    110    function entryIfWithCommas() {
    111        debugger;

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

-- Running test case: Debugger.stepping.IfWithCommas
EXPRESSION: setTimeout(entryIfWithCommas)
STEPS: over, next, next, next, over, resume
PAUSED (debugger-statement)
PAUSE AT entryIfWithCommas:112:5
    108    }
    109
    110    function entryIfWithCommas() {
 -> 111        |debugger;
    112        if (a(), b(), a())
    113            b();
    114    }

ACTION: step-over
PAUSE AT entryIfWithCommas:113:9
    109
    110    function entryIfWithCommas() {
    111        debugger;
 -> 112        if (|a(), b(), a())
    113            b();
    114    }
    115

ACTION: step-next
PAUSE AT entryIfWithCommas:113:14
    109
    110    function entryIfWithCommas() {
    111        debugger;
 -> 112        if (a(), |b(), a())
    113            b();
    114    }
    115

ACTION: step-next
PAUSE AT entryIfWithCommas:113:19
    109
    110    function entryIfWithCommas() {
    111        debugger;
 -> 112        if (a(), b(), |a())
    113            b();
    114    }
    115

ACTION: step-next
PAUSE AT entryIfWithCommas:114:9
    110    function entryIfWithCommas() {
    111        debugger;
    112        if (a(), b(), a())
 -> 113            |b();
    114    }
    115
    116    function entryReturnWithCommas() {

ACTION: step-over
PAUSE AT entryIfWithCommas:115:2
    111        debugger;
    112        if (a(), b(), a())
    113            b();
 -> 114    }|
    115
    116    function entryReturnWithCommas() {
    117        debugger;

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

-- Running test case: Debugger.stepping.ReturnWithCommas
EXPRESSION: setTimeout(entryReturnWithCommas)
STEPS: over, next, next, next, over, resume
PAUSED (debugger-statement)
PAUSE AT entryReturnWithCommas:118:5
    114    }
    115
    116    function entryReturnWithCommas() {
 -> 117        |debugger;
    118        return a(), b(), a();
    119    }
    120

ACTION: step-over
PAUSE AT entryReturnWithCommas:119:5
    115
    116    function entryReturnWithCommas() {
    117        debugger;
 -> 118        |return a(), b(), a();
    119    }
    120
    121    function entryThrowWithCommas() {

ACTION: step-next
PAUSE AT entryReturnWithCommas:119:12
    115
    116    function entryReturnWithCommas() {
    117        debugger;
 -> 118        return |a(), b(), a();
    119    }
    120
    121    function entryThrowWithCommas() {

ACTION: step-next
PAUSE AT entryReturnWithCommas:119:17
    115
    116    function entryReturnWithCommas() {
    117        debugger;
 -> 118        return a(), |b(), a();
    119    }
    120
    121    function entryThrowWithCommas() {

ACTION: step-next
PAUSE AT entryReturnWithCommas:119:22
    115
    116    function entryReturnWithCommas() {
    117        debugger;
 -> 118        return a(), b(), |a();
    119    }
    120
    121    function entryThrowWithCommas() {

ACTION: step-over
PAUSE AT entryReturnWithCommas:120:2
    116    function entryReturnWithCommas() {
    117        debugger;
    118        return a(), b(), a();
 -> 119    }|
    120
    121    function entryThrowWithCommas() {
    122        debugger;

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

-- Running test case: Debugger.stepping.ThrowWithCommas
EXPRESSION: setTimeout(entryThrowWithCommas)
STEPS: over, next, next, next, over, resume
PAUSED (debugger-statement)
PAUSE AT entryThrowWithCommas:123:5
    119    }
    120
    121    function entryThrowWithCommas() {
 -> 122        |debugger;
    123        try {
    124            throw a(), b(), a();
    125        } catch { }

ACTION: step-over
PAUSE AT entryThrowWithCommas:125:9
    121    function entryThrowWithCommas() {
    122        debugger;
    123        try {
 -> 124            |throw a(), b(), a();
    125        } catch { }
    126    }
    127

ACTION: step-next
PAUSE AT entryThrowWithCommas:125:15
    121    function entryThrowWithCommas() {
    122        debugger;
    123        try {
 -> 124            throw |a(), b(), a();
    125        } catch { }
    126    }
    127

ACTION: step-next
PAUSE AT entryThrowWithCommas:125:20
    121    function entryThrowWithCommas() {
    122        debugger;
    123        try {
 -> 124            throw a(), |b(), a();
    125        } catch { }
    126    }
    127

ACTION: step-next
PAUSE AT entryThrowWithCommas:125:25
    121    function entryThrowWithCommas() {
    122        debugger;
    123        try {
 -> 124            throw a(), b(), |a();
    125        } catch { }
    126    }
    127

ACTION: step-over
PAUSE AT entryThrowWithCommas:127:2
    123        try {
    124            throw a(), b(), a();
    125        } catch { }
 -> 126    }|
    127
    128    // ---------
    129

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

