Mon, 27 Jul 2020 12:51:20 +0200
adds numpad test
13 | 1 | package de.uapcore.sudoku; |
2 | ||
3 | ||
4 | import org.junit.jupiter.api.AfterEach; | |
5 | import org.junit.jupiter.api.BeforeEach; | |
6 | import org.junit.jupiter.api.Test; | |
7 | ||
8 | import javax.swing.*; | |
9 | import java.awt.event.KeyEvent; | |
10 | import java.lang.reflect.InvocationTargetException; | |
11 | ||
12 | import static org.junit.jupiter.api.Assertions.*; | |
13 | ||
14 | class SudokuTextFieldTest { | |
15 | ||
16 | private void dispatch(SudokuTextField tf, KeyEvent pressed) { | |
17 | final var released = new KeyEvent(tf, KeyEvent.KEY_RELEASED, pressed.getWhen()+1, | |
18 | pressed.getModifiersEx(), pressed.getKeyCode(), pressed.getKeyChar()); | |
19 | final KeyEvent typed; | |
20 | if (pressed.getKeyChar() != KeyEvent.CHAR_UNDEFINED) { | |
21 | typed = new KeyEvent(tf, KeyEvent.KEY_TYPED, pressed.getWhen(), | |
22 | pressed.getModifiersEx(), KeyEvent.VK_UNDEFINED, pressed.getKeyChar()); | |
23 | } else { | |
24 | typed = null; | |
25 | } | |
26 | tf.requestFocusInWindow(); | |
27 | tf.dispatchEvent(pressed); | |
28 | if (typed != null) { | |
29 | tf.dispatchEvent(typed); | |
30 | } | |
31 | tf.dispatchEvent(released); | |
32 | } | |
33 | ||
34 | private JFrame testFrame; | |
35 | ||
36 | @BeforeEach | |
37 | void createTestFrame() { | |
38 | // we have to use a visible frame for the events to be dispatched | |
39 | testFrame = new JFrame(); | |
40 | testFrame.setVisible(true); | |
41 | } | |
42 | ||
43 | @AfterEach | |
44 | void disposeTestFrame() { | |
45 | testFrame.dispose(); | |
46 | } | |
47 | ||
48 | private SudokuTextField createTestSubject() { | |
49 | final var tf = new SudokuTextField(); | |
50 | testFrame.add(tf); | |
51 | return tf; | |
52 | } | |
53 | ||
54 | @Test | |
55 | void getValue() { | |
56 | ||
57 | } | |
58 | ||
59 | @Test | |
60 | void setValue() { | |
61 | // given | |
62 | final var tf = createTestSubject(); | |
63 | for (int i = 0 ; i <= 9 ; i++) { | |
64 | // when | |
65 | tf.setValue(i); | |
66 | // then | |
67 | assertEquals(i, tf.getValue()); | |
68 | assertEquals(i == 0 ? "" : String.valueOf(i), tf.getText()); | |
69 | assertFalse(tf.isModified()); | |
70 | } | |
71 | } | |
72 | ||
73 | @Test | |
74 | void setInvalidValue() { | |
75 | // given | |
76 | final var tf = createTestSubject(); | |
77 | // when / then | |
78 | assertThrows(IllegalArgumentException.class, () -> tf.setValue(10)); | |
79 | assertThrows(IllegalArgumentException.class, () -> tf.setValue(-1)); | |
80 | assertFalse(tf.isModified()); | |
81 | } | |
82 | ||
83 | @Test | |
84 | void testModifiedByCall() { | |
85 | // given | |
86 | final var tf = createTestSubject(); | |
87 | // then initially | |
88 | assertFalse(tf.isModified()); | |
89 | // when | |
90 | tf.setModified(true); | |
91 | // then | |
92 | assertTrue(tf.isModified()); | |
93 | // when | |
94 | tf.setModified(false); | |
95 | // then | |
96 | assertFalse(tf.isModified()); | |
97 | } | |
98 | ||
99 | @Test | |
100 | void testModifiedByKeystroke() throws InvocationTargetException, InterruptedException { | |
101 | // given | |
102 | final var tf = createTestSubject(); | |
103 | assertFalse(tf.isModified()); | |
104 | final var event = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
105 | 0, KeyEvent.VK_4, '4'); | |
106 | SwingUtilities.invokeAndWait(() -> { | |
107 | // when | |
108 | dispatch(tf, event); | |
109 | // then | |
110 | assertTrue(tf.isModified()); | |
111 | }); | |
112 | } | |
113 | ||
114 | @Test | |
115 | void testTextChangeByKeystore() throws InvocationTargetException, InterruptedException { | |
116 | // given | |
117 | final var tf = createTestSubject(); | |
118 | assertEquals("", tf.getText()); | |
119 | final var event = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
120 | 0, KeyEvent.VK_4, '4'); | |
121 | SwingUtilities.invokeAndWait(() -> { | |
122 | // when | |
123 | dispatch(tf, event); | |
124 | // then | |
125 | assertEquals("4", tf.getText()); | |
126 | }); | |
127 | } | |
128 | ||
129 | @Test | |
16 | 130 | void testNumpad() throws InvocationTargetException, InterruptedException { |
131 | // given | |
132 | final var tf = createTestSubject(); | |
133 | assertEquals("", tf.getText()); | |
134 | final var event = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
135 | 0, KeyEvent.VK_NUMPAD4, '4'); | |
136 | SwingUtilities.invokeAndWait(() -> { | |
137 | // when | |
138 | dispatch(tf, event); | |
139 | // then | |
140 | assertEquals("4", tf.getText()); | |
141 | }); | |
142 | } | |
143 | ||
144 | @Test | |
13 | 145 | void testTextOverwriteByKeystore() throws InvocationTargetException, InterruptedException { |
146 | // given | |
147 | final var tf = createTestSubject(); | |
148 | tf.setText("6"); | |
149 | tf.selectAll(); | |
150 | final var event = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
151 | 0, KeyEvent.VK_4, '4'); | |
152 | SwingUtilities.invokeAndWait(() -> { | |
153 | // when | |
154 | dispatch(tf, event); | |
155 | // then | |
156 | assertEquals("4", tf.getText()); | |
157 | }); | |
158 | } | |
159 | ||
160 | @Test | |
161 | void testNumbersOnly() throws InvocationTargetException, InterruptedException { | |
162 | // given | |
163 | final var tf = createTestSubject(); | |
164 | tf.setText("6"); | |
165 | tf.selectAll(); | |
166 | final var event = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
167 | 0, KeyEvent.VK_A, 'a'); | |
168 | SwingUtilities.invokeAndWait(() -> { | |
169 | // when | |
170 | dispatch(tf, event); | |
171 | // then | |
172 | assertEquals("6", tf.getText()); | |
173 | }); | |
174 | } | |
175 | ||
176 | @Test | |
177 | void testSingleDigit() throws InvocationTargetException, InterruptedException { | |
178 | // given | |
179 | final var tf = createTestSubject(); | |
180 | assertEquals("", tf.getText()); | |
181 | final var firstEvent = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
182 | 0, KeyEvent.VK_A, '4'); | |
183 | final var secondEvent = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
184 | 0, KeyEvent.VK_A, '6'); | |
185 | SwingUtilities.invokeAndWait(() -> { | |
186 | // when | |
187 | dispatch(tf, firstEvent); | |
188 | dispatch(tf, secondEvent); | |
189 | // then | |
190 | assertEquals("4", tf.getText()); | |
191 | }); | |
192 | } | |
193 | ||
194 | @Test | |
195 | void testBackspace() throws InvocationTargetException, InterruptedException { | |
196 | // given | |
197 | final var tf = createTestSubject(); | |
198 | assertEquals("", tf.getText()); | |
199 | final var typeFour = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
200 | 0, KeyEvent.VK_A, '4'); | |
201 | final var typeBackspace = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
202 | 0, KeyEvent.VK_BACK_SPACE, KeyEvent.CHAR_UNDEFINED); | |
203 | final var typeSix = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), | |
204 | 0, KeyEvent.VK_A, '6'); | |
205 | SwingUtilities.invokeAndWait(() -> { | |
206 | // when | |
207 | dispatch(tf, typeFour); | |
208 | dispatch(tf, typeBackspace); | |
209 | dispatch(tf, typeSix); | |
210 | // then | |
211 | assertEquals("6", tf.getText()); | |
212 | }); | |
213 | } | |
214 | } |