Skip to content

Commit 0ace796

Browse files
authored
Merge pull request #966 from Rishab87/unit-tests-key-event
Added unit tests for handling key events in ```processing:core```
2 parents ff78d90 + bafcd54 commit 0ace796

File tree

2 files changed

+146
-2
lines changed

2 files changed

+146
-2
lines changed

core/src/processing/core/PApplet.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -2635,8 +2635,11 @@ protected void handleKeyEvent(KeyEvent event) {
26352635
keyPressed = true;
26362636
keyPressed(keyEvent);
26372637
}
2638-
case KeyEvent.RELEASE -> {
2639-
pressedKeys.remove(((long) keyCode << Character.SIZE) | key);
2638+
case KeyEvent.RELEASE -> {
2639+
pressedKeys.removeIf(hash -> {
2640+
int pressedKeyCode = (int)(hash >> Character.SIZE);
2641+
return pressedKeyCode == keyCode;
2642+
});
26402643
keyPressed = !pressedKeys.isEmpty();
26412644
keyReleased(keyEvent);
26422645
}
@@ -2842,6 +2845,7 @@ public void focusGained() { }
28422845
public void focusLost() {
28432846
// TODO: if user overrides this without calling super it's not gonna work
28442847
pressedKeys.clear();
2848+
keyPressed = false;
28452849
}
28462850

28472851

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package processing.core;
2+
3+
import org.junit.Assert;
4+
import org.junit.Before;
5+
import org.junit.Test;
6+
import processing.event.KeyEvent;
7+
8+
public class PAppletKeyEventTest {
9+
10+
private static final int SHIFT_MASK = 1;
11+
private static final int CTRL_MASK = 2;
12+
private static final int ALT_MASK = 4;
13+
14+
private PApplet applet;
15+
16+
@Before
17+
public void setup() {
18+
applet = new PApplet();
19+
}
20+
21+
@Test
22+
public void testSingleKeyPressAndRelease() {
23+
KeyEvent pressEvent = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 'a', 65, false);
24+
applet.handleKeyEvent(pressEvent);
25+
Assert.assertEquals(1, applet.pressedKeys.size());
26+
27+
KeyEvent releaseEvent = new KeyEvent(null, 0L, KeyEvent.RELEASE, 0, 'a', 65, false);
28+
applet.handleKeyEvent(releaseEvent);
29+
Assert.assertEquals(0, applet.pressedKeys.size());
30+
Assert.assertFalse(applet.keyPressed);
31+
}
32+
33+
@Test
34+
public void testShiftAndLetterSequence() {
35+
KeyEvent pressA = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 'a', 65, false);
36+
applet.handleKeyEvent(pressA);
37+
38+
KeyEvent pressShift = new KeyEvent(null, 0L, KeyEvent.PRESS, SHIFT_MASK, 'A', 16, false);
39+
applet.handleKeyEvent(pressShift);
40+
41+
KeyEvent releaseA = new KeyEvent(null, 0L, KeyEvent.RELEASE, SHIFT_MASK, 'A', 65, false);
42+
applet.handleKeyEvent(releaseA);
43+
44+
KeyEvent releaseShift = new KeyEvent(null, 0L, KeyEvent.RELEASE, 0, 'A', 16, false);
45+
applet.handleKeyEvent(releaseShift);
46+
47+
Assert.assertFalse("keyPressed should be false after all keys released", applet.keyPressed);
48+
Assert.assertTrue("pressedKeys should be empty", applet.pressedKeys.isEmpty());
49+
}
50+
51+
@Test
52+
public void testControlAndLetterSequence() {
53+
KeyEvent pressCtrl = new KeyEvent(null, 0L, KeyEvent.PRESS, CTRL_MASK, '\0', 17, false);
54+
applet.handleKeyEvent(pressCtrl);
55+
56+
KeyEvent pressC = new KeyEvent(null, 0L, KeyEvent.PRESS, CTRL_MASK, (char)3, 67, false);
57+
applet.handleKeyEvent(pressC);
58+
59+
KeyEvent releaseC = new KeyEvent(null, 0L, KeyEvent.RELEASE, CTRL_MASK, 'c', 67, false);
60+
applet.handleKeyEvent(releaseC);
61+
62+
KeyEvent releaseCtrl = new KeyEvent(null, 0L, KeyEvent.RELEASE, 0, '\0', 17, false);
63+
applet.handleKeyEvent(releaseCtrl);
64+
65+
Assert.assertFalse("keyPressed should be false after all keys released", applet.keyPressed);
66+
Assert.assertTrue("pressedKeys should be empty", applet.pressedKeys.isEmpty());
67+
}
68+
69+
@Test
70+
public void testAltAndLetterSequence() {
71+
KeyEvent pressV = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 'v', 86, false);
72+
applet.handleKeyEvent(pressV);
73+
74+
KeyEvent pressAlt = new KeyEvent(null, 0L, KeyEvent.PRESS, ALT_MASK, 'v', 18, false);
75+
applet.handleKeyEvent(pressAlt);
76+
77+
KeyEvent releaseV = new KeyEvent(null, 0L, KeyEvent.RELEASE, ALT_MASK, 'v', 86, false);
78+
applet.handleKeyEvent(releaseV);
79+
80+
KeyEvent releaseAlt = new KeyEvent(null, 0L, KeyEvent.RELEASE, 0, 'v', 18, false);
81+
applet.handleKeyEvent(releaseAlt);
82+
83+
Assert.assertFalse("keyPressed should be false after all keys released", applet.keyPressed);
84+
Assert.assertTrue("pressedKeys should be empty", applet.pressedKeys.isEmpty());
85+
}
86+
87+
@Test
88+
public void testKeyRepeat() {
89+
applet.keyRepeatEnabled = false;
90+
91+
KeyEvent pressR = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 'r', 82, false);
92+
applet.handleKeyEvent(pressR);
93+
94+
KeyEvent repeatR = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 'r', 82, true);
95+
applet.handleKeyEvent(repeatR);
96+
97+
Assert.assertTrue("keyPressed should be true after key press", applet.keyPressed);
98+
Assert.assertEquals("pressedKeys should have 1 entry", 1, applet.pressedKeys.size());
99+
100+
KeyEvent releaseR = new KeyEvent(null, 0L, KeyEvent.RELEASE, 0, 'r', 82, false);
101+
applet.handleKeyEvent(releaseR);
102+
103+
Assert.assertFalse("keyPressed should be false after key release", applet.keyPressed);
104+
Assert.assertEquals("pressedKeys should be empty", true, applet.pressedKeys.isEmpty());
105+
}
106+
107+
@Test
108+
public void testKeyRepeatEnabled() {
109+
applet.keyRepeatEnabled = true;
110+
111+
KeyEvent pressT = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 't', 84, false);
112+
applet.handleKeyEvent(pressT);
113+
114+
KeyEvent repeatT = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 't', 84, true);
115+
applet.handleKeyEvent(repeatT);
116+
117+
Assert.assertTrue("keyPressed should be true with key repeat enabled", applet.keyPressed);
118+
Assert.assertEquals("pressedKeys should have 1 entry", 1, applet.pressedKeys.size());
119+
120+
KeyEvent releaseT = new KeyEvent(null, 0L, KeyEvent.RELEASE, 0, 't', 84, false);
121+
applet.handleKeyEvent(releaseT);
122+
123+
Assert.assertFalse("keyPressed should be false after key release", applet.keyPressed);
124+
Assert.assertEquals("pressedKeys should be empty", true, applet.pressedKeys.isEmpty());
125+
}
126+
127+
@Test
128+
public void testKeyFocusLost() {
129+
KeyEvent pressF = new KeyEvent(null, 0L, KeyEvent.PRESS, 0, 'f', 70, false);
130+
applet.handleKeyEvent(pressF);
131+
132+
Assert.assertTrue("keyPressed should be true after key press", applet.keyPressed);
133+
Assert.assertEquals("pressedKeys should have 1 entry", 1, applet.pressedKeys.size());
134+
135+
applet.focusLost();
136+
137+
Assert.assertFalse("keyPressed should be false after focus lost", applet.keyPressed);
138+
Assert.assertEquals("pressedKeys should be empty after focus lost", true, applet.pressedKeys.isEmpty());
139+
}
140+
}

0 commit comments

Comments
 (0)