Checking pause locations when stepping in, out, and over template strings.


== Running test suite: Debugger.stepping.template-string
-- Running test case: Debugger.stepping.TemplateStringStepOver
EXPRESSION: setTimeout(entryTemplateString)
STEPS: over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryTemplateString:17:5
     13    
     14    function entryTemplateString() {
     15        let x;
 ->  16        |debugger;
     17        let str = `literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     18    }
     19    

ACTION: step-over
PAUSE AT entryTemplateString:18:5
     14    function entryTemplateString() {
     15        let x;
     16        debugger;
 ->  17        |let str = `literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     18    }
     19    
     20    function entryTaggedTemplateString() {

ACTION: step-over
PAUSE AT entryTemplateString:19:2
     15        let x;
     16        debugger;
     17        let str = `literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
 ->  18    }|
     19    
     20    function entryTaggedTemplateString() {
     21        let x;

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

-- Running test case: Debugger.stepping.TemplateStringStepIn
EXPRESSION: setTimeout(entryTemplateString)
STEPS: over, in, out, in, out, resume
PAUSED (debugger-statement)
PAUSE AT entryTemplateString:17:5
     13    
     14    function entryTemplateString() {
     15        let x;
 ->  16        |debugger;
     17        let str = `literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     18    }
     19    

ACTION: step-over
PAUSE AT entryTemplateString:18:5
     14    function entryTemplateString() {
     15        let x;
     16        debugger;
 ->  17        |let str = `literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     18    }
     19    
     20    function entryTaggedTemplateString() {

ACTION: step-in
PAUSE AT a:8:5
      4    <script src="../resources/log-pause-location.js"></script>
      5    <script>
      6    function a() {
 ->   7        |return 1;
      8    }
      9    
     10    function tag(strings, ...values) {

ACTION: step-out
PAUSE AT entryTemplateString:18:67
     14    function entryTemplateString() {
     15        let x;
     16        debugger;
 ->  17        let str = `literal ${1} assignment ${x=1} call ${a()} call2 ${|a()}`;
     18    }
     19    
     20    function entryTaggedTemplateString() {

ACTION: step-in
PAUSE AT a:8:5
      4    <script src="../resources/log-pause-location.js"></script>
      5    <script>
      6    function a() {
 ->   7        |return 1;
      8    }
      9    
     10    function tag(strings, ...values) {

ACTION: step-out
PAUSE AT entryTemplateString:19:2
     15        let x;
     16        debugger;
     17        let str = `literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
 ->  18    }|
     19    
     20    function entryTaggedTemplateString() {
     21        let x;

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

-- Running test case: Debugger.stepping.TaggedTemplateStringStepOver
EXPRESSION: setTimeout(entryTaggedTemplateString)
STEPS: over, over, resume
PAUSED (debugger-statement)
PAUSE AT entryTaggedTemplateString:23:5
     19    
     20    function entryTaggedTemplateString() {
     21        let x;
 ->  22        |debugger;
     23        let str = tag`literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     24    }
     25    

ACTION: step-over
PAUSE AT entryTaggedTemplateString:24:5
     20    function entryTaggedTemplateString() {
     21        let x;
     22        debugger;
 ->  23        |let str = tag`literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     24    }
     25    
     26    // ---------

ACTION: step-over
PAUSE AT entryTaggedTemplateString:25:2
     21        let x;
     22        debugger;
     23        let str = tag`literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
 ->  24    }|
     25    
     26    // ---------
     27    

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

-- Running test case: Debugger.stepping.TaggedTemplateStringStepIn
EXPRESSION: setTimeout(entryTaggedTemplateString)
STEPS: over, in, out, in, out, in, out, resume
PAUSED (debugger-statement)
PAUSE AT entryTaggedTemplateString:23:5
     19    
     20    function entryTaggedTemplateString() {
     21        let x;
 ->  22        |debugger;
     23        let str = tag`literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     24    }
     25    

ACTION: step-over
PAUSE AT entryTaggedTemplateString:24:5
     20    function entryTaggedTemplateString() {
     21        let x;
     22        debugger;
 ->  23        |let str = tag`literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     24    }
     25    
     26    // ---------

ACTION: step-in
PAUSE AT a:8:5
      4    <script src="../resources/log-pause-location.js"></script>
      5    <script>
      6    function a() {
 ->   7        |return 1;
      8    }
      9    
     10    function tag(strings, ...values) {

ACTION: step-out
PAUSE AT entryTaggedTemplateString:24:70
     20    function entryTaggedTemplateString() {
     21        let x;
     22        debugger;
 ->  23        let str = tag`literal ${1} assignment ${x=1} call ${a()} call2 ${|a()}`;
     24    }
     25    
     26    // ---------

ACTION: step-in
PAUSE AT a:8:5
      4    <script src="../resources/log-pause-location.js"></script>
      5    <script>
      6    function a() {
 ->   7        |return 1;
      8    }
      9    
     10    function tag(strings, ...values) {

ACTION: step-out
PAUSE AT entryTaggedTemplateString:24:15
     20    function entryTaggedTemplateString() {
     21        let x;
     22        debugger;
 ->  23        let str = |tag`literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
     24    }
     25    
     26    // ---------

ACTION: step-in
PAUSE AT tag:12:5
      8    }
      9    
     10    function tag(strings, ...values) {
 ->  11        |return "ignored";
     12    }
     13    
     14    function entryTemplateString() {

ACTION: step-out
PAUSE AT entryTaggedTemplateString:25:2
     21        let x;
     22        debugger;
     23        let str = tag`literal ${1} assignment ${x=1} call ${a()} call2 ${a()}`;
 ->  24    }|
     25    
     26    // ---------
     27    

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

