package nl.tudelft.bw4t.environmentstore.editor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.awt.GridLayout;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JTextField;
import nl.tudelft.bw4t.environmentstore.editor.controller.ColorSequenceController;
import nl.tudelft.bw4t.environmentstore.editor.controller.ColorSequenceEditor;
import nl.tudelft.bw4t.map.BlockColor;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ColorSequenceEditorTest {
private static final int DELAY = 500;
private JFrame frame;
private ColorSequenceController csc;
private ColorSequenceEditor cse1;
private ColorSequenceEditor cse2;
private ColorSequenceEditor cse3;
private JTextField jTextField;
private static Robot robot;
@BeforeClass
public static void setupGeneral() throws Exception {
robot = new Robot();
}
@Before
public void setup() throws Exception {
frame = new JFrame("ColorSequenceTest");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new GridLayout(4, 1));
jTextField = new JTextField();
frame.add(jTextField);
csc = new ColorSequenceController();
cse1 = new ColorSequenceEditor();
csc.addColorSequenceEditor(cse1);
frame.add(cse1);
cse2 = new ColorSequenceEditor(4);
csc.addColorSequenceEditor(cse2);
frame.add(cse2);
cse3 = new ColorSequenceEditor();
csc.addColorSequenceEditor(cse3);
frame.add(cse3);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@After
public void reset() {
frame.dispose();
}
@Test
public void testTabOrder() throws Exception {
robot.delay(DELAY);
assertTrue(jTextField.isFocusOwner());
tapKey(KeyEvent.VK_TAB);
assertTrue(cse1.isFocusOwner());
tapKey(KeyEvent.VK_TAB);
assertTrue(cse2.isFocusOwner());
tapKey(KeyEvent.VK_TAB);
assertTrue(cse3.isFocusOwner());
}
@Test
public void testColorNumbers() {
robot.delay(DELAY);
cse1.requestFocus();
robot.delay(DELAY);
assertEquals(0, cse1.getSequenceSize());
for (int i = 0; i < BlockColor.getAvailableColors().size(); i++) {
tapKey(KeyEvent.VK_1 + i);
robot.delay(DELAY);
assertEquals(i + 1, cse1.getSequenceSize());
}
List<BlockColor> expected = BlockColor.getAvailableColors();
List<BlockColor> actual = cse1.getSequence();
for (int i = 0; i < expected.size(); i++) {
assertEquals(expected.get(i), actual.get(i));
}
}
@Test
public void testColorLetters() {
robot.delay(DELAY);
cse1.requestFocus();
robot.delay(DELAY);
assertEquals(0, cse1.getSequenceSize());
List<BlockColor> expected = BlockColor.getAvailableColors();
for (int i = 0; i < expected.size(); i++) {
tapKey(expected.get(i).getLetter());
assertEquals(i + 1, cse1.getSequenceSize());
}
List<BlockColor> actual = cse1.getSequence();
for (int i = 0; i < expected.size(); i++) {
assertEquals(expected.get(i), actual.get(i));
}
cse1.setSequence(null);
assertEquals(0, cse1.getSequenceSize());
}
private void tapKey(int key) {
robot.keyPress(key);
robot.delay(DELAY);
robot.keyRelease(key);
robot.delay(DELAY);
}
public static void main(String[] args) throws Exception {
ColorSequenceEditorTest test = new ColorSequenceEditorTest();
test.setup();
test.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}