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