Mon, 27 Jul 2020 11:56:41 +0200
adds SudokuTextFieldTest
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 testTextOverwriteByKeystore() throws InvocationTargetException, InterruptedException {
131 // given
132 final var tf = createTestSubject();
133 tf.setText("6");
134 tf.selectAll();
135 final var event = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),
136 0, KeyEvent.VK_4, '4');
137 SwingUtilities.invokeAndWait(() -> {
138 // when
139 dispatch(tf, event);
140 // then
141 assertEquals("4", tf.getText());
142 });
143 }
145 @Test
146 void testNumbersOnly() throws InvocationTargetException, InterruptedException {
147 // given
148 final var tf = createTestSubject();
149 tf.setText("6");
150 tf.selectAll();
151 final var event = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),
152 0, KeyEvent.VK_A, 'a');
153 SwingUtilities.invokeAndWait(() -> {
154 // when
155 dispatch(tf, event);
156 // then
157 assertEquals("6", tf.getText());
158 });
159 }
161 @Test
162 void testSingleDigit() throws InvocationTargetException, InterruptedException {
163 // given
164 final var tf = createTestSubject();
165 assertEquals("", tf.getText());
166 final var firstEvent = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),
167 0, KeyEvent.VK_A, '4');
168 final var secondEvent = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),
169 0, KeyEvent.VK_A, '6');
170 SwingUtilities.invokeAndWait(() -> {
171 // when
172 dispatch(tf, firstEvent);
173 dispatch(tf, secondEvent);
174 // then
175 assertEquals("4", tf.getText());
176 });
177 }
179 @Test
180 void testBackspace() throws InvocationTargetException, InterruptedException {
181 // given
182 final var tf = createTestSubject();
183 assertEquals("", tf.getText());
184 final var typeFour = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),
185 0, KeyEvent.VK_A, '4');
186 final var typeBackspace = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),
187 0, KeyEvent.VK_BACK_SPACE, KeyEvent.CHAR_UNDEFINED);
188 final var typeSix = new KeyEvent(tf, KeyEvent.KEY_PRESSED, System.currentTimeMillis(),
189 0, KeyEvent.VK_A, '6');
190 SwingUtilities.invokeAndWait(() -> {
191 // when
192 dispatch(tf, typeFour);
193 dispatch(tf, typeBackspace);
194 dispatch(tf, typeSix);
195 // then
196 assertEquals("6", tf.getText());
197 });
198 }
199 }