// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

Debug = debug.Debug

var exception = null;

var o = { p : 1 };

var successes = [
  [45,
   `(function() {
      var sum = 0;
      for (var i = 0; i < 10; i++) sum += i;
      return sum;
    })()`
  ],
  ["0012",
   `(function() {
      var sum = 0;
      for (var i in [1, 2, 3]) sum += i;
      return sum;
    })()`
  ],
  [15,
   `(function() {
      var sum = 1;
      while (sum < 12) sum += sum + 1;
      return sum;
    })()`
  ],
  [15,
   `(function() {
      var sum = 1;
      do { sum += sum + 1; } while (sum < 12);
      return sum;
    })()`
  ],
  ["023",
   `(function() {
      var sum = "";
      for (var i = 0; i < 4; i++) {
        switch (i) {
          case 0:
          case 1:
            if (i == 0) sum += i;
            break;
          default:
          case 3:
            sum += i;
            break;
        }
      }
      return sum;
    })()`
  ],
  ["oups",
   `(function() {
      try {
        if (Math.sin(1) < 1) throw new Error("oups");
      } catch (e) {
        return e.message;
      }
    })()`
  ],
];

var fails = [
  `(function() {  // Iterator.prototype.next performs stores.
     var sum = 0;
     for (let i of [1, 2, 3]) sum += i;
     return sum;
   })()`,
  `(function() {  // Store to scope object.
     with (o) {
       p = 2;
     }
   })()`,
];

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    successes.forEach(function ([expectation, source]) {
      assertEquals(expectation,
                   exec_state.frame(0).evaluate(source, true).value());
    });
    fails.forEach(function (test) {
      assertThrows(() => exec_state.frame(0).evaluate(test, true), EvalError);
    });
  } catch (e) {
    exception = e;
    print(e, e.stack);
  };
};

// Add the debug event listener.
Debug.setListener(listener);

function f() {
  debugger;
};

f();

assertNull(exception);
