Add tests for Chars#newReader

This commit is contained in:
Clément Fournier committed 2022-04-30 14:54:22 +02:00
1 parent 1b7560dd7c
commit 94f90ffbbf
1 file changed
+157
@@ -14,6 +14,7 @@ import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.util.List;
import java.util.stream.Collectors;
@@ -323,4 +324,160 @@ public class CharsTest {
assertEquals(Chars.wrap(expected), actual);
}
@Test
public void testReaderSingleChars() throws IOException {
Chars bc = Chars.wrap("a \n \r\nbc db").slice(1, 9);
// ------------
try (Reader reader = bc.newReader()) {
assertEquals(' ', reader.read());
assertEquals('\n', reader.read());
assertEquals(' ', reader.read());
assertEquals(' ', reader.read());
assertEquals('\r', reader.read());
assertEquals('\n', reader.read());
assertEquals('b', reader.read());
assertEquals('c', reader.read());
assertEquals(' ', reader.read());
assertEquals(-1, reader.read());
}
}
@Test
public void testReaderBuffer() throws IOException {
Chars bc = Chars.wrap("a \n \r\nbc db").slice(1, 9);
// ------------
char[] cbuf = new char[4];
try (Reader reader = bc.newReader()) {
assertEquals(4, reader.read(cbuf));
assertCharBufEquals(" \n ", cbuf);
assertEquals(4, reader.read(cbuf));
assertCharBufEquals("\r\nbc", cbuf);
assertEquals(1, reader.read(cbuf));
assertCharBufEquals(" \nbc", cbuf);
assertEquals(-1, reader.read(cbuf));
}
}
@Test
public void testReaderSlicedBuffer() throws IOException {
Chars bc = Chars.wrap("a \n \r\nbc db").slice(1, 9);
// ------------
// use \0 as padding before and after
char[] cbuf = new char[6];
try (Reader reader = bc.newReader()) {
assertEquals(4, reader.read(cbuf, 1, 4));
assertCharBufEquals("\0 \n \0", cbuf);
assertEquals(5, reader.read(cbuf, 1, 5));
assertCharBufEquals("\0\r\nbc ", cbuf);
assertEquals(-1, reader.read(cbuf));
assertEquals(-1, reader.read());
assertEquals(-1, reader.read(cbuf, 1, 4));
}
}
@Test
public void testReadClosed() throws IOException {
Chars bc = Chars.wrap("a \n \r\nbc db").slice(1, 9);
// ------------
Reader reader = bc.newReader();
reader.close();
assertThrows(IOException.class, reader::read);
}
@Test
public void testReaderMark() throws IOException {
Chars bc = Chars.wrap("abcdefghijklmnop").slice(1, 9);
// ------------
try (Reader reader = bc.newReader()) {
assertTrue("markSupported", reader.markSupported());
assertEquals('b', reader.read());
assertEquals('c', reader.read());
assertEquals('d', reader.read());
assertEquals('e', reader.read());
reader.mark(10);
assertEquals('f', reader.read());
assertEquals('g', reader.read());
reader.reset();
assertEquals('f', reader.read());
assertEquals('g', reader.read());
reader.reset(); // reset doesn't clear the mark
assertEquals('f', reader.read());
assertEquals('g', reader.read());
}
}
@Test
public void testReaderMissingMark() throws IOException {
Chars bc = Chars.wrap("abcdefghijklmnop").slice(1, 9);
// ------------
try (Reader reader = bc.newReader()) {
assertTrue("markSupported", reader.markSupported());
assertEquals('b', reader.read());
assertThrows(IOException.class, reader::reset);
}
}
@Test
public void testReaderSkip() throws IOException {
Chars bc = Chars.wrap("abcdefghijklmnop").slice(1, 9);
// ------------
try (Reader reader = bc.newReader()) {
assertEquals('b', reader.read());
assertEquals('c', reader.read());
assertEquals('d', reader.read());
assertEquals('e', reader.read());
reader.mark(10);
assertEquals(2, reader.skip(2));
assertEquals('h', reader.read());
assertEquals('i', reader.read());
reader.reset();
assertEquals('f', reader.read());
assertEquals('g', reader.read());
}
}
@Test
public void testReaderInvalidParams() throws IOException {
Chars bc = Chars.wrap("abcdefghijklmnop").slice(1, 9);
// ------------
char[] cbuf = new char[4];
try (Reader reader = bc.newReader()) {
assertTrue("markSupported", reader.markSupported());
assertEquals('b', reader.read());
assertThrows(NullPointerException.class, () -> reader.read(null, 0, 0));
assertThrows(IndexOutOfBoundsException.class, () -> reader.read(cbuf, -1, 0));
assertThrows(IndexOutOfBoundsException.class, () -> reader.read(cbuf, 1, 12));
assertThrows(IndexOutOfBoundsException.class, () -> reader.read(cbuf, 1, -1));
}
}
private static void assertCharBufEquals(String expected, char[] cbuf) {
String actual = new String(cbuf);
assertEquals(expected, actual);
}
}