10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/*
20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2013 The Guava Authors
30888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License.
60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at
70888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
90888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software
110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and
140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License.
150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.io;
180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffin
210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.io.IOException;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.nio.CharBuffer;
230888a09821a98ac0680fad765217302858e70fa4Paul Duffin
240888a09821a98ac0680fad765217302858e70fa4Paul Duffin/**
250888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Tests for {@link CharSequenceReader}.
260888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Colin Decker
280888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
290888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class CharSequenceReaderTest extends TestCase {
300888a09821a98ac0680fad765217302858e70fa4Paul Duffin
310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testReadEmptyString() throws IOException {
320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertReadsCorrectly("");
330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
340888a09821a98ac0680fad765217302858e70fa4Paul Duffin
350888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testReadsStringsCorrectly() throws IOException {
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertReadsCorrectly("abc");
370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertReadsCorrectly("abcde");
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertReadsCorrectly("abcdefghijkl");
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertReadsCorrectly(""
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin        + "abcdefghijklmnopqrstuvwxyz\n"
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin        + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r"
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin        + "0123456789\r\n"
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin        + "!@#$%^&*()-=_+\t[]{};':\",./<>?\\| ");
440888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMarkAndReset() throws IOException {
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    String string = "abcdefghijklmnopqrstuvwxyz";
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    CharSequenceReader reader = new CharSequenceReader(string);
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(reader.markSupported());
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin
510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(string, readFully(reader));
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // reset and read again
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader.reset();
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(string, readFully(reader));
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // reset, skip, mark, then read the rest
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader.reset();
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(5, reader.skip(5));
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader.mark(Integer.MAX_VALUE);
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(string.substring(5), readFully(reader));
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // reset to the mark and then read the rest
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader.reset();
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(string.substring(5), readFully(reader));
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testIllegalArguments() throws IOException {
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    CharSequenceReader reader = new CharSequenceReader("12345");
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    char[] buf = new char[10];
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(buf, 0, 11);
780888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IndexOutOfBoundsException expected) {
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(buf, 10, 1);
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IndexOutOfBoundsException expected) {
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(buf, 11, 0);
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IndexOutOfBoundsException expected) {
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(buf, -1, 5);
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IndexOutOfBoundsException expected) {
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(buf, 5, -1);
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IndexOutOfBoundsException expected) {
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(buf, 0, 11);
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IndexOutOfBoundsException expected) {
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.skip(-1);
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.mark(-1);
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IllegalArgumentException expected) {
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMethodsThrowWhenClosed() throws IOException {
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    CharSequenceReader reader = new CharSequenceReader("");
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader.close();
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read();
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(new char[10]);
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(new char[10], 0, 10);
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.read(CharBuffer.allocate(10));
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.skip(10);
1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.ready();
1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.mark(10);
1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    try {
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader.reset();
1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin      fail();
1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    } catch (IOException expected) {
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin  /**
1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * Creates a CharSequenceReader wrapping the given CharSequence and tests that the reader produces
1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * the same sequence when read using each type of read method it provides.
1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin   */
1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static void assertReadsCorrectly(CharSequence charSequence) throws IOException {
1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    String expected = charSequence.toString();
1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // read char by char
1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    CharSequenceReader reader = new CharSequenceReader(charSequence);
1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (int i = 0; i < expected.length(); i++) {
1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(expected.charAt(i), reader.read());
1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // read all to one array
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader = new CharSequenceReader(charSequence);
1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    char[] buf = new char[expected.length()];
1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf));
1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, new String(buf));
1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // read in chunks to fixed array
2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader = new CharSequenceReader(charSequence);
2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    buf = new char[5];
2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    StringBuilder builder = new StringBuilder();
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int read;
2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    while ((read = reader.read(buf, 0, buf.length)) != -1) {
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.append(buf, 0, read);
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, builder.toString());
2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // read all to one CharBuffer
2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader = new CharSequenceReader(charSequence);
2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    CharBuffer buf2 = CharBuffer.allocate(expected.length());
2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf2));
2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    buf2.flip();
2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, buf2.toString());
2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // read in chunks to fixed CharBuffer
2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader = new CharSequenceReader(charSequence);
2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    buf2 = CharBuffer.allocate(5);
2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    builder = new StringBuilder();
2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    while (reader.read(buf2) != -1) {
2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin      buf2.flip();
2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.append(buf2);
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin      buf2.clear();
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, builder.toString());
2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // skip fully
2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    reader = new CharSequenceReader(charSequence);
2320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected.length(), reader.skip(Long.MAX_VALUE));
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertFullyRead(reader);
2340888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // skip 5 and read the rest
2360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (expected.length() > 5) {
2370888a09821a98ac0680fad765217302858e70fa4Paul Duffin      reader = new CharSequenceReader(charSequence);
2380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(5, reader.skip(5));
2390888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin      buf = new char[expected.length() - 5];
2410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(buf.length, reader.read(buf, 0, buf.length));
2420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(expected.substring(5), new String(buf));
2430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertFullyRead(reader);
2440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2460888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static void assertFullyRead(CharSequenceReader reader) throws IOException {
2480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-1, reader.read());
2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-1, reader.read(new char[10], 0, 10));
2500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(-1, reader.read(CharBuffer.allocate(10)));
2510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(0, reader.skip(10));
2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2530888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static String readFully(CharSequenceReader reader) throws IOException {
2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    StringBuilder builder = new StringBuilder();
2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int read;
2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    while ((read = reader.read()) != -1) {
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.append((char) read);
2590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return builder.toString();
2610888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2620888a09821a98ac0680fad765217302858e70fa4Paul Duffin}
263