package com.tulskiy.keymaster.common;
import org.junit.Before;
import org.junit.Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
/**
* Author: Denis Tulskiy
* Date: 7/25/11
*/
public class ProviderTest {
private Robot robot;
private final Object lock = new Object();
@Before
public void setUp() {
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
fail();
}
}
@Test
public void test() throws InterruptedException {
Provider provider = Provider.getCurrentProvider(false);
assertNotNull(provider);
final ArrayList<KeyStroke> strokes = new ArrayList<KeyStroke>();
for (int code = KeyEvent.VK_A; code <= KeyEvent.VK_B; code++) {
strokes.add(KeyStroke.getKeyStroke(code, randomModifiers()));
}
for (final KeyStroke stroke : strokes) {
provider.register(stroke, new HotKeyListener() {
public void onHotKey(HotKey hotKey) {
assertFalse(SwingUtilities.isEventDispatchThread());
assertFalse(hotKey.isMedia());
assertEquals(stroke, hotKey.keyStroke);
synchronized (lock) {
strokes.remove(stroke);
}
}
});
}
robot.delay(20000);
synchronized (lock) {
long start = System.currentTimeMillis();
for (KeyStroke stroke : strokes) {
pressHotKey(stroke);
robot.delay(100);
}
while (!strokes.isEmpty()) {
if (System.currentTimeMillis() - start > 10000) {
provider.reset();
provider.stop();
fail("Timeout. Perhaps some hotkeys failed to be registered");
}
lock.wait(300);
}
}
provider.reset();
provider.stop();
}
private int randomModifiers() {
int modifiers = 0;
if (Math.random() > 0.5) {
modifiers |= InputEvent.SHIFT_DOWN_MASK;
}
if (Math.random() > 0.5) {
modifiers |= InputEvent.ALT_DOWN_MASK;
}
if (Math.random() > 0.5) {
modifiers |= InputEvent.CTRL_DOWN_MASK;
}
return modifiers;
}
private void pressHotKey(KeyStroke key) {
ArrayList<Integer> keys = new ArrayList<Integer>();
int modifiers = key.getModifiers();
if ((modifiers & InputEvent.SHIFT_DOWN_MASK) != 0) {
keys.add(KeyEvent.VK_SHIFT);
}
if ((modifiers & InputEvent.CTRL_DOWN_MASK) != 0) {
keys.add(KeyEvent.VK_CONTROL);
}
if ((modifiers & InputEvent.META_DOWN_MASK) != 0) {
keys.add(KeyEvent.VK_META);
}
if ((modifiers & InputEvent.ALT_DOWN_MASK) != 0) {
keys.add(KeyEvent.VK_ALT);
}
keys.add(key.getKeyCode());
for (int code : keys) {
robot.keyPress(code);
}
robot.delay(100);
for (int code : keys) {
robot.keyRelease(code);
}
}
}