1 package com.opencsv.bean.validators;
2
3 import com.opencsv.bean.CsvToBean;
4 import com.opencsv.bean.CsvToBeanBuilder;
5 import com.opencsv.exceptions.CsvValidationException;
6 import org.junit.jupiter.api.Assertions;
7 import org.junit.jupiter.api.DisplayName;
8 import org.junit.jupiter.api.Test;
9 import org.junit.jupiter.params.ParameterizedTest;
10 import org.junit.jupiter.params.provider.Arguments;
11 import org.junit.jupiter.params.provider.MethodSource;
12
13 import java.io.Reader;
14 import java.io.StringReader;
15 import java.util.List;
16 import java.util.stream.Stream;
17
18 public class BeanFieldValidatorTest {
19 private static final String GOOD_NAME = "A good name";
20 private static final String GOOD_ID_STRING = "256";
21 private static final int GOOD_ID_INT = 256;
22 private static final String GOOD_BIG_NUMBER_STRING = "some value: 987654321";
23 private static final long GOOD_BIG_NUMBER_LONG = 987654321;
24 public static String HEADER = "name,id,big number\n";
25
26
27 private CsvToBean<ValidatorTestBean> createBuilderForString(String csvStrings) {
28 Reader stringReader = new StringReader(csvStrings);
29
30 CsvToBeanBuilder<ValidatorTestBean> builder = new CsvToBeanBuilder<>(stringReader);
31
32 return builder.withType(ValidatorTestBean.class).build();
33 }
34
35 private String createTestString(String name, String id, String bigNumber) {
36 StringBuilder builder = new StringBuilder(128);
37 builder.append(HEADER);
38 builder.append(name);
39 builder.append(',');
40 builder.append(id);
41 builder.append(',');
42 builder.append(bigNumber);
43 builder.append("\n");
44 return builder.toString();
45 }
46
47 @Test
48 @DisplayName("Simple test to show defaults work the way I think they do.")
49 public void testGoodString() {
50 String testString = createTestString(GOOD_NAME, GOOD_ID_STRING, GOOD_BIG_NUMBER_STRING);
51
52 CsvToBean<ValidatorTestBean> builder = createBuilderForString(testString);
53
54 List<ValidatorTestBean> beans = builder.parse();
55
56 Assertions.assertEquals(1, beans.size());
57
58 ValidatorTestBean bean = beans.get(0);
59 Assertions.assertEquals(GOOD_NAME, bean.getBeanName());
60 Assertions.assertEquals(GOOD_ID_INT, bean.getBeanId());
61 }
62
63 @Test
64 @DisplayName("Will fail because of name")
65 public void badName() {
66 String testString = createTestString("1 is the start of a bad name", GOOD_ID_STRING, GOOD_BIG_NUMBER_STRING);
67
68 CsvToBean<ValidatorTestBean> csvToBean = createBuilderForString(testString);
69
70 try {
71 csvToBean.parse();
72 Assertions.fail("Was expecting a CsvValidationException.");
73 } catch (RuntimeException rte) {
74 Throwable cause = rte.getCause();
75 if (!(cause instanceof CsvValidationException)) {
76 Assertions.fail(String.format("Was expecting to catch a CsvValidationException but got an %s instead", cause.getClass().getName()));
77 }
78 }
79 }
80
81 private static Stream<Arguments> createIsValidArguments() {
82 return Stream.of(
83 Arguments.of("1", false),
84 Arguments.of(null, false),
85 Arguments.of("", false),
86 Arguments.of("12", false),
87 Arguments.of("123", true),
88 Arguments.of("1234", true),
89 Arguments.of("12345", true),
90 Arguments.of("123456", true),
91 Arguments.of("1234567", false),
92 Arguments.of("1234 ", false),
93 Arguments.of(" 1234", false),
94 Arguments.of("\t12345", false)
95 );
96 }
97
98 @DisplayName("RowValidatorAggregator isValid")
99 @ParameterizedTest
100 @MethodSource("createIsValidArguments")
101 public void testValidatorWithParameter(String idString, boolean valid) {
102 String testString = createTestString(GOOD_NAME, idString, GOOD_BIG_NUMBER_STRING);
103
104 CsvToBean<ValidatorTestBean> csvToBean = createBuilderForString(testString);
105
106 try {
107 List<ValidatorTestBean> beans = csvToBean.parse();
108 if (!valid) {
109 Assertions.fail(String.format("Was expecting id with value of \"%s\" to fail but it did not.", idString));
110 }
111 Assertions.assertEquals(1, beans.size());
112 ValidatorTestBean bean = beans.get(0);
113 Assertions.assertEquals(Integer.valueOf(idString), bean.getBeanId());
114 Assertions.assertEquals(GOOD_BIG_NUMBER_LONG, bean.getBigNumber());
115 } catch (RuntimeException rte) {
116 if (valid) {
117 Assertions.fail(String.format("Was expecting id with value of \"%s\" to pass but an exception was thrown.", idString));
118 }
119 Throwable cause = rte.getCause();
120 if (!(cause instanceof CsvValidationException)) {
121 Assertions.fail(String.format("Was expecting to catch a CsvValidationException but got an %s instead", cause.getClass().getName()));
122 }
123 }
124 }
125
126
127 }