src/test/java/de/uapcore/sudoku/SudokuTextFieldTest.java

Mon, 27 Jul 2020 11:56:41 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 27 Jul 2020 11:56:41 +0200
changeset 13
5e69b1bb707f
child 16
bddb2633c98b
permissions
-rw-r--r--

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 }

mercurial