// Copyright 2015 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

function BestEditor() {
  return 'Emacs';
}

var exception = null;
var results = [];
var log = []

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    var source_line = event_data.sourceLineText();
    log.push(source_line);
    if (source_line.indexOf("return") >= 0) {
      switch (results.length) {
        case 0:
          break;
        case 1:
          Replace(BestEditor, "Emacs", "Eclipse");
          break;
        case 2:
          Replace(BestEditor, "Eclipse", "Vim");
          break;
        default:
          assertUnreachable();
      }
    }
    exec_state.prepareStep(Debug.StepAction.StepIn);
  } catch (e) {
    exception = e;
  }
};

function Replace(fun, original, patch) {
  var script = Debug.findScript(fun);
  if (fun.toString().indexOf(original) < 0) return;
  var patch_pos = script.source.indexOf(original);
  var change_log = [];
  Debug.LiveEdit.TestApi.ApplySingleChunkPatch(script, patch_pos, original.length, patch, change_log);
}

Debug.setListener(listener);

debugger;
results.push(BestEditor());
results.push(BestEditor());
results.push(BestEditor());
Debug.setListener(null);

assertNull(exception);
assertEquals(["Emacs", "Eclipse", "Vim"], results);
print(JSON.stringify(log, 1));
assertEquals([
  "debugger;",
  "results.push(BestEditor());",
  "  return 'Emacs';",
  "  return 'Emacs';",
  "results.push(BestEditor());",
  "results.push(BestEditor());",
  "  return 'Emacs';",
  "  return 'Eclipse';",
  "  return 'Eclipse';",
  "results.push(BestEditor());",
  "results.push(BestEditor());",
  "  return 'Eclipse';",
  "  return 'Vim';",
  "  return 'Vim';",
  "results.push(BestEditor());",
  "Debug.setListener(null);"
], log);
