View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   https://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * Test {@link ExtendedBufferedReader}.
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; // easier to read the string below
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       * Test to illustrate https://issues.apache.org/jira/browse/CSV-75
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          // EOL eol EOL EOL eol eol EOL+CR EOL
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                  // consume all
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                  // consume all
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                  // consume all
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()); // Start line 1
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()); // Start line 2
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()); // Start line 3
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 }