From 0760f22494089569ea83c661c6f38c20df27930f Mon Sep 17 00:00:00 2001 From: Dave Burke Date: Mon, 7 Feb 2022 21:23:41 -0600 Subject: [PATCH] Add example i/o test --- 10_Blackjack/java/test/GameTest.java | 40 ++++++++++++ 10_Blackjack/java/test/UserIoTest.java | 84 ++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 10_Blackjack/java/test/GameTest.java create mode 100644 10_Blackjack/java/test/UserIoTest.java diff --git a/10_Blackjack/java/test/GameTest.java b/10_Blackjack/java/test/GameTest.java new file mode 100644 index 00000000..c5cf158c --- /dev/null +++ b/10_Blackjack/java/test/GameTest.java @@ -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()); + } +} diff --git a/10_Blackjack/java/test/UserIoTest.java b/10_Blackjack/java/test/UserIoTest.java new file mode 100644 index 00000000..2c27b609 --- /dev/null +++ b/10_Blackjack/java/test/UserIoTest.java @@ -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); + } +}