View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.csv;
19  
20  import static org.apache.commons.csv.Constants.END_OF_STREAM;
21  import static org.apache.commons.csv.Constants.UNDEFINED;
22  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
23  import static org.junit.jupiter.api.Assertions.assertEquals;
24  import static org.junit.jupiter.api.Assertions.assertNull;
25  
26  import java.io.StringReader;
27  
28  import org.junit.jupiter.api.Test;
29  
30  /**
31   * Test {@link ExtendedBufferedReader}.
32   */
33  public class ExtendedBufferedReaderTest {
34  
35      private ExtendedBufferedReader createBufferedReader(final String s) {
36          return new ExtendedBufferedReader(new StringReader(s));
37      }
38  
39      @Test
40      public void testEmptyInput() throws Exception {
41          try (final ExtendedBufferedReader br = createBufferedReader("")) {
42              assertEquals(END_OF_STREAM, br.read());
43              assertEquals(END_OF_STREAM, br.lookAhead());
44              assertEquals(END_OF_STREAM, br.getLastChar());
45              assertNull(br.readLine());
46              assertEquals(0, br.read(new char[10], 0, 0));
47          }
48      }
49  
50      /*
51       * Test to illustrate https://issues.apache.org/jira/browse/CSV-75
52       *
53       */
54      @Test
55      public void testReadChar() throws Exception {
56          final String LF = "\n";
57          final String CR = "\r";
58          final String CRLF = CR + LF;
59          final String LFCR = LF + CR;// easier to read the string below
60          final String test = "a" + LF + "b" + CR + "c" + LF + LF + "d" + CR + CR + "e" + LFCR + "f " + CRLF;
61          // EOL eol EOL EOL eol eol EOL+CR EOL
62          final int EOLeolct = 9;
63  
64          try (final ExtendedBufferedReader br = createBufferedReader(test)) {
65              assertEquals(0, br.getCurrentLineNumber());
66              while (br.readLine() != null) {
67                  // consume all
68              }
69              assertEquals(EOLeolct, br.getCurrentLineNumber());
70          }
71          try (final ExtendedBufferedReader br = createBufferedReader(test)) {
72              assertEquals(0, br.getCurrentLineNumber());
73              while (br.read() != -1) {
74                  // consume all
75              }
76              assertEquals(EOLeolct, br.getCurrentLineNumber());
77          }
78          try (final ExtendedBufferedReader br = createBufferedReader(test)) {
79              assertEquals(0, br.getCurrentLineNumber());
80              final char[] buff = new char[10];
81              while (br.read(buff, 0, 3) != -1) {
82                  // consume all
83              }
84              assertEquals(EOLeolct, br.getCurrentLineNumber());
85          }
86      }
87  
88      @Test
89      public void testReadingInDifferentBuffer() throws Exception {
90          final char[] tmp1 = new char[2], tmp2 = new char[4];
91          try (ExtendedBufferedReader reader = createBufferedReader("1\r\n2\r\n")) {
92              reader.read(tmp1, 0, 2);
93              reader.read(tmp2, 2, 2);
94              assertEquals(2, reader.getCurrentLineNumber());
95          }
96      }
97  
98      @Test
99      public void testReadLine() throws Exception {
100         try (final ExtendedBufferedReader br = createBufferedReader("")) {
101             assertNull(br.readLine());
102         }
103         try (final ExtendedBufferedReader br = createBufferedReader("\n")) {
104             assertEquals("", br.readLine());
105             assertNull(br.readLine());
106         }
107         try (final ExtendedBufferedReader br = createBufferedReader("foo\n\nhello")) {
108             assertEquals(0, br.getCurrentLineNumber());
109             assertEquals("foo", br.readLine());
110             assertEquals(1, br.getCurrentLineNumber());
111             assertEquals("", br.readLine());
112             assertEquals(2, br.getCurrentLineNumber());
113             assertEquals("hello", br.readLine());
114             assertEquals(3, br.getCurrentLineNumber());
115             assertNull(br.readLine());
116             assertEquals(3, br.getCurrentLineNumber());
117         }
118         try (final ExtendedBufferedReader br = createBufferedReader("foo\n\nhello")) {
119             assertEquals('f', br.read());
120             assertEquals('o', br.lookAhead());
121             assertEquals("oo", br.readLine());
122             assertEquals(1, br.getCurrentLineNumber());
123             assertEquals('\n', br.lookAhead());
124             assertEquals("", br.readLine());
125             assertEquals(2, br.getCurrentLineNumber());
126             assertEquals('h', br.lookAhead());
127             assertEquals("hello", br.readLine());
128             assertNull(br.readLine());
129             assertEquals(3, br.getCurrentLineNumber());
130         }
131         try (final ExtendedBufferedReader br = createBufferedReader("foo\rbaar\r\nfoo")) {
132             assertEquals("foo", br.readLine());
133             assertEquals('b', br.lookAhead());
134             assertEquals("baar", br.readLine());
135             assertEquals('f', br.lookAhead());
136             assertEquals("foo", br.readLine());
137             assertNull(br.readLine());
138         }
139     }
140 
141     @Test
142     public void testReadLookahead1() throws Exception {
143         try (final ExtendedBufferedReader br = createBufferedReader("1\n2\r3\n")) {
144             assertEquals(0, br.getCurrentLineNumber());
145             assertEquals('1', br.lookAhead());
146             assertEquals(UNDEFINED, br.getLastChar());
147             assertEquals(0, br.getCurrentLineNumber());
148             assertEquals('1', br.read()); // Start line 1
149             assertEquals('1', br.getLastChar());
150 
151             assertEquals(1, br.getCurrentLineNumber());
152             assertEquals('\n', br.lookAhead());
153             assertEquals(1, br.getCurrentLineNumber());
154             assertEquals('1', br.getLastChar());
155             assertEquals('\n', br.read());
156             assertEquals(1, br.getCurrentLineNumber());
157             assertEquals('\n', br.getLastChar());
158             assertEquals(1, br.getCurrentLineNumber());
159 
160             assertEquals('2', br.lookAhead());
161             assertEquals(1, br.getCurrentLineNumber());
162             assertEquals('\n', br.getLastChar());
163             assertEquals(1, br.getCurrentLineNumber());
164             assertEquals('2', br.read()); // Start line 2
165             assertEquals(2, br.getCurrentLineNumber());
166             assertEquals('2', br.getLastChar());
167 
168             assertEquals('\r', br.lookAhead());
169             assertEquals(2, br.getCurrentLineNumber());
170             assertEquals('2', br.getLastChar());
171             assertEquals('\r', br.read());
172             assertEquals('\r', br.getLastChar());
173             assertEquals(2, br.getCurrentLineNumber());
174 
175             assertEquals('3', br.lookAhead());
176             assertEquals('\r', br.getLastChar());
177             assertEquals('3', br.read()); // Start line 3
178             assertEquals('3', br.getLastChar());
179             assertEquals(3, br.getCurrentLineNumber());
180 
181             assertEquals('\n', br.lookAhead());
182             assertEquals(3, br.getCurrentLineNumber());
183             assertEquals('3', br.getLastChar());
184             assertEquals('\n', br.read());
185             assertEquals(3, br.getCurrentLineNumber());
186             assertEquals('\n', br.getLastChar());
187             assertEquals(3, br.getCurrentLineNumber());
188 
189             assertEquals(END_OF_STREAM, br.lookAhead());
190             assertEquals('\n', br.getLastChar());
191             assertEquals(END_OF_STREAM, br.read());
192             assertEquals(END_OF_STREAM, br.getLastChar());
193             assertEquals(END_OF_STREAM, br.read());
194             assertEquals(END_OF_STREAM, br.lookAhead());
195             assertEquals(3, br.getCurrentLineNumber());
196 
197         }
198     }
199 
200     @Test
201     public void testReadLookahead2() throws Exception {
202         final char[] ref = new char[5];
203         final char[] res = new char[5];
204 
205         try (final ExtendedBufferedReader br = createBufferedReader("abcdefg")) {
206             ref[0] = 'a';
207             ref[1] = 'b';
208             ref[2] = 'c';
209             assertEquals(3, br.read(res, 0, 3));
210             assertArrayEquals(ref, res);
211             assertEquals('c', br.getLastChar());
212 
213             assertEquals('d', br.lookAhead());
214             ref[4] = 'd';
215             assertEquals(1, br.read(res, 4, 1));
216             assertArrayEquals(ref, res);
217             assertEquals('d', br.getLastChar());
218         }
219     }
220 }