• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.io;
18 
19 import static org.junit.Assert.assertThrows;
20 
21 import java.io.IOException;
22 import java.nio.CharBuffer;
23 import junit.framework.TestCase;
24 
25 /**
26  * Tests for {@link CharSequenceReader}.
27  *
28  * @author Colin Decker
29  */
30 public class CharSequenceReaderTest extends TestCase {
31 
testReadEmptyString()32   public void testReadEmptyString() throws IOException {
33     assertReadsCorrectly("");
34   }
35 
testReadsStringsCorrectly()36   public void testReadsStringsCorrectly() throws IOException {
37     assertReadsCorrectly("abc");
38     assertReadsCorrectly("abcde");
39     assertReadsCorrectly("abcdefghijkl");
40     assertReadsCorrectly(
41         ""
42             + "abcdefghijklmnopqrstuvwxyz\n"
43             + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r"
44             + "0123456789\r\n"
45             + "!@#$%^&*()-=_+\t[]{};':\",./<>?\\| ");
46   }
47 
testMarkAndReset()48   public void testMarkAndReset() throws IOException {
49     String string = "abcdefghijklmnopqrstuvwxyz";
50     CharSequenceReader reader = new CharSequenceReader(string);
51     assertTrue(reader.markSupported());
52 
53     assertEquals(string, readFully(reader));
54     assertFullyRead(reader);
55 
56     // reset and read again
57     reader.reset();
58     assertEquals(string, readFully(reader));
59     assertFullyRead(reader);
60 
61     // reset, skip, mark, then read the rest
62     reader.reset();
63     assertEquals(5, reader.skip(5));
64     reader.mark(Integer.MAX_VALUE);
65     assertEquals(string.substring(5), readFully(reader));
66     assertFullyRead(reader);
67 
68     // reset to the mark and then read the rest
69     reader.reset();
70     assertEquals(string.substring(5), readFully(reader));
71     assertFullyRead(reader);
72   }
73 
testIllegalArguments()74   public void testIllegalArguments() throws IOException {
75     CharSequenceReader reader = new CharSequenceReader("12345");
76 
77     char[] buf = new char[10];
78     assertThrows(IndexOutOfBoundsException.class, () -> reader.read(buf, 0, 11));
79 
80     assertThrows(IndexOutOfBoundsException.class, () -> reader.read(buf, 10, 1));
81 
82     assertThrows(IndexOutOfBoundsException.class, () -> reader.read(buf, 11, 0));
83 
84     assertThrows(IndexOutOfBoundsException.class, () -> reader.read(buf, -1, 5));
85 
86     assertThrows(IndexOutOfBoundsException.class, () -> reader.read(buf, 5, -1));
87 
88     assertThrows(IndexOutOfBoundsException.class, () -> reader.read(buf, 0, 11));
89 
90     assertThrows(IllegalArgumentException.class, () -> reader.skip(-1));
91 
92     assertThrows(IllegalArgumentException.class, () -> reader.mark(-1));
93   }
94 
testMethodsThrowWhenClosed()95   public void testMethodsThrowWhenClosed() throws IOException {
96     CharSequenceReader reader = new CharSequenceReader("");
97     reader.close();
98 
99     assertThrows(IOException.class, () -> reader.read());
100 
101     assertThrows(IOException.class, () -> reader.read(new char[10]));
102 
103     assertThrows(IOException.class, () -> reader.read(new char[10], 0, 10));
104 
105     assertThrows(IOException.class, () -> reader.read(CharBuffer.allocate(10)));
106 
107     assertThrows(IOException.class, () -> reader.skip(10));
108 
109     assertThrows(IOException.class, () -> reader.ready());
110 
111     assertThrows(IOException.class, () -> reader.mark(10));
112 
113     assertThrows(IOException.class, () -> reader.reset());
114   }
115 
116   /**
117    * Creates a CharSequenceReader wrapping the given CharSequence and tests that the reader produces
118    * the same sequence when read using each type of read method it provides.
119    */
assertReadsCorrectly(CharSequence charSequence)120   private static void assertReadsCorrectly(CharSequence charSequence) throws IOException {
121     String expected = charSequence.toString();
122 
123     // read char by char
124     CharSequenceReader reader = new CharSequenceReader(charSequence);
125     for (int i = 0; i < expected.length(); i++) {
126       assertEquals(expected.charAt(i), reader.read());
127     }
128     assertFullyRead(reader);
129 
130     // read all to one array
131     reader = new CharSequenceReader(charSequence);
132     char[] buf = new char[expected.length()];
133     assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf));
134     assertEquals(expected, new String(buf));
135     assertFullyRead(reader);
136 
137     // read in chunks to fixed array
138     reader = new CharSequenceReader(charSequence);
139     buf = new char[5];
140     StringBuilder builder = new StringBuilder();
141     int read;
142     while ((read = reader.read(buf, 0, buf.length)) != -1) {
143       builder.append(buf, 0, read);
144     }
145     assertEquals(expected, builder.toString());
146     assertFullyRead(reader);
147 
148     // read all to one CharBuffer
149     reader = new CharSequenceReader(charSequence);
150     CharBuffer buf2 = CharBuffer.allocate(expected.length());
151     assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf2));
152     Java8Compatibility.flip(buf2);
153     assertEquals(expected, buf2.toString());
154     assertFullyRead(reader);
155 
156     // read in chunks to fixed CharBuffer
157     reader = new CharSequenceReader(charSequence);
158     buf2 = CharBuffer.allocate(5);
159     builder = new StringBuilder();
160     while (reader.read(buf2) != -1) {
161       Java8Compatibility.flip(buf2);
162       builder.append(buf2);
163       Java8Compatibility.clear(buf2);
164     }
165     assertEquals(expected, builder.toString());
166     assertFullyRead(reader);
167 
168     // skip fully
169     reader = new CharSequenceReader(charSequence);
170     assertEquals(expected.length(), reader.skip(Long.MAX_VALUE));
171     assertFullyRead(reader);
172 
173     // skip 5 and read the rest
174     if (expected.length() > 5) {
175       reader = new CharSequenceReader(charSequence);
176       assertEquals(5, reader.skip(5));
177 
178       buf = new char[expected.length() - 5];
179       assertEquals(buf.length, reader.read(buf, 0, buf.length));
180       assertEquals(expected.substring(5), new String(buf));
181       assertFullyRead(reader);
182     }
183   }
184 
assertFullyRead(CharSequenceReader reader)185   private static void assertFullyRead(CharSequenceReader reader) throws IOException {
186     assertEquals(-1, reader.read());
187     assertEquals(-1, reader.read(new char[10], 0, 10));
188     assertEquals(-1, reader.read(CharBuffer.allocate(10)));
189     assertEquals(0, reader.skip(10));
190   }
191 
readFully(CharSequenceReader reader)192   private static String readFully(CharSequenceReader reader) throws IOException {
193     StringBuilder builder = new StringBuilder();
194     int read;
195     while ((read = reader.read()) != -1) {
196       builder.append((char) read);
197     }
198     return builder.toString();
199   }
200 }
201