mirror of
https://github.com/chylex/IntelliJ-IdeaVim.git
synced 2025-05-29 01:34:10 +02:00
238 lines
9.2 KiB
Java
238 lines
9.2 KiB
Java
/*
|
|
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
|
|
* Copyright (C) 2003-2019 The IdeaVim authors
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
package org.jetbrains.plugins.ideavim;
|
|
|
|
import com.intellij.ide.highlighter.JavaFileType;
|
|
import com.intellij.ide.highlighter.XmlFileType;
|
|
import com.intellij.openapi.application.PathManager;
|
|
import com.intellij.openapi.editor.Caret;
|
|
import com.intellij.openapi.editor.CaretModel;
|
|
import com.intellij.openapi.editor.Editor;
|
|
import com.intellij.openapi.editor.colors.EditorColors;
|
|
import com.intellij.openapi.fileTypes.PlainTextFileType;
|
|
import com.intellij.openapi.project.Project;
|
|
import com.intellij.testFramework.EditorTestUtil;
|
|
import com.intellij.testFramework.LightProjectDescriptor;
|
|
import com.intellij.testFramework.UsefulTestCase;
|
|
import com.intellij.testFramework.fixtures.CodeInsightTestFixture;
|
|
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
|
|
import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory;
|
|
import com.intellij.testFramework.fixtures.TestFixtureBuilder;
|
|
import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl;
|
|
import com.maddyhome.idea.vim.KeyHandler;
|
|
import com.maddyhome.idea.vim.VimPlugin;
|
|
import com.maddyhome.idea.vim.command.CommandState;
|
|
import com.maddyhome.idea.vim.ex.ExOutputModel;
|
|
import com.maddyhome.idea.vim.ex.vimscript.VimScriptGlobalEnvironment;
|
|
import com.maddyhome.idea.vim.helper.EditorDataContext;
|
|
import com.maddyhome.idea.vim.helper.RunnableHelper;
|
|
import com.maddyhome.idea.vim.helper.StringHelper;
|
|
import com.maddyhome.idea.vim.helper.TestInputModel;
|
|
import com.maddyhome.idea.vim.option.Options;
|
|
import com.maddyhome.idea.vim.option.ToggleOption;
|
|
import com.maddyhome.idea.vim.ui.ExEntryPanel;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* @author vlan
|
|
*/
|
|
public abstract class VimTestCase extends UsefulTestCase {
|
|
protected CodeInsightTestFixture myFixture;
|
|
|
|
protected static final String c = EditorTestUtil.CARET_TAG;
|
|
protected static final String s = EditorTestUtil.SELECTION_START_TAG;
|
|
protected static final String se = EditorTestUtil.SELECTION_END_TAG;
|
|
|
|
@Override
|
|
protected void setUp() throws Exception {
|
|
super.setUp();
|
|
final IdeaTestFixtureFactory factory = IdeaTestFixtureFactory.getFixtureFactory();
|
|
final LightProjectDescriptor projectDescriptor = LightProjectDescriptor.EMPTY_PROJECT_DESCRIPTOR;
|
|
final TestFixtureBuilder<IdeaProjectTestFixture> fixtureBuilder = factory.createLightFixtureBuilder(projectDescriptor);
|
|
final IdeaProjectTestFixture fixture = fixtureBuilder.getFixture();
|
|
myFixture = IdeaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(fixture,
|
|
new LightTempDirTestFixtureImpl(true));
|
|
myFixture.setUp();
|
|
myFixture.setTestDataPath(getTestDataPath());
|
|
KeyHandler.getInstance().fullReset(myFixture.getEditor());
|
|
Options.getInstance().resetAllOptions();
|
|
VimPlugin.getKey().resetKeyMappings();
|
|
|
|
// Make sure the entry text field gets a bounds, or we won't be able to work out caret location
|
|
ExEntryPanel.getInstance().getEntry().setBounds(0,0, 100, 25);
|
|
}
|
|
|
|
protected String getTestDataPath() {
|
|
return PathManager.getHomePath() + "/community/plugins/ideavim/testData";
|
|
}
|
|
|
|
@Override
|
|
protected void tearDown() throws Exception {
|
|
myFixture.tearDown();
|
|
myFixture = null;
|
|
ExEntryPanel.getInstance().deactivate(false);
|
|
VimScriptGlobalEnvironment.getInstance().getVariables().clear();
|
|
VimPlugin.getRegister().resetRegisters();
|
|
super.tearDown();
|
|
}
|
|
|
|
protected void enableExtensions(@NotNull String... extensionNames) {
|
|
for (String name : extensionNames) {
|
|
ToggleOption option = (ToggleOption)Options.getInstance().getOption(name);
|
|
option.set();
|
|
}
|
|
}
|
|
|
|
@NotNull
|
|
protected Editor typeTextInFile(@NotNull final List<KeyStroke> keys, @NotNull String fileContents) {
|
|
configureByText(fileContents);
|
|
return typeText(keys);
|
|
}
|
|
|
|
@NotNull
|
|
protected Editor configureByText(@NotNull String content) {
|
|
myFixture.configureByText(PlainTextFileType.INSTANCE, content);
|
|
return myFixture.getEditor();
|
|
}
|
|
|
|
@NotNull
|
|
protected Editor configureByJavaText(@NotNull String content) {
|
|
myFixture.configureByText(JavaFileType.INSTANCE, content);
|
|
return myFixture.getEditor();
|
|
}
|
|
|
|
@NotNull
|
|
protected Editor configureByXmlText(@NotNull String content) {
|
|
myFixture.configureByText(XmlFileType.INSTANCE, content);
|
|
return myFixture.getEditor();
|
|
}
|
|
|
|
@NotNull
|
|
protected Editor typeText(@NotNull List<KeyStroke> keys) {
|
|
final Editor editor = myFixture.getEditor();
|
|
final KeyHandler keyHandler = KeyHandler.getInstance();
|
|
final EditorDataContext dataContext = new EditorDataContext(editor);
|
|
final Project project = myFixture.getProject();
|
|
TestInputModel.getInstance(editor).setKeyStrokes(keys);
|
|
RunnableHelper.runWriteCommand(project, new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
final TestInputModel inputModel = TestInputModel.getInstance(editor);
|
|
for (KeyStroke key = inputModel.nextKeyStroke(); key != null; key = inputModel.nextKeyStroke()) {
|
|
final ExEntryPanel exEntryPanel = ExEntryPanel.getInstance();
|
|
if (exEntryPanel.isActive()) {
|
|
exEntryPanel.handleKey(key);
|
|
}
|
|
else {
|
|
keyHandler.handleKey(editor, key, dataContext);
|
|
}
|
|
}
|
|
}
|
|
}, null, null);
|
|
return editor;
|
|
}
|
|
|
|
@NotNull
|
|
protected static List<KeyStroke> commandToKeys(@NotNull String command) {
|
|
List<KeyStroke> keys = new ArrayList<KeyStroke>();
|
|
keys.addAll(StringHelper.parseKeys(":"));
|
|
keys.addAll(StringHelper.stringToKeys(command));
|
|
keys.addAll(StringHelper.parseKeys("<Enter>"));
|
|
return keys;
|
|
}
|
|
|
|
public void assertOffset(int... expectedOffsets) {
|
|
final List<Caret> carets = myFixture.getEditor().getCaretModel().getAllCarets();
|
|
assertEquals("Wrong amount of carets", expectedOffsets.length, carets.size());
|
|
for (int i = 0; i < expectedOffsets.length; i++) {
|
|
assertEquals(expectedOffsets[i], carets.get(i).getOffset());
|
|
}
|
|
}
|
|
|
|
public void assertMode(@NotNull CommandState.Mode expectedMode) {
|
|
final CommandState.Mode mode = CommandState.getInstance(myFixture.getEditor()).getMode();
|
|
assertEquals(expectedMode, mode);
|
|
}
|
|
|
|
public void assertSubMode(@NotNull CommandState.SubMode expectedSubMode) {
|
|
CommandState.SubMode subMode = CommandState.getInstance(myFixture.getEditor()).getSubMode();
|
|
assertEquals(expectedSubMode, subMode);
|
|
}
|
|
|
|
public void assertSelection(@Nullable String expected) {
|
|
final String selected = myFixture.getEditor().getSelectionModel().getSelectedText();
|
|
assertEquals(expected, selected);
|
|
}
|
|
|
|
public void assertExOutput(@NotNull String expected) {
|
|
final String actual = ExOutputModel.getInstance(myFixture.getEditor()).getText();
|
|
assertNotNull("No Ex output", actual);
|
|
assertEquals(expected, actual);
|
|
}
|
|
|
|
public void assertPluginError(boolean isError) {
|
|
assertEquals(isError, VimPlugin.isError());
|
|
}
|
|
|
|
protected void assertCaretsColour() {
|
|
Color selectionColour = myFixture.getEditor().getColorsScheme().getColor(EditorColors.SELECTION_BACKGROUND_COLOR);
|
|
Color caretColour = myFixture.getEditor().getColorsScheme().getColor(EditorColors.CARET_COLOR);
|
|
if (CommandState.inVisualBlockMode(myFixture.getEditor())) {
|
|
CaretModel caretModel = myFixture.getEditor().getCaretModel();
|
|
caretModel.getAllCarets().forEach(caret -> {
|
|
if (caret != caretModel.getPrimaryCaret()) {
|
|
assertEquals(selectionColour, caret.getVisualAttributes().getColor());
|
|
}
|
|
else {
|
|
Color color = caret.getVisualAttributes().getColor();
|
|
if (color != null) assertEquals(caretColour, color);
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
myFixture.getEditor().getCaretModel().getAllCarets().forEach(caret -> {
|
|
Color color = caret.getVisualAttributes().getColor();
|
|
if (color != null) assertEquals(caretColour, color);
|
|
});
|
|
}
|
|
}
|
|
|
|
public void doTest(final List<KeyStroke> keys,
|
|
String before,
|
|
String after,
|
|
CommandState.Mode modeAfter, CommandState.SubMode subModeAfter) {
|
|
configureByText(before);
|
|
typeText(keys);
|
|
myFixture.checkResult(after);
|
|
assertState(modeAfter, subModeAfter);
|
|
}
|
|
|
|
protected void assertState(CommandState.Mode modeAfter, CommandState.SubMode subModeAfter) {
|
|
assertCaretsColour();
|
|
assertMode(modeAfter);
|
|
assertSubMode(subModeAfter);
|
|
}
|
|
}
|