/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

function testJumpToLine(ed, inputLine, expectCursor) {
  ed.jumpToLine();
  const editorDoc = ed.container.contentDocument;
  const lineInput = editorDoc.querySelector("input");
  lineInput.value = inputLine;
  EventUtils.synthesizeKey("VK_RETURN", {}, editorDoc.defaultView);
  // CodeMirror lines and columns are 0-based.
  ch(
    ed.getCursor(),
    expectCursor,
    "jumpToLine " + inputLine + " expects cursor " + expectCursor.toSource()
  );
}

async function test() {
  waitForExplicitFinish();
  const { ed, win } = await setup();
  const textLines = [
    "// line 1",
    "//  line 2",
    "//   line 3",
    "//    line 4",
    "//     line 5",
    "",
  ];
  ed.setText(textLines.join("\n"));
  await promiseWaitForFocus();

  const testVectors = [
    // Various useless inputs go to line 0, column 0 or do nothing.
    ["", { line: 0, ch: 0 }],
    [":", { line: 0, ch: 0 }],
    [" ", { line: 0, ch: 0 }],
    [" : ", { line: 0, ch: 0 }],
    ["a:b", { line: 0, ch: 0 }],
    ["LINE: COLUMN ", { line: 0, ch: 0 }],
    ["-1", { line: 0, ch: 0 }],
    [":-1", { line: 0, ch: 0 }],
    ["-1:-1", { line: 0, ch: 0 }],
    ["0", { line: 0, ch: 0 }],
    [":0", { line: 0, ch: 0 }],
    ["0:0", { line: 0, ch: 0 }],
    // Starting here expect data needs to get updated for length changes to
    // "textLines" above.
    // Just jump to line
    ["1", { line: 0, ch: 0 }],
    // Jump to second character in line
    ["1:2", { line: 0, ch: 1 }],
    // Jump to last character on line
    ["1:9", { line: 0, ch: 8 }],
    // Jump just after last character on line (end of line)
    ["1:10", { line: 0, ch: 9 }],
    // Jump one character past end of line (gets clamped to end of line)
    ["1:11", { line: 0, ch: 9 }],
    ["2", { line: 1, ch: 0 }],
    ["2:2", { line: 1, ch: 1 }],
    ["2:10", { line: 1, ch: 9 }],
    ["2:11", { line: 1, ch: 10 }],
    ["2:12", { line: 1, ch: 10 }],
    ["3", { line: 2, ch: 0 }],
    ["3:2", { line: 2, ch: 1 }],
    ["3:11", { line: 2, ch: 10 }],
    ["3:12", { line: 2, ch: 11 }],
    ["3:13", { line: 2, ch: 11 }],
    ["4", { line: 3, ch: 0 }],
    ["4:2", { line: 3, ch: 1 }],
    ["4:12", { line: 3, ch: 11 }],
    ["4:13", { line: 3, ch: 12 }],
    ["4:14", { line: 3, ch: 12 }],
    ["5", { line: 4, ch: 0 }],
    ["5:2", { line: 4, ch: 1 }],
    ["5:13", { line: 4, ch: 12 }],
    ["5:14", { line: 4, ch: 13 }],
    ["5:15", { line: 4, ch: 13 }],
    // One line beyond last newline in editor text:
    ["6", { line: 5, ch: 0 }],
    ["6:2", { line: 5, ch: 0 }],
    // Two line beyond last newline in editor text (gets clamped):
    ["7", { line: 5, ch: 0 }],
    ["7:2", { line: 5, ch: 0 }],
  ];
  testVectors.forEach(vector => {
    testJumpToLine(ed, vector[0], vector[1]);
  });
  teardown(ed, win);
}
