1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.commons.csv;
21
22 import static org.apache.commons.csv.Constants.UNDEFINED;
23 import static org.apache.commons.io.IOUtils.EOF;
24 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertNull;
27
28 import java.io.StringReader;
29
30 import org.junit.jupiter.api.Test;
31
32
33
34
35 public class ExtendedBufferedReaderTest {
36
37 static final String LF = "\n";
38 static final String CR = "\r";
39 static final String CRLF = CR + LF;
40 static final String LFCR = LF + CR;
41
42 private ExtendedBufferedReader createBufferedReader(final String s) {
43 return new ExtendedBufferedReader(new StringReader(s));
44 }
45
46 @Test
47 public void testEmptyInput() throws Exception {
48 try (ExtendedBufferedReader br = createBufferedReader("")) {
49 assertEquals(EOF, br.read());
50 assertEquals(EOF, br.peek());
51 assertEquals(EOF, br.getLastChar());
52 assertNull(br.readLine());
53 assertEquals(0, br.read(new char[10], 0, 0));
54 }
55 }
56
57
58
59
60 @Test
61 public void testReadChar() throws Exception {
62 final String test = "a" + LF + "b" + CR + "c" + LF + LF + "d" + CR + CR + "e" + LFCR + "f " + CRLF;
63
64 final int eolCount = 9;
65
66 try (ExtendedBufferedReader br = createBufferedReader(test)) {
67 assertEquals(0, br.getLineNumber());
68 int lineCount = 0;
69 while (br.readLine() != null) {
70
71 lineCount++;
72 }
73 assertEquals(eolCount, br.getLineNumber());
74 assertEquals(lineCount, br.getLineNumber());
75 }
76 try (ExtendedBufferedReader br = createBufferedReader(test)) {
77 assertEquals(0, br.getLineNumber());
78 int readCount = 0;
79 while (br.read() != EOF) {
80
81 readCount++;
82 }
83 assertEquals(eolCount, br.getLineNumber());
84 assertEquals(readCount, test.length());
85 }
86 try (ExtendedBufferedReader br = createBufferedReader(test)) {
87 assertEquals(0, br.getLineNumber());
88 final char[] buff = new char[10];
89 while (br.read(buff, 0, 3) != EOF) {
90
91 }
92 assertEquals(eolCount, br.getLineNumber());
93 }
94 }
95
96 @Test
97 public void testReadingInDifferentBuffer() throws Exception {
98 final char[] tmp1 = new char[2];
99 final char[] tmp2 = new char[4];
100 try (ExtendedBufferedReader reader = createBufferedReader("1\r\n2\r\n")) {
101 reader.read(tmp1, 0, 2);
102 reader.read(tmp2, 2, 2);
103 assertEquals(2, reader.getLineNumber());
104 }
105 }
106
107 @Test
108 public void testReadLine() throws Exception {
109 try (ExtendedBufferedReader br = createBufferedReader("")) {
110 assertNull(br.readLine());
111 }
112 try (ExtendedBufferedReader br = createBufferedReader("\n")) {
113 assertEquals("", br.readLine());
114 assertNull(br.readLine());
115 }
116 try (ExtendedBufferedReader br = createBufferedReader("foo\n\nhello")) {
117 assertEquals(0, br.getLineNumber());
118 assertEquals("foo", br.readLine());
119 assertEquals(1, br.getLineNumber());
120 assertEquals("", br.readLine());
121 assertEquals(2, br.getLineNumber());
122 assertEquals("hello", br.readLine());
123 assertEquals(3, br.getLineNumber());
124 assertNull(br.readLine());
125 assertEquals(3, br.getLineNumber());
126 }
127 try (ExtendedBufferedReader br = createBufferedReader("foo\n\nhello")) {
128 assertEquals('f', br.read());
129 assertEquals('o', br.peek());
130 assertEquals("oo", br.readLine());
131 assertEquals(1, br.getLineNumber());
132 assertEquals('\n', br.peek());
133 assertEquals("", br.readLine());
134 assertEquals(2, br.getLineNumber());
135 assertEquals('h', br.peek());
136 assertEquals("hello", br.readLine());
137 assertNull(br.readLine());
138 assertEquals(3, br.getLineNumber());
139 }
140 try (ExtendedBufferedReader br = createBufferedReader("foo\rbaar\r\nfoo")) {
141 assertEquals("foo", br.readLine());
142 assertEquals('b', br.peek());
143 assertEquals("baar", br.readLine());
144 assertEquals('f', br.peek());
145 assertEquals("foo", br.readLine());
146 assertNull(br.readLine());
147 }
148 }
149
150 @Test
151 public void testReadLookahead1() throws Exception {
152 try (ExtendedBufferedReader br = createBufferedReader("1\n2\r3\n")) {
153 assertEquals(0, br.getLineNumber());
154 assertEquals('1', br.peek());
155 assertEquals(UNDEFINED, br.getLastChar());
156 assertEquals(0, br.getLineNumber());
157 assertEquals('1', br.read());
158 assertEquals('1', br.getLastChar());
159
160 assertEquals(1, br.getLineNumber());
161 assertEquals('\n', br.peek());
162 assertEquals(1, br.getLineNumber());
163 assertEquals('1', br.getLastChar());
164 assertEquals('\n', br.read());
165 assertEquals(1, br.getLineNumber());
166 assertEquals('\n', br.getLastChar());
167 assertEquals(1, br.getLineNumber());
168
169 assertEquals('2', br.peek());
170 assertEquals(1, br.getLineNumber());
171 assertEquals('\n', br.getLastChar());
172 assertEquals(1, br.getLineNumber());
173 assertEquals('2', br.read());
174 assertEquals(2, br.getLineNumber());
175 assertEquals('2', br.getLastChar());
176
177 assertEquals('\r', br.peek());
178 assertEquals(2, br.getLineNumber());
179 assertEquals('2', br.getLastChar());
180 assertEquals('\r', br.read());
181 assertEquals('\r', br.getLastChar());
182 assertEquals(2, br.getLineNumber());
183
184 assertEquals('3', br.peek());
185 assertEquals('\r', br.getLastChar());
186 assertEquals('3', br.read());
187 assertEquals('3', br.getLastChar());
188 assertEquals(3, br.getLineNumber());
189
190 assertEquals('\n', br.peek());
191 assertEquals(3, br.getLineNumber());
192 assertEquals('3', br.getLastChar());
193 assertEquals('\n', br.read());
194 assertEquals(3, br.getLineNumber());
195 assertEquals('\n', br.getLastChar());
196 assertEquals(3, br.getLineNumber());
197
198 assertEquals(EOF, br.peek());
199 assertEquals('\n', br.getLastChar());
200 assertEquals(EOF, br.read());
201 assertEquals(EOF, br.getLastChar());
202 assertEquals(EOF, br.read());
203 assertEquals(EOF, br.peek());
204 assertEquals(3, br.getLineNumber());
205
206 }
207 }
208
209 @Test
210 public void testReadLookahead2() throws Exception {
211 final char[] ref = new char[5];
212 final char[] res = new char[5];
213
214 try (ExtendedBufferedReader br = createBufferedReader("abcdefg")) {
215 ref[0] = 'a';
216 ref[1] = 'b';
217 ref[2] = 'c';
218 assertEquals(3, br.read(res, 0, 3));
219 assertArrayEquals(ref, res);
220 assertEquals('c', br.getLastChar());
221
222 assertEquals('d', br.peek());
223 ref[4] = 'd';
224 assertEquals(1, br.read(res, 4, 1));
225 assertArrayEquals(ref, res);
226 assertEquals('d', br.getLastChar());
227 }
228 }
229 }