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.assertArrayEquals;
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertNull;
21  import static org.supercsv.SuperCsvTestUtils.ADA;
22  import static org.supercsv.SuperCsvTestUtils.ADA_STRING;
23  import static org.supercsv.SuperCsvTestUtils.ALICE;
24  import static org.supercsv.SuperCsvTestUtils.ALICE_STRING;
25  import static org.supercsv.SuperCsvTestUtils.BILL;
26  import static org.supercsv.SuperCsvTestUtils.BILL_STRING;
27  import static org.supercsv.SuperCsvTestUtils.BOB;
28  import static org.supercsv.SuperCsvTestUtils.BOB_STRING;
29  import static org.supercsv.SuperCsvTestUtils.CSV_FILE;
30  import static org.supercsv.SuperCsvTestUtils.CUSTOMERS;
31  import static org.supercsv.SuperCsvTestUtils.GRACE;
32  import static org.supercsv.SuperCsvTestUtils.GRACE_STRING;
33  import static org.supercsv.SuperCsvTestUtils.HEADER;
34  import static org.supercsv.SuperCsvTestUtils.JOHN;
35  import static org.supercsv.SuperCsvTestUtils.JOHN_STRING;
36  import static org.supercsv.SuperCsvTestUtils.LARRY;
37  import static org.supercsv.SuperCsvTestUtils.LARRY_STRING;
38  import static org.supercsv.SuperCsvTestUtils.MIRANDA;
39  import static org.supercsv.SuperCsvTestUtils.MIRANDA_STRING;
40  import static org.supercsv.SuperCsvTestUtils.PARTIAL_HEADER;
41  import static org.supercsv.SuperCsvTestUtils.READ_PROCESSORS;
42  import static org.supercsv.SuperCsvTestUtils.SERGEI;
43  import static org.supercsv.SuperCsvTestUtils.SERGEI_STRING;
44  import static org.supercsv.SuperCsvTestUtils.STEVE;
45  import static org.supercsv.SuperCsvTestUtils.STEVE_STRING;
46  import static org.supercsv.SuperCsvTestUtils.STRING_CUSTOMERS;
47  
48  import java.io.IOException;
49  import java.io.Reader;
50  import java.io.StringReader;
51  
52  import org.junit.After;
53  import org.junit.Before;
54  import org.junit.Test;
55  import org.supercsv.cellprocessor.ift.CellProcessor;
56  import org.supercsv.exception.SuperCsvReflectionException;
57  import org.supercsv.mock.Customer;
58  import org.supercsv.mock.CustomerBean;
59  import org.supercsv.mock.CustomerStringBean;
60  import org.supercsv.mock.PersonBean;
61  import org.supercsv.prefs.CsvPreference;
62  
63  
64  
65  
66  
67  
68  public class CsvBeanReaderTest {
69  	
70  	private static final CsvPreference PREFS = CsvPreference.STANDARD_PREFERENCE;
71  	
72  	private Reader reader;
73  	
74  	private CsvBeanReader beanReader;
75  	
76  	private CsvBeanReader tokenizerBeanReader;
77  	
78  	
79  
80  
81  	@Before
82  	public void setUp() {
83  		reader = new StringReader(CSV_FILE);
84  		beanReader = new CsvBeanReader(reader, PREFS);
85  		
86  		final Tokenizer tokenizer = new Tokenizer(reader, PREFS);
87  		tokenizerBeanReader = new CsvBeanReader(tokenizer, PREFS);
88  	}
89  	
90  	
91  
92  
93  	@After
94  	public void tearDown() throws IOException {
95  		beanReader.close();
96  		tokenizerBeanReader.close();
97  	}
98  	
99  	
100 
101 
102 	@Test
103 	public void testReadWithProcessors() throws IOException {
104 		
105 		final String[] header = beanReader.getHeader(true);
106 		assertArrayEquals(HEADER, header);
107 		
108 		assertEquals(JOHN, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
109 		assertEquals(BOB, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
110 		assertEquals(ALICE, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
111 		assertEquals(BILL, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
112 		assertEquals(MIRANDA, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
113 		assertEquals(STEVE, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
114 		assertEquals(ADA, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
115 		assertEquals(SERGEI, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
116 		assertEquals(LARRY, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
117 		assertEquals(GRACE, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
118 		assertNull(beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
119 	}
120 	
121 	
122 
123 
124 	@Test
125 	public void testPartialReadWithProcessors() throws IOException {
126 		
127 		assertArrayEquals(HEADER, beanReader.getHeader(true));
128 		
129 		final String[] header = PARTIAL_HEADER;
130 		for( CustomerBean fullCustomer : CUSTOMERS ) {
131 			
132 			
133 			CustomerBean expectedCustomer = new CustomerBean();
134 			expectedCustomer.setFirstName(fullCustomer.getFirstName());
135 			expectedCustomer.setLastName(fullCustomer.getLastName());
136 			expectedCustomer.setEmail(fullCustomer.getEmail());
137 			assertEquals(expectedCustomer, beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
138 		}
139 		
140 		assertNull(beanReader.read(CustomerBean.class, header, READ_PROCESSORS));
141 	}
142 	
143 	
144 
145 
146 	@Test
147 	public void testRead() throws IOException {
148 		
149 		final String[] header = beanReader.getHeader(true);
150 		assertArrayEquals(HEADER, header);
151 		
152 		assertEquals(JOHN_STRING, beanReader.read(CustomerStringBean.class, header));
153 		assertEquals(BOB_STRING, beanReader.read(CustomerStringBean.class, header));
154 		assertEquals(ALICE_STRING, beanReader.read(CustomerStringBean.class, header));
155 		assertEquals(BILL_STRING, beanReader.read(CustomerStringBean.class, header));
156 		assertEquals(MIRANDA_STRING, beanReader.read(CustomerStringBean.class, header));
157 		assertEquals(STEVE_STRING, beanReader.read(CustomerStringBean.class, header));
158 		assertEquals(ADA_STRING, beanReader.read(CustomerStringBean.class, header));
159 		assertEquals(SERGEI_STRING, beanReader.read(CustomerStringBean.class, header));
160 		assertEquals(LARRY_STRING, beanReader.read(CustomerStringBean.class, header));
161 		assertEquals(GRACE_STRING, beanReader.read(CustomerStringBean.class, header));
162 		assertNull(beanReader.read(CustomerStringBean.class, header));
163 	}
164 	
165 	
166 
167 
168 	@Test
169 	public void testPartialRead() throws IOException {
170 		
171 		assertArrayEquals(HEADER, beanReader.getHeader(true));
172 		
173 		final String[] header = PARTIAL_HEADER;
174 		for( CustomerStringBean fullCustomer : STRING_CUSTOMERS ) {
175 			
176 			
177 			CustomerBean expectedCustomer = new CustomerBean();
178 			expectedCustomer.setFirstName(fullCustomer.getFirstName());
179 			expectedCustomer.setLastName(fullCustomer.getLastName());
180 			expectedCustomer.setEmail(fullCustomer.getEmail());
181 			assertEquals(expectedCustomer, beanReader.read(CustomerBean.class, header));
182 		}
183 		
184 		assertNull(beanReader.read(CustomerBean.class, header));
185 	}
186 	
187 	
188 
189 
190 	@Test
191 	public void testReadIntoExistingBean() throws IOException {
192 		
193 		final String[] header = beanReader.getHeader(true);
194 		assertArrayEquals(HEADER, header);
195 		
196 		assertEquals(JOHN_STRING, beanReader.read(new CustomerStringBean(), header));
197 		assertEquals(BOB_STRING, beanReader.read(new CustomerStringBean(), header));
198 		assertEquals(ALICE_STRING, beanReader.read(new CustomerStringBean(), header));
199 		assertEquals(BILL_STRING, beanReader.read(new CustomerStringBean(), header));
200 		assertEquals(MIRANDA_STRING, beanReader.read(new CustomerStringBean(), header));
201 		assertEquals(STEVE_STRING, beanReader.read(new CustomerStringBean(), header));
202 		assertEquals(ADA_STRING, beanReader.read(new CustomerStringBean(), header));
203 		assertEquals(SERGEI_STRING, beanReader.read(new CustomerStringBean(), header));
204 		assertEquals(LARRY_STRING, beanReader.read(new CustomerStringBean(), header));
205 		assertEquals(GRACE_STRING, beanReader.read(new CustomerStringBean(), header));
206 		assertNull(beanReader.read(new CustomerStringBean(), header));
207 	}
208 	
209 	
210 
211 
212 	@Test
213 	public void testReadIntoExistingBeanWithProcessors() throws IOException {
214 		
215 		final String[] header = beanReader.getHeader(true);
216 		assertArrayEquals(HEADER, header);
217 		
218 		assertEquals(JOHN, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
219 		assertEquals(BOB, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
220 		assertEquals(ALICE, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
221 		assertEquals(BILL, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
222 		assertEquals(MIRANDA, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
223 		assertEquals(STEVE, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
224 		assertEquals(ADA, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
225 		assertEquals(SERGEI, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
226 		assertEquals(LARRY, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
227 		assertEquals(GRACE, beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
228 		assertNull(beanReader.read(new CustomerBean(), header, READ_PROCESSORS));
229 	}
230 	
231 	
232 
233 
234 
235 	@Test
236 	public void testReadUsingTokenizerReader() throws IOException {
237 		
238 		final String[] header = tokenizerBeanReader.getHeader(true);
239 		assertArrayEquals(HEADER, header);
240 		
241 		assertEquals(JOHN_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
242 		assertEquals(BOB_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
243 		assertEquals(ALICE_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
244 		assertEquals(BILL_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
245 		assertEquals(MIRANDA_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
246 		assertEquals(STEVE_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
247 		assertEquals(ADA_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
248 		assertEquals(SERGEI_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
249 		assertEquals(LARRY_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
250 		assertEquals(GRACE_STRING, tokenizerBeanReader.read(CustomerStringBean.class, header));
251 		assertNull(tokenizerBeanReader.read(CustomerStringBean.class, header));
252 	}
253 	
254 	
255 
256 
257 	@Test
258 	public void testReadWithProcessorsUsingInterface() throws IOException {
259 		assertArrayEquals(HEADER, beanReader.getHeader(true));
260 		
261 		
262 		final String[] header = new String[] { "customerNo", null, null, null, "mailingAddress", null, null, null,
263 			null, "loyaltyPoints" };
264 		
265 		int i = 0;
266 		Customer customer;
267 		while( (customer = beanReader.read(Customer.class, header, READ_PROCESSORS)) != null ) {
268 			assertEquals(CUSTOMERS.get(i).getCustomerNo(), customer.getCustomerNo());
269 			assertEquals(CUSTOMERS.get(i).getMailingAddress(), customer.getMailingAddress());
270 			assertEquals(CUSTOMERS.get(i).getLoyaltyPoints(), customer.getLoyaltyPoints());
271 			i++;
272 		}
273 		
274 		assertEquals(CUSTOMERS.size() + 1, beanReader.getRowNumber());
275 		
276 	}
277 	
278 	
279 
280 
281 	@Test(expected = SuperCsvReflectionException.class)
282 	public void testReadWithNonJavabean() throws IOException {
283 		beanReader.read(Integer.class, HEADER);
284 	}
285 	
286 	
287 
288 
289 	@Test(expected = NullPointerException.class)
290 	public void testReadWithNullBeanClass() throws IOException {
291 		beanReader.read(null, HEADER);
292 	}
293 	
294 	
295 
296 
297 	@Test(expected = NullPointerException.class)
298 	public void testReadWithNullBean() throws IOException {
299 		beanReader.read((Object) null, HEADER);
300 	}
301 	
302 	
303 
304 
305 	@Test(expected = NullPointerException.class)
306 	public void testReadWithNullNameMapping() throws IOException {
307 		beanReader.read(PersonBean.class, (String[]) null);
308 	}
309 	
310 	
311 
312 
313 	@Test(expected = NullPointerException.class)
314 	public void testReadIntoBeanWithNullNameMapping() throws IOException {
315 		beanReader.read(new PersonBean(), (String[]) null);
316 	}
317 	
318 	
319 
320 
321 	@Test(expected = IllegalArgumentException.class)
322 	public void testReadWithInvalidSizeNameMapping() throws IOException {
323 		beanReader.getHeader(true);
324 		beanReader.read(PersonBean.class, new String[] { null, "firstName" });
325 	}
326 	
327 	
328 
329 
330 	@Test(expected = IllegalArgumentException.class)
331 	public void testReadIntoBeanWithInvalidSizeNameMapping() throws IOException {
332 		beanReader.getHeader(true);
333 		beanReader.read(new PersonBean(), new String[] { null, "firstName" });
334 	}
335 	
336 	
337 
338 
339 	@Test(expected = NullPointerException.class)
340 	public void testReadProcessorsWithNullBeanClass() throws IOException {
341 		beanReader.read(null, HEADER, READ_PROCESSORS);
342 	}
343 	
344 	
345 
346 
347 	@Test(expected = NullPointerException.class)
348 	public void testReadUsingProcessorsWithNullBean() throws IOException {
349 		beanReader.read((Object) null, HEADER, READ_PROCESSORS);
350 	}
351 	
352 	
353 
354 
355 	@Test(expected = NullPointerException.class)
356 	public void testReadProcessorsWithNullNameMapping() throws IOException {
357 		beanReader.read(PersonBean.class, (String[]) null, READ_PROCESSORS);
358 	}
359 	
360 	
361 
362 
363 	@Test(expected = NullPointerException.class)
364 	public void testReadIntoBeanUsingProcessorsWithNullNameMapping() throws IOException {
365 		beanReader.read(new PersonBean(), (String[]) null, READ_PROCESSORS);
366 	}
367 	
368 	
369 
370 
371 	@Test(expected = NullPointerException.class)
372 	public void testReadProcessorsWithNullProcessors() throws IOException {
373 		beanReader.read(PersonBean.class, HEADER, (CellProcessor[]) null);
374 	}
375 	
376 	
377 
378 
379 	@Test(expected = NullPointerException.class)
380 	public void testReadIntoBeanUsingProcessorsWithNullProcessors() throws IOException {
381 		beanReader.read(new PersonBean(), HEADER, (CellProcessor[]) null);
382 	}
383 	
384 	
385 
386 
387 	@SuppressWarnings("resource")
388 	@Test(expected = NullPointerException.class)
389 	public void testReaderConstructorWithNullReader() {
390 		new CsvBeanReader((Reader) null, PREFS);
391 	}
392 	
393 	
394 
395 
396 	@SuppressWarnings("resource")
397 	@Test(expected = NullPointerException.class)
398 	public void testReaderConstructorWithNullPreferences() {
399 		new CsvBeanReader(reader, null);
400 	}
401 	
402 	
403 
404 
405 	@SuppressWarnings("resource")
406 	@Test(expected = NullPointerException.class)
407 	public void testTokenizerConstructorWithNullReader() {
408 		new CsvBeanReader((Tokenizer) null, PREFS);
409 	}
410 	
411 	
412 
413 
414 	@SuppressWarnings("resource")
415 	@Test(expected = NullPointerException.class)
416 	public void testTokenizerConstructorWithNullPreferences() {
417 		new CsvBeanReader(new Tokenizer(reader, PREFS), null);
418 	}
419 	
420 	
421 
422 
423 	@Test(expected = SuperCsvReflectionException.class)
424 	public void testBeanInstantationThrowingIllegalAccessException() throws IOException {
425 		beanReader.read(IllegalAccessBean.class, HEADER);
426 	}
427 	
428 	
429 
430 
431 	@SuppressWarnings("resource")
432 	@Test(expected = SuperCsvReflectionException.class)
433 	public void testSetterThrowingException() throws IOException {
434 		new CsvBeanReader(new StringReader("value"), PREFS).read(ExceptionBean.class, "illegalArgument");
435 	}
436 	
437 	
438 
439 
440 	public static class ExceptionBean extends CustomerBean {
441 		
442 		public void setIllegalArgument(String s) {
443 			throw new IllegalArgumentException("i don't like it!");
444 		}
445 		
446 	}
447 	
448 	
449 
450 
451 	public static class IllegalAccessBean extends CustomerBean {
452 		
453 		public IllegalAccessBean() throws IllegalAccessException {
454 			throw new IllegalAccessException("naughty naughty!");
455 		}
456 		
457 	}
458 }