1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.supercsv.io;
17
18 import static org.junit.Assert.assertEquals;
19 import static org.junit.Assert.assertFalse;
20 import static org.junit.Assert.assertNull;
21 import static org.junit.Assert.assertTrue;
22 import static org.junit.Assert.fail;
23
24 import java.io.IOException;
25 import java.io.Reader;
26 import java.io.StringReader;
27 import java.util.Arrays;
28 import java.util.List;
29
30 import org.junit.After;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.supercsv.exception.SuperCsvException;
34 import org.supercsv.prefs.CsvPreference;
35
36
37
38
39
40
41
42 public class AbstractCsvReaderTest {
43
44 private static final CsvPreference PREFS = CsvPreference.STANDARD_PREFERENCE;
45
46 private static final CsvPreference SURROUNDING_SPACES_NEED_QUOTES_PREFS = new CsvPreference.Builder(
47 CsvPreference.STANDARD_PREFERENCE).surroundingSpacesNeedQuotes(true).build();
48
49 private Reader reader;
50
51 private Reader surroundingSpacesNeedQuotesReader;
52
53 private AbstractCsvReader abstractReader;
54
55 private AbstractCsvReader tokenizerAbstractReader;
56
57 private AbstractCsvReader surroundingSpacesNeedQuotesAbstractReader;
58
59 private ITokenizer tokenizer;
60
61
62
63
64 private static class MockCsvReader extends AbstractCsvReader {
65
66 public MockCsvReader(ITokenizer tokenizer, CsvPreference preferences) {
67 super(tokenizer, preferences);
68 }
69
70 public MockCsvReader(Reader reader, CsvPreference preferences) {
71 super(reader, preferences);
72 }
73
74 }
75
76
77
78
79 @Before
80 public void setUp() {
81 reader = new StringReader("firstName,lastName,age,address\n" + "John,Smith,23,\n"
82 + "Harry,Potter,,\"Gryffindor\nHogwarts Castle\nUK\"");
83 abstractReader = new MockCsvReader(reader, PREFS);
84
85 tokenizer = new Tokenizer(reader, PREFS);
86 tokenizerAbstractReader = new MockCsvReader(tokenizer, PREFS);
87
88 surroundingSpacesNeedQuotesReader = new StringReader("firstName, lastName, age, address\n"
89 + " John , Smith, 23 , \n" + "Harry, Potter, , \"Gryffindor\nHogwarts Castle\nUK\" ");
90 surroundingSpacesNeedQuotesAbstractReader = new MockCsvReader(surroundingSpacesNeedQuotesReader,
91 SURROUNDING_SPACES_NEED_QUOTES_PREFS);
92 }
93
94
95
96
97 @After
98 public void tearDown() throws IOException {
99 abstractReader.close();
100 tokenizerAbstractReader.close();
101 surroundingSpacesNeedQuotesAbstractReader.close();
102 }
103
104
105
106
107 @Test
108 public void testReadingWithNormalReader() throws IOException {
109 assertReading(abstractReader);
110 }
111
112
113
114
115
116 @Test
117 public void testReadingWithTokenizerReader() throws IOException {
118 assertReading(tokenizerAbstractReader);
119 }
120
121
122
123
124 private void assertReading(final AbstractCsvReader csvReader) throws IOException {
125
126 assertEquals(PREFS, csvReader.getPreferences());
127
128 assertEquals(0, csvReader.getLineNumber());
129 assertEquals(0, csvReader.getRowNumber());
130 assertEquals("", csvReader.getUntokenizedRow());
131 assertEquals(0, csvReader.length());
132
133
134 final String[] header = csvReader.getHeader(true);
135 assertEquals(4, header.length);
136 assertEquals("firstName", header[0]);
137 assertEquals("lastName", header[1]);
138 assertEquals("age", header[2]);
139 assertEquals("address", header[3]);
140
141 assertEquals(1, csvReader.getLineNumber());
142 assertEquals(1, csvReader.getRowNumber());
143 assertEquals("firstName,lastName,age,address", csvReader.getUntokenizedRow());
144 assertEquals(4, csvReader.length());
145
146
147 assertTrue(csvReader.readRow());
148 List<String> line = csvReader.getColumns();
149 assertEquals(4, csvReader.length());
150 assertEquals("John", line.get(0));
151 assertEquals("Smith", line.get(1));
152 assertEquals("23", line.get(2));
153 assertNull(line.get(3));
154
155
156 assertTrue(Arrays.equals(line.toArray(), new Object[] { csvReader.get(1), csvReader.get(2), csvReader.get(3),
157 csvReader.get(4) }));
158
159 assertEquals(2, csvReader.getLineNumber());
160 assertEquals(2, csvReader.getRowNumber());
161 assertEquals("John,Smith,23,", csvReader.getUntokenizedRow());
162 assertEquals(4, csvReader.length());
163
164
165 assertTrue(csvReader.readRow());
166 line = csvReader.getColumns();
167 assertEquals(4, csvReader.length());
168 assertEquals("Harry", line.get(0));
169 assertEquals("Potter", line.get(1));
170 assertNull(line.get(2));
171 assertEquals("Gryffindor\nHogwarts Castle\nUK", line.get(3));
172
173
174 assertTrue(Arrays.equals(line.toArray(), new Object[] { csvReader.get(1), csvReader.get(2), csvReader.get(3),
175 csvReader.get(4) }));
176
177 assertEquals(5, csvReader.getLineNumber());
178 assertEquals(3, csvReader.getRowNumber());
179 assertEquals("Harry,Potter,,\"Gryffindor\nHogwarts Castle\nUK\"", csvReader.getUntokenizedRow());
180 assertEquals(4, csvReader.length());
181
182
183 assertFalse(csvReader.readRow());
184 assertEquals(5, csvReader.getLineNumber());
185 assertEquals(3, csvReader.getRowNumber());
186 assertEquals("", csvReader.getUntokenizedRow());
187 assertEquals(0, csvReader.length());
188
189 }
190
191
192
193
194
195 @Test
196 public void testReadingWithSurroundingSpacesNeedQuotesReader() throws IOException {
197 assertReadingWithSurroundingSpacesNeedQuotesEnabled(surroundingSpacesNeedQuotesAbstractReader);
198 }
199
200
201
202
203
204 private void assertReadingWithSurroundingSpacesNeedQuotesEnabled(final AbstractCsvReader csvReader) throws IOException {
205
206 assertEquals(SURROUNDING_SPACES_NEED_QUOTES_PREFS, csvReader.getPreferences());
207
208 assertEquals(0, csvReader.getLineNumber());
209 assertEquals(0, csvReader.getRowNumber());
210 assertEquals("", csvReader.getUntokenizedRow());
211 assertEquals(0, csvReader.length());
212
213
214 final String[] header = csvReader.getHeader(true);
215 assertEquals(4, header.length);
216 assertEquals("firstName", header[0]);
217 assertEquals("lastName", header[1]);
218 assertEquals("age", header[2]);
219 assertEquals("address", header[3]);
220
221 assertEquals(1, csvReader.getLineNumber());
222 assertEquals(1, csvReader.getRowNumber());
223 assertEquals("firstName, lastName, age, address", csvReader.getUntokenizedRow());
224 assertEquals(4, csvReader.length());
225
226
227 assertTrue(csvReader.readRow());
228 List<String> line = csvReader.getColumns();
229 assertEquals(4, csvReader.length());
230 assertEquals("John", line.get(0));
231 assertEquals("Smith", line.get(1));
232 assertEquals("23", line.get(2));
233 assertNull(line.get(3));
234
235
236 assertTrue(Arrays.equals(line.toArray(), new Object[] { csvReader.get(1), csvReader.get(2), csvReader.get(3),
237 csvReader.get(4) }));
238
239 assertEquals(2, csvReader.getLineNumber());
240 assertEquals(2, csvReader.getRowNumber());
241 assertEquals(" John , Smith, 23 , ", csvReader.getUntokenizedRow());
242 assertEquals(4, csvReader.length());
243
244
245 assertTrue(csvReader.readRow());
246 line = csvReader.getColumns();
247 assertEquals(4, csvReader.length());
248 assertEquals("Harry", line.get(0));
249 assertEquals("Potter", line.get(1));
250 assertNull(line.get(2));
251 assertEquals("Gryffindor\nHogwarts Castle\nUK", line.get(3));
252
253
254 assertTrue(Arrays.equals(line.toArray(), new Object[] { csvReader.get(1), csvReader.get(2), csvReader.get(3),
255 csvReader.get(4) }));
256
257 assertEquals(5, csvReader.getLineNumber());
258 assertEquals(3, csvReader.getRowNumber());
259 assertEquals("Harry, Potter, , \"Gryffindor\nHogwarts Castle\nUK\" ", csvReader.getUntokenizedRow());
260 assertEquals(4, csvReader.length());
261
262
263 assertFalse(csvReader.readRow());
264 assertEquals(5, csvReader.getLineNumber());
265 assertEquals(3, csvReader.getRowNumber());
266 assertEquals("", csvReader.getUntokenizedRow());
267 assertEquals(0, csvReader.length());
268
269 }
270
271
272
273
274 @Test
275 public void testIllegalGetHeader() throws IOException {
276
277 abstractReader.getHeader(true);
278
279 try {
280 abstractReader.getHeader(true);
281 fail("should have thrown SuperCsvException");
282 }
283 catch(SuperCsvException e) {
284 assertEquals("CSV header must be fetched as the first read operation, but 1 lines have already been read",
285 e.getMessage());
286 }
287
288 }
289
290
291
292
293 @Test
294 public void testGetHeaderNoCheck() throws IOException {
295 assertEquals(4, abstractReader.getHeader(false).length);
296 assertEquals(4, abstractReader.getHeader(false).length);
297 assertEquals(4, abstractReader.getHeader(false).length);
298 assertNull(abstractReader.getHeader(false));
299 }
300
301
302
303
304 @SuppressWarnings("resource")
305 @Test(expected = NullPointerException.class)
306 public void testReaderConstructorWithNullReader() {
307 new CsvListReader((Reader) null, PREFS);
308 }
309
310
311
312
313 @SuppressWarnings("resource")
314 @Test(expected = NullPointerException.class)
315 public void testReaderConstructorWithNullPreferences() {
316 new CsvListReader(reader, null);
317 }
318
319
320
321
322 @SuppressWarnings("resource")
323 @Test(expected = NullPointerException.class)
324 public void testTokenizerConstructorWithNullReader() {
325 new CsvListReader((Tokenizer) null, PREFS);
326 }
327
328
329
330
331 @SuppressWarnings("resource")
332 @Test(expected = NullPointerException.class)
333 public void testTokenizerConstructorWithNullPreferences() {
334 new CsvListReader(tokenizer, null);
335 }
336
337 }