import junitparams.JUnitParamsRunner; import junitparams.Parameters; import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import org.junit.runner.RunWith; import java.io.IOException; import java.util.NoSuchElementException; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; @RunWith(JUnitParamsRunner.class) public class ShadReaderTest { private ShadReader reader; @Rule public TextFromStandardInputStream systemIn = TextFromStandardInputStream.emptyStandardInputStream(); @Test @Parameters(method = "notBlankStrings") public void itShouldHasNext(String text) { systemIn.provideText(text); reader = new ShadReader(System.in); assertThat(reader.hasNext(), is(true)); } private Object[][] notBlankStrings() { return new Object[][]{ {"apple"}, {" banana "}, {" \t \r\n pear \n \t"}, {" \r\npeach\t\n "}, {"\t 12345678901234567890 \r\n "} }; } @Test @Parameters(method = "blankStrings") public void itShouldNotHaveNext(String text) { systemIn.provideText(text); reader = new ShadReader(System.in); assertThat(reader.hasNext(), is(false)); } @Test(expected = NoSuchElementException.class) @Parameters(method = "blankStrings") public void itShouldThrowNoSuchElementExceptionOnBlankInput(String text) { systemIn.provideText(text); reader = new ShadReader(System.in); reader.nextToken(); } private Object[][] blankStrings() { return new Object[][]{ {""}, {" \t "}, {" \t \r\n \n \t"}, {" \r\n \t\n "}, {"\t \r\n "} }; } @Test @Parameters(method = "notBlankStrings,blankStrings") public void hasNextShouldBeIdempotent(String text) { systemIn.provideText(text); reader = new ShadReader(System.in); assertThat(reader.hasNext(), is(reader.hasNext())); } @Test @Parameters(method = "tokens") public void itShouldReadNextToken(String text, String token) { systemIn.provideText(text); reader = new ShadReader(System.in); assertThat(reader.nextToken(), is(token)); } private Object[][] tokens() { return new Object[][]{ {"apple", "apple"}, {" banana ", "banana"}, {" \t \r\n pear \n \t", "pear"}, {" \r\npeach\t\n ", "peach"}, {"\t 12345678901234567890 \r\n ", "12345678901234567890"} }; } @Test @Parameters(method = "ints") public void itShouldReadNextInt(String text, int number) { systemIn.provideText(text); reader = new ShadReader(System.in); assertThat(reader.nextInt(), is(number)); } private Object[][] ints() { return new Object[][]{ {"1", 1}, {" 0 ", 0}, {" \t \r\n 12345 \r\n \t", 12345}, {" \r\n-567890 \n ", -567890}, {" \n+5 ", 5} }; } @Test @Parameters(method = "longs") public void itShouldReadNextLong(String text, long number) { systemIn.provideText(text); reader = new ShadReader(System.in); assertThat(reader.nextLong(), is(number)); } private Object[][] longs() { return new Object[][]{ {"1", 1L}, {" 0 ", 0L}, {" \t \r\n 9876543210 \n \t", 9876543210L}, {" \n-1234567890\r\n", -1234567890L}, {" \r\n+5 ", 5L} }; } @Test @Parameters(method = "doubles") public void itShouldReadNextDouble(String text, double number) { systemIn.provideText(text); reader = new ShadReader(System.in); assertThat(reader.nextDouble(), is(number)); } private Object[][] doubles() { return new Object[][]{ {"1", 1D}, {" 0 ", 0D}, {" \t \r\n 9876543210 \n \t", 9876543210D}, {" \n-1234567890\r\n", -1234567890D}, {" \r\n+5 ", 5D}, {" \r\n1.2345678E7 ", 1.2345678E7}, {" \r\n -1.2345678E-7 \t", -1.2345678E-7}, }; } @Test public void itShouldReadDataSequence() { systemIn.provideText(" \t apple \r\n \t123 \n 2.0 \n 567 \t \n "); reader = new ShadReader(System.in); assertThat(reader.nextToken(), is("apple")); assertThat(reader.nextInt(), is(123)); assertThat(reader.nextDouble(), is(2D)); assertThat(reader.nextLong(), is(567L)); } @After public void tearDown() throws IOException { reader.close(); } }