/* * 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); } }