1 package com.opencsv;
2
3 import com.opencsv.exceptions.CsvException;
4 import com.opencsv.exceptions.CsvValidationException;
5 import com.opencsv.validators.LineDoesNotHaveForbiddenString;
6 import com.opencsv.validators.RowFunctionValidator;
7 import com.opencsv.validators.RowValidator;
8 import org.junit.jupiter.api.BeforeEach;
9 import org.junit.jupiter.api.DisplayName;
10 import org.junit.jupiter.api.Test;
11
12 import java.io.IOException;
13 import java.io.StringReader;
14 import java.util.List;
15 import java.util.function.Function;
16
17 import static org.junit.jupiter.api.Assertions.*;
18
19 public class CSVReaderWithValidatorsTest {
20 private static final String BAD = "bad";
21 private static final String AWFUL = "awful";
22 private LineDoesNotHaveForbiddenString lineDoesNotHaveBadString;
23 private LineDoesNotHaveForbiddenString lineDoesNotHaveAwfulString;
24
25 private static final Function<String[], Boolean> ROW_MUST_HAVE_THREE_COLUMNS = (x) -> x.length == 3;
26 private static final RowValidator THREE_COLUMNS_ROW_VALIDATOR = new RowFunctionValidator(ROW_MUST_HAVE_THREE_COLUMNS, "Row must have three columns!");
27
28 @BeforeEach
29 public void setup() {
30 lineDoesNotHaveBadString = new LineDoesNotHaveForbiddenString(BAD);
31 lineDoesNotHaveAwfulString = new LineDoesNotHaveForbiddenString(AWFUL);
32 }
33
34 @DisplayName("CSVReader with LineValidator with good string")
35 @Test
36 public void readerWithLineValidatorWithValidString() throws IOException, CsvException {
37 String lines = "a,b,c\nd,e,f\n";
38 StringReader stringReader = new StringReader(lines);
39 CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
40
41 CSVReader csvReader = builder
42 .withLineValidator(lineDoesNotHaveAwfulString)
43 .withLineValidator(lineDoesNotHaveBadString)
44 .withRowValidator(THREE_COLUMNS_ROW_VALIDATOR)
45 .build();
46
47 List<String[]> rows = csvReader.readAll();
48 assertEquals(2, rows.size());
49 }
50
51 @DisplayName("CSVReader with LineValidator with bad string")
52 @Test
53 public void readerWithLineValidatorWithBadString() {
54 String lines = "a,b,c\nd,bad,f\n";
55 StringReader stringReader = new StringReader(lines);
56 CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
57
58 CSVReader csvReader = builder
59 .withLineValidator(lineDoesNotHaveAwfulString)
60 .withLineValidator(lineDoesNotHaveBadString)
61 .build();
62
63 assertThrows(CsvValidationException.class, csvReader::readAll);
64 }
65
66 @DisplayName("CSVReader with LineValidator with bad first string")
67 @Test
68 public void readerWithLineValidatorWithBadFirstString() {
69 String lines = "d,bad,f\na,b,c\n";
70 StringReader stringReader = new StringReader(lines);
71 CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
72
73 CSVReader csvReader = builder
74 .withLineValidator(lineDoesNotHaveAwfulString)
75 .withLineValidator(lineDoesNotHaveBadString)
76 .build();
77
78 try {
79 csvReader.readAll();
80 fail("Expected a CsvValidationException to be thrown!");
81 } catch (CsvValidationException cve) {
82 assertEquals(1, cve.getLineNumber());
83 } catch (Exception e) {
84 fail("Caught an exception other than CsvValidationException!", e);
85 }
86 }
87
88 @DisplayName("CSVReader populates line number of exception thrown by LineValidatorAggregator")
89 @Test
90 public void readerWithLineValidatorExceptionContainsLineNumber() {
91 String lines = "a,b,c\nd,bad,f\n";
92 StringReader stringReader = new StringReader(lines);
93 CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
94
95 CSVReader csvReader = builder
96 .withLineValidator(lineDoesNotHaveAwfulString)
97 .withLineValidator(lineDoesNotHaveBadString)
98 .build();
99
100 try {
101 csvReader.readAll();
102 fail("Expected a CsvValidationException to be thrown!");
103 } catch (CsvValidationException cve) {
104 assertEquals(2, cve.getLineNumber());
105 } catch (Exception e) {
106 fail("Caught an exception other than CsvValidationException!", e);
107 }
108 }
109
110 @DisplayName("CSVReader with RowValidator with bad row")
111 @Test
112 public void readerWithRowValidatorWithBadRow() {
113 String lines = "a,b,c\nd,f\n";
114 StringReader stringReader = new StringReader(lines);
115 CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
116
117 CSVReader csvReader = builder
118 .withRowValidator(THREE_COLUMNS_ROW_VALIDATOR)
119 .build();
120
121 assertThrows(CsvValidationException.class, csvReader::readAll);
122 }
123
124 @DisplayName("CSVReader populates line number of exception thrown by RowValidatorAggregator")
125 @Test
126 public void readerWithRowValidatorExceptionContainsLineNumber() {
127 String lines = "a,b,c\nd,f\n";
128 StringReader stringReader = new StringReader(lines);
129 CSVReaderBuilder builder = new CSVReaderBuilder(stringReader);
130
131 CSVReader csvReader = builder
132 .withRowValidator(THREE_COLUMNS_ROW_VALIDATOR)
133 .build();
134
135 try {
136 csvReader.readAll();
137 fail("Expected a CsvValidationException to be thrown!");
138 } catch (CsvValidationException cve) {
139 assertEquals(2, cve.getLineNumber());
140 } catch (Exception e) {
141 fail("Caught an exception other than CsvValidationException!", e);
142 }
143 }
144 }