blob: 54a2865ad44404ed63ae90209972f0442a12d238 [file] [log] [blame]
/*
* 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.keymap.impl;
import com.intellij.ide.IdeEventQueue;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.KeyboardShortcut;
import com.intellij.openapi.keymap.KeymapManager;
import com.intellij.openapi.util.Clock;
import com.intellij.testFramework.LightPlatformLangTestCase;
import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class ModifierKeyDoubleClickHandlerTest extends LightPlatformLangTestCase {
private static final String MY_SHIFT_SHIFT_ACTION = "ModifierKeyDoubleClickHandlerTest.action1";
private static final String MY_SHIFT_KEY_ACTION = "ModifierKeyDoubleClickHandlerTest.action2";
private static final String MY_SHIFT_SHIFT_KEY_ACTION = "ModifierKeyDoubleClickHandlerTest.action3";
private static final KeyboardShortcut SHIFT_KEY_SHORTCUT =
new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.SHIFT_MASK), null);
private final JComponent myComponent = new JPanel();
private long myCurrentTime;
private int myShiftShiftActionInvocationCount;
private int myShiftKeyActionInvocationCount;
private int myShiftShiftKeyActionInvocationCount;
@Override
public void setUp() throws Exception {
super.setUp();
Clock.setTime(0);
ActionManager.getInstance().registerAction(MY_SHIFT_SHIFT_ACTION, new AnAction() {
@Override
public void actionPerformed(AnActionEvent e) {
myShiftShiftActionInvocationCount++;
}
});
ActionManager.getInstance().registerAction(MY_SHIFT_KEY_ACTION, new AnAction() {
@Override
public void actionPerformed(AnActionEvent e) {
myShiftKeyActionInvocationCount++;
}
});
ActionManager.getInstance().registerAction(MY_SHIFT_SHIFT_KEY_ACTION, new AnAction() {
@Override
public void actionPerformed(AnActionEvent e) {
myShiftShiftKeyActionInvocationCount++;
}
});
KeymapManager.getInstance().getActiveKeymap().addShortcut(MY_SHIFT_KEY_ACTION, SHIFT_KEY_SHORTCUT);
ModifierKeyDoubleClickHandler.getInstance().registerAction(MY_SHIFT_SHIFT_ACTION, KeyEvent.VK_SHIFT, -1);
ModifierKeyDoubleClickHandler.getInstance().registerAction(MY_SHIFT_SHIFT_KEY_ACTION, KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SPACE);
}
@Override
public void tearDown() throws Exception {
ModifierKeyDoubleClickHandler.getInstance().unregisterAction(MY_SHIFT_SHIFT_KEY_ACTION);
ModifierKeyDoubleClickHandler.getInstance().unregisterAction(MY_SHIFT_SHIFT_ACTION);
KeymapManager.getInstance().getActiveKeymap().removeShortcut(MY_SHIFT_KEY_ACTION, SHIFT_KEY_SHORTCUT);
ActionManager.getInstance().unregisterAction(MY_SHIFT_SHIFT_KEY_ACTION);
ActionManager.getInstance().unregisterAction(MY_SHIFT_KEY_ACTION);
ActionManager.getInstance().unregisterAction(MY_SHIFT_SHIFT_ACTION);
Clock.reset();
super.tearDown();
}
public void testShiftShiftSuccessfulCase() {
press();
release();
press();
assertInvocationCounts(0, 0, 0);
release();
assertInvocationCounts(0, 1, 0);
}
public void testLongSecondClick() {
press();
release();
press();
timeStep(400);
release();
assertInvocationCounts(0, 0, 0);
}
public void testShiftShiftKeySuccessfulCase() {
press();
release();
press();
key();
assertInvocationCounts(0, 0, 1);
release();
assertInvocationCounts(0, 0, 1);
}
public void testShiftKey() {
press();
key();
assertInvocationCounts(1, 0, 0);
release();
}
public void testRepeatedInvocationOnKeyHold() {
press();
release();
press();
key(2);
assertInvocationCounts(0, 0, 2);
release();
assertInvocationCounts(0, 0, 2);
}
public void assertInvocationCounts(int shiftKeyCount, int shiftShiftCount, int shiftShiftKeyCount) {
assertEquals(shiftKeyCount, myShiftKeyActionInvocationCount);
assertEquals(shiftShiftCount, myShiftShiftActionInvocationCount);
assertEquals(shiftShiftKeyCount, myShiftShiftKeyActionInvocationCount);
}
private void press() {
IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent,
KeyEvent.KEY_PRESSED,
Clock.getTime(),
InputEvent.SHIFT_MASK,
KeyEvent.VK_SHIFT,
KeyEvent.CHAR_UNDEFINED));
}
private void release() {
IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent,
KeyEvent.KEY_RELEASED,
Clock.getTime(),
0,
KeyEvent.VK_SHIFT,
KeyEvent.CHAR_UNDEFINED));
}
private void key() {
key(1);
}
private void key(int repeat) {
for (int i = 0; i < repeat; i++) {
IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent,
KeyEvent.KEY_PRESSED,
Clock.getTime(),
InputEvent.SHIFT_MASK,
KeyEvent.VK_BACK_SPACE,
'\b'));
IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent,
KeyEvent.KEY_TYPED,
Clock.getTime(),
InputEvent.SHIFT_MASK,
0,
'\b'));
}
IdeEventQueue.getInstance().dispatchEvent(new KeyEvent(myComponent,
KeyEvent.KEY_RELEASED,
Clock.getTime(),
InputEvent.SHIFT_MASK,
KeyEvent.VK_BACK_SPACE,
'\b'));
}
private void timeStep(long step) {
Clock.setTime(myCurrentTime += step);
}
}