package util.input; import java.awt.AWTEvent; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.SwingUtilities; import junit.framework.TestCase; /** * A testing class which implments JUnit testing and manufactured * AWTEvent dispatching to make sure that the API is doing what * it is documented to be doing. * @author Gavin Ovsak * */ @InputClassTarget public class InputTest extends TestCase { Input input1; JComponent myCanvas; public static final Dimension SIZE = new Dimension(800, 600); public static final String TITLE = "Race!"; String lastGameBehavior = ""; ArrayList<String> inputBehaviorHistory = new ArrayList<String>(); Map<Integer,String> keyMap = new HashMap<Integer,String>(); KeyEvent testKeyEvent; MouseEvent testMouseEvent; /** * Constructs an input object which is overridden to report back what input events are being activated. */ public void setUp(){ JFrame frame = new JFrame(TITLE); myCanvas = new JComponent(){ private static final long serialVersionUID = 1L; }; frame.getContentPane().add(myCanvas, BorderLayout.CENTER); frame.setVisible(true); input1 = new Input("util/inputExample/Game1MappingsMode1", myCanvas) { @Override protected void execute(String gameBehavior, AlertObject in) { super.execute(gameBehavior, in); lastGameBehavior = gameBehavior; } @Override protected void actionNotification(String inputBehavior, AlertObject object) { super.actionNotification(inputBehavior, object); inputBehaviorHistory.add(inputBehavior); } }; input1.addListenerTo(this); keyMap.put(KeyEvent.VK_0, "0"); keyMap.put(KeyEvent.VK_1, "1"); keyMap.put(KeyEvent.VK_2, "2"); keyMap.put(KeyEvent.VK_3, "3"); keyMap.put(KeyEvent.VK_4, "4"); keyMap.put(KeyEvent.VK_5, "5"); keyMap.put(KeyEvent.VK_6, "6"); keyMap.put(KeyEvent.VK_7, "7"); keyMap.put(KeyEvent.VK_8, "8"); keyMap.put(KeyEvent.VK_9, "9"); keyMap.put(KeyEvent.VK_A, "A"); keyMap.put(KeyEvent.VK_B, "B"); keyMap.put(KeyEvent.VK_C, "C"); keyMap.put(KeyEvent.VK_D, "D"); keyMap.put(KeyEvent.VK_E, "E"); keyMap.put(KeyEvent.VK_F, "F"); keyMap.put(KeyEvent.VK_G, "G"); keyMap.put(KeyEvent.VK_H, "H"); keyMap.put(KeyEvent.VK_I, "I"); keyMap.put(KeyEvent.VK_J, "J"); keyMap.put(KeyEvent.VK_K, "K"); keyMap.put(KeyEvent.VK_L, "L"); keyMap.put(KeyEvent.VK_M, "M"); keyMap.put(KeyEvent.VK_N, "N"); keyMap.put(KeyEvent.VK_O, "O"); keyMap.put(KeyEvent.VK_P, "P"); keyMap.put(KeyEvent.VK_Q, "Q"); keyMap.put(KeyEvent.VK_R, "R"); keyMap.put(KeyEvent.VK_S, "S"); keyMap.put(KeyEvent.VK_T, "T"); keyMap.put(KeyEvent.VK_U, "U"); keyMap.put(KeyEvent.VK_V, "V"); keyMap.put(KeyEvent.VK_W, "W"); keyMap.put(KeyEvent.VK_X, "X"); keyMap.put(KeyEvent.VK_Y, "Y"); keyMap.put(KeyEvent.VK_Z, "Z"); keyMap.put(KeyEvent.VK_LEFT, "Left"); keyMap.put(KeyEvent.VK_RIGHT, "Right"); keyMap.put(KeyEvent.VK_UP, "Up"); keyMap.put(KeyEvent.VK_DOWN, "Down"); keyMap.put(KeyEvent.VK_ENTER, "Enter"); keyMap.put(KeyEvent.VK_DELETE, "Delete"); keyMap.put(KeyEvent.VK_CONTROL, "Control"); keyMap.put(KeyEvent.VK_SHIFT, "Shift"); keyMap.put(KeyEvent.VK_SPACE, "Spacebar"); keyMap.put(KeyEvent.VK_ADD, "Add"); keyMap.put(KeyEvent.VK_MINUS, "Minus"); keyMap.put(KeyEvent.VK_F1, "F1"); keyMap.put(KeyEvent.VK_F2, "F2"); keyMap.put(KeyEvent.VK_F3, "F3"); keyMap.put(KeyEvent.VK_F4, "F4"); keyMap.put(KeyEvent.VK_F5, "F5"); keyMap.put(KeyEvent.VK_F6, "F6"); keyMap.put(KeyEvent.VK_F7, "F7"); keyMap.put(KeyEvent.VK_F8, "F8"); keyMap.put(KeyEvent.VK_F9, "F9"); keyMap.put(KeyEvent.VK_F10, "F10"); keyMap.put(KeyEvent.VK_F11, "F11"); keyMap.put(KeyEvent.VK_F12, "F12"); } /** * A convenience method to dispatch events and catch exceptions. * @param event * @param comp */ private static void dispatchEvent(final AWTEvent event, final Component comp) { if (!SwingUtilities.isEventDispatchThread()) { try { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { comp.dispatchEvent(event); } }); } catch (InterruptedException e) { } catch (InvocationTargetException e) { } } } /** * A test which goes through all Keyboard keys that are supported by the API and verifies their behavior calling. */ public void testIndividualKeys() { for (Integer key : keyMap.keySet()) { char keyChar = (keyMap.get(key).length() == 1)?(char)((int)key):KeyEvent.CHAR_UNDEFINED; testKeyEvent = new KeyEvent(myCanvas, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, key, keyChar); dispatchEvent(testKeyEvent, myCanvas); testKeyEvent = new KeyEvent(myCanvas, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, key, keyChar); dispatchEvent(testKeyEvent, myCanvas); assertTrue(inputBehaviorHistory.contains("Keyboard_Any_Down")); assertTrue(inputBehaviorHistory.contains("Keyboard_Any_Up")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+"_KeyDown")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+"_Down")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+"_KeyUp")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+"_Up")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+"_ShortClick")); inputBehaviorHistory.clear(); } } /** * A test which tries many combinations of keys being held down at the same time over the entire list of possible keys. */ public void testComboKeys() { KeyEvent releaseLast = null; for(Integer key : keyMap.keySet()) { char keyChar = (keyMap.get(key).length() == 1)? (char)((int)key):KeyEvent.CHAR_UNDEFINED; testKeyEvent = new KeyEvent(myCanvas, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, key, keyChar); dispatchEvent(testKeyEvent, myCanvas); assertTrue(inputBehaviorHistory.contains("Keyboard_Any_Down")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+"_Down")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+"_KeyDown")); if(releaseLast != null) { dispatchEvent(releaseLast, myCanvas); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(key)+keyMap.get(releaseLast.getKeyCode())+"_Down")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(releaseLast.getKeyCode())+keyMap.get(key)+"_Down")); assertTrue(inputBehaviorHistory.contains("Keyboard_Any_Up")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(releaseLast.getKeyCode())+"_Up")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(releaseLast.getKeyCode())+"_KeyUp")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(releaseLast.getKeyCode())+"_ShortClick")); } releaseLast = new KeyEvent(myCanvas, KeyEvent.KEY_RELEASED, System.currentTimeMillis(), 0, key, keyChar); inputBehaviorHistory.clear(); } if(releaseLast != null) { dispatchEvent(releaseLast, myCanvas); assertTrue(inputBehaviorHistory.contains("Keyboard_Any_Up")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(releaseLast.getKeyCode())+"_Up")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(releaseLast.getKeyCode())+"_KeyUp")); assertTrue(inputBehaviorHistory.contains("Keyboard_"+keyMap.get(releaseLast.getKeyCode())+"_ShortClick")); inputBehaviorHistory.clear(); } } /** * A test which verifies the correct input behavior when any mouse button is used. */ public void testMouseButtons() { Map<Integer, String> mouseNameMap; mouseNameMap = new HashMap<Integer, String>(); mouseNameMap.put(InputEvent.BUTTON1_MASK, "Left"); mouseNameMap.put(InputEvent.BUTTON2_MASK, "Center"); mouseNameMap.put(InputEvent.BUTTON3_MASK, "Right"); for(Integer key : mouseNameMap.keySet()) { int x = 10; int y = 10; testMouseEvent = new MouseEvent(myCanvas, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), key, x, y, 1, false); dispatchEvent(testMouseEvent, myCanvas); testMouseEvent = new MouseEvent(myCanvas, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), key, x, y, 1, false); dispatchEvent(testMouseEvent, myCanvas); assertTrue(inputBehaviorHistory.contains("Mouse_" + mouseNameMap.get(key)+"_Down")); assertTrue(inputBehaviorHistory.contains("Mouse_" + mouseNameMap.get(key)+"_Up")); assertTrue(inputBehaviorHistory.contains("Mouse_" + mouseNameMap.get(key)+"_Click")); assertTrue(inputBehaviorHistory.contains("Mouse_" + mouseNameMap.get(key)+"_ShortClick")); testMouseEvent = new MouseEvent(myCanvas, MouseEvent.MOUSE_PRESSED, System.currentTimeMillis(), key, x, y, 1, false); dispatchEvent(testMouseEvent, myCanvas); testMouseEvent = new MouseEvent(myCanvas, MouseEvent.MOUSE_RELEASED, System.currentTimeMillis(), key, x, y, 1, false); dispatchEvent(testMouseEvent, myCanvas); assertTrue(inputBehaviorHistory.contains("Mouse_" + mouseNameMap.get(key)+"_DoubleClick")); inputBehaviorHistory.clear(); } } }