/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.intellij.openapi.editor;

import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.impl.AbstractEditorTest;

import java.io.IOException;

public class EditorMultiCaretColumnModeTest extends AbstractEditorTest {
  public void testUpDown() throws Exception {
    init("line1\n" +
         "li<caret>ne2\n" +
         "line3");

    executeAction("EditorDownWithSelection");
    checkResultByText("line1\n" +
                      "li<caret>ne2\n" +
                      "li<caret>ne3");

    executeAction("EditorDownWithSelection"); // hitting document bottom
    checkResultByText("line1\n" +
                      "li<caret>ne2\n" +
                      "li<caret>ne3");

    executeAction("EditorUpWithSelection");
    checkResultByText("line1\n" +
                      "li<caret>ne2\n" +
                      "line3");

    executeAction("EditorUpWithSelection"); // hitting document top
    checkResultByText("li<caret>ne1\n" +
                      "li<caret>ne2\n" +
                      "line3");

    executeAction("EditorUpWithSelection");
    checkResultByText("li<caret>ne1\n" +
                      "li<caret>ne2\n" +
                      "line3");

    executeAction("EditorDownWithSelection");
    checkResultByText("line1\n" +
                      "li<caret>ne2\n" +
                      "line3");
  }

  public void testPageUpDown() throws Exception {
    init("line1\n" +
         "line2\n" +
         "line3\n" +
         "line4\n" +
         "line<caret>5\n" +
         "line6\n" +
         "line7");
    setEditorVisibleSize(1000, 3);

    executeAction("EditorPageUpWithSelection");
    checkResultByText("line1\n" +
                      "line<caret>2\n" +
                      "line<caret>3\n" +
                      "line<caret>4\n" +
                      "line<caret>5\n" +
                      "line6\n" +
                      "line7");

    executeAction("EditorUpWithSelection");
    checkResultByText("line<caret>1\n" +
                      "line<caret>2\n" +
                      "line<caret>3\n" +
                      "line<caret>4\n" +
                      "line<caret>5\n" +
                      "line6\n" +
                      "line7");

    executeAction("EditorPageDownWithSelection");
    checkResultByText("line1\n" +
                      "line2\n" +
                      "line3\n" +
                      "line<caret>4\n" +
                      "line<caret>5\n" +
                      "line6\n" +
                      "line7");

    executeAction("EditorPageDownWithSelection");
    checkResultByText("line1\n" +
                      "line2\n" +
                      "line3\n" +
                      "line4\n" +
                      "line<caret>5\n" +
                      "line<caret>6\n" +
                      "line<caret>7");

    executeAction("EditorPageUpWithSelection");
    checkResultByText("line1\n" +
                      "line2\n" +
                      "line3\n" +
                      "line<caret>4\n" +
                      "line<caret>5\n" +
                      "line6\n" +
                      "line7");
  }

  public void testSelectionWithKeyboard() throws Exception {
    init("line1\n" +
         "li<caret>ne2\n" +
         "line3");

    executeAction("EditorRightWithSelection");
    checkResultByText("line1\n" +
                      "li<selection>n<caret></selection>e2\n" +
                      "line3");

    executeAction("EditorDownWithSelection");
    checkResultByText("line1\n" +
                      "li<selection>n<caret></selection>e2\n" +
                      "li<selection>n<caret></selection>e3");

    executeAction("EditorLeftWithSelection");
    checkResultByText("line1\n" +
                      "li<caret>ne2\n" +
                      "li<caret>ne3");

    executeAction("EditorLeftWithSelection");
    checkResultByText("line1\n" +
                      "l<selection><caret>i</selection>ne2\n" +
                      "l<selection><caret>i</selection>ne3");

    executeAction("EditorUpWithSelection");
    checkResultByText("line1\n" +
                      "l<selection><caret>i</selection>ne2\n" +
                      "line3");

    executeAction("EditorUpWithSelection");
    checkResultByText("l<selection><caret>i</selection>ne1\n" +
                      "l<selection><caret>i</selection>ne2\n" +
                      "line3");

    executeAction("EditorRightWithSelection");
    checkResultByText("li<caret>ne1\n" +
                      "li<caret>ne2\n" +
                      "line3");

    executeAction("EditorRightWithSelection");
    checkResultByText("li<selection>n<caret></selection>e1\n" +
                      "li<selection>n<caret></selection>e2\n" +
                      "line3");

    executeAction("EditorDownWithSelection");
    checkResultByText("line1\n" +
                      "li<selection>n<caret></selection>e2\n" +
                      "line3");

    executeAction("EditorLeftWithSelection");
    checkResultByText("line1\n" +
                      "li<caret>ne2\n" +
                      "line3");
  }

  public void testSelectNextPrevWord() throws Exception {
    init("aaa aaa<caret>\n" +
         "bbbb bbbb");
    executeAction("EditorDownWithSelection");
    executeAction("EditorPreviousWordWithSelection");
    checkResultByText("aaa <selection><caret>aaa</selection>\n" +
                      "bbbb <selection><caret>bb</selection>bb");
    executeAction("EditorNextWordWithSelection");
    checkResultByText("aaa aaa<caret>\n" +
                      "bbbb bb<selection>bb<caret></selection>");
  }

  public void testMoveToSelectionStart() throws Exception {
    init("a");
    mouse().clickAt(0, 2).dragTo(0, 4).release();
    verifyCaretsAndSelections(0, 4, 2, 4);

    executeAction("EditorLeft");
    verifyCaretsAndSelections(0, 2, 2, 2);
  }

  public void testMoveToSelectionEnd() throws Exception {
    init("a");
    mouse().clickAt(0, 4).dragTo(0, 2).release();
    verifyCaretsAndSelections(0, 2, 2, 4);

    executeAction("EditorRight");
    verifyCaretsAndSelections(0, 4, 4, 4);
  }

  public void testReverseBlockSelection() throws Exception {
    init("a");
    mouse().clickAt(0, 4).dragTo(0, 3).release();
    verifyCaretsAndSelections(0, 3, 3, 4);

    executeAction("EditorRightWithSelection");
    verifyCaretsAndSelections(0, 4, 4, 4);
  }

  public void testSelectionWithKeyboardInEmptySpace() throws Exception {
    init("\n\n");
    mouse().clickAt(1, 1);
    verifyCaretsAndSelections(1, 1, 1, 1);

    executeAction("EditorRightWithSelection");
    verifyCaretsAndSelections(1, 2, 1, 2);

    executeAction("EditorDownWithSelection");
    verifyCaretsAndSelections(1, 2, 1, 2,
                              2, 2, 1, 2);

    executeAction("EditorLeftWithSelection");
    verifyCaretsAndSelections(1, 1, 1, 1,
                              2, 1, 1, 1);

    executeAction("EditorLeftWithSelection");
    verifyCaretsAndSelections(1, 0, 0, 1,
                              2, 0, 0, 1);

    executeAction("EditorUpWithSelection");
    verifyCaretsAndSelections(1, 0, 0, 1);

    executeAction("EditorUpWithSelection");
    verifyCaretsAndSelections(0, 0, 0, 1,
                              1, 0, 0, 1);

    executeAction("EditorRightWithSelection");
    verifyCaretsAndSelections(0, 1, 1, 1,
                              1, 1, 1, 1);

    executeAction("EditorRightWithSelection");
    verifyCaretsAndSelections(0, 2, 1, 2,
                              1, 2, 1, 2);

    executeAction("EditorDownWithSelection");
    verifyCaretsAndSelections(1, 2, 1, 2);

    executeAction("EditorLeftWithSelection");
    verifyCaretsAndSelections(1, 1, 1, 1);
  }

  public void testBlockSelection() throws Exception {
    init("a\n" +
         "bbb\n" +
         "ccccc");
    mouse().clickAt(2, 4).dragTo(0, 1).release();
    verifyCaretsAndSelections(0, 1, 1, 4,
                              1, 1, 1, 4,
                              2, 1, 1, 4);
  }

  public void testTyping() throws Exception {
    init("a\n" +
         "bbb\n" +
         "ccccc");
    mouse().clickAt(0, 2).dragTo(2, 3).release();
    type('S');
    checkResultByText("a S<caret>\n" +
                      "bbS<caret>\n" +
                      "ccS<caret>cc");
  }

  public void testCopyPasteOfShortLines() throws Exception {
    init("a\n" +
         "bbb\n" +
         "ccccc");
    mouse().clickAt(0, 2).dragTo(2, 4).release();
    executeAction("EditorCopy");
    executeAction("EditorLineStart");
    executeAction("EditorPaste");
    checkResultByText("  <caret>a\n" +
                      "b <caret>bbb\n" +
                      "cc<caret>ccccc");
  }

  public void testPasteOfBlockToASingleCaret() throws Exception {
    init("a\n" +
         "bbb\n" +
         "ccccc");
    mouse().clickAt(1, 2).dragTo(2, 4).release();
    executeAction("EditorCopy");
    mouse().clickAt(0, 2);
    executeAction("EditorPaste");
    checkResultByText("a b <caret>\n" +
                      "bbcc<caret>b\n" +
                      "ccccc");
  }

  public void testSelectToDocumentStart() throws Exception {
    init("line1\n" +
         "line2\n" +
         "line3\n" +
         "line4");
    mouse().clickAt(1, 1).dragTo(2, 2).release();
    executeAction("EditorTextStartWithSelection");
    checkResultByText("<selection><caret>l</selection>ine1\n" +
                      "<selection><caret>l</selection>ine2\n" +
                      "line3\n" +
                      "line4");
  }

  public void testSelectToDocumentEnd() throws Exception {
    init("line1\n" +
         "line2\n" +
         "line3\n" +
         "line4");
    mouse().clickAt(1, 1).dragTo(2, 2).release();
    executeAction("EditorTextEndWithSelection");
    checkResultByText("line1\n" +
                      "l<selection>ine2<caret></selection>\n" +
                      "l<selection>ine3<caret></selection>\n" +
                      "l<selection>ine4<caret></selection>");
  }

  public void testToggleCaseToLower() throws Exception {
    init("a\n" +
         "BBB\n" +
         "ccccc");
    mouse().clickAt(1, 2).dragTo(2, 4).release();
    executeAction("EditorToggleCase");
    checkResultByText("a\n" +
                      "BBb\n" +
                      "ccccc");
    verifyCaretsAndSelections(1, 4, 2, 4,
                              2, 4, 2, 4);
  }

  public void testToggleCaseToUpper() throws Exception {
    init("a\n" +
         "BBb\n" +
         "ccccc");
    mouse().clickAt(1, 2).dragTo(2, 4).release();
    executeAction("EditorToggleCase");
    checkResultByText("a\n" +
                      "BBB\n" +
                      "ccCCc");
    verifyCaretsAndSelections(1, 4, 2, 4,
                              2, 4, 2, 4);
  }

  private void init(String text) throws IOException {
    configureFromFileText(getTestName(false) + ".txt", text);
    setEditorVisibleSize(1000, 1000);
    ((EditorEx)myEditor).setColumnMode(true);
  }
}
