Mon, 27 Jul 2020 12:51:20 +0200
adds numpad test
1 package de.uapcore.sudoku;
4 import org.junit.jupiter.api.AfterEach;
5 import org.junit.jupiter.api.BeforeEach;
6 import org.junit.jupiter.api.Test;
8 import javax.swing.*;
9 import java.awt.event.KeyEvent;
10 import java.lang.reflect.InvocationTargetException;
12 import static org.junit.jupiter.api.Assertions.*;
14 class SudokuTextFieldTest {
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 }
34 private JFrame testFrame;
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 }
43 @AfterEach
44 void disposeTestFrame() {
45 testFrame.dispose();
46 }
48 private SudokuTextField createTestSubject() {
49 final var tf = new SudokuTextField();
50 testFrame.add(tf);
51 return tf;
52 }
54 @Test
55 void getValue() {
57 }
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 }
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 }
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 }
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 }
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 }
129 @Test
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 }
144 @Test
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 }
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 }
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 }
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 }