Add example i/o test

This commit is contained in:
Dave Burke
2022-02-07 21:23:41 -06:00
parent 0b1f57ae4f
commit 0760f22494
2 changed files with 124 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.EOFException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UncheckedIOException;
public class GameTest {
private StringReader in;
private StringWriter out;
private Game game;
private void givenInput(String input) {
Reader in = new StringReader("\u2404"); // U+2404 is "End of Transmission" sent by CTRL+D (or CTRL+Z on Windows)
StringWriter out = new StringWriter();
UserIo userIo = new UserIo(in, out);
Deck deck = new Deck((cards) -> cards);
game = new Game(deck, userIo);
}
@Test
public void shouldQuitOnCtrlD() {
// Given
givenInput("\u2404"); // U+2404 is "End of Transmission" sent by CTRL+D (or CTRL+Z on Windows)
// When
Exception e = assertThrows(UncheckedIOException.class, game::run);
// Then
assertTrue(e.getCause() instanceof EOFException);
assertEquals("!END OF INPUT", e.getMessage());
}
}

View File

@@ -0,0 +1,84 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
public class UserIoTest {
@ParameterizedTest(name = "''{0}'' is accepted as ''no''")
@ValueSource(strings = {"N", "n", "No", "NO", "no"})
public void testPromptBooleanAcceptsNo(String response) {
// Given
Reader in = new StringReader(response + "\n");
StringWriter out = new StringWriter();
UserIo userIo = new UserIo(in, out);
// When
boolean result = userIo.promptBoolean("TEST");
// Then
assertEquals("TEST? ", out.toString());
assertFalse(result);
}
@ParameterizedTest(name = "''{0}'' is accepted as ''yes''")
@ValueSource(strings = {"Y", "y", "Yes", "YES", "yes", "", "foobar"})
public void testPromptBooleanAcceptsYes(String response) {
// Given
Reader in = new StringReader(response + "\n");
StringWriter out = new StringWriter();
UserIo userIo = new UserIo(in, out);
// When
boolean result = userIo.promptBoolean("TEST");
// Then
assertEquals("TEST? ", out.toString());
assertTrue(result);
}
@ParameterizedTest(name = "''{0}'' is accepted as number")
@CsvSource({
"1,1",
"0,0",
"-1,-1",
})
public void testPromptIntAcceptsNumbers(String response, int expected) {
// Given
Reader in = new StringReader(response + "\n");
StringWriter out = new StringWriter();
UserIo userIo = new UserIo(in, out);
// When
int result = userIo.promptInt("TEST");
// Then
assertEquals("TEST? ", out.toString());
assertEquals(expected, result);
}
@Test
@DisplayName("promptInt should print an error and reprompt if given a non-numeric response")
public void testPromptIntRepromptsOnNonNumeric() {
// Given
Reader in = new StringReader("foo\n1"); // word, then number
StringWriter out = new StringWriter();
UserIo userIo = new UserIo(in, out);
// When
int result = userIo.promptInt("TEST");
// Then
assertEquals("TEST? !NUMBER EXPECTED - RETRY INPUT LINE\n? ", out.toString());
assertEquals(1, result);
}
}