View Javadoc
1   package com.opencsv;
2   
3   import org.apache.commons.lang3.reflect.FieldUtils;
4   import org.junit.jupiter.api.Assertions;
5   import org.junit.jupiter.api.BeforeEach;
6   import org.junit.jupiter.api.Test;
7   
8   import java.io.StringWriter;
9   import java.io.Writer;
10  import java.lang.reflect.Field;
11  
12  import static org.junit.jupiter.api.Assertions.*;
13  import static org.mockito.Mockito.mock;
14  
15  public class CSVWriterBuilderTest {
16      private CSVWriterBuilder builder;
17      private Writer writer;
18      private final ICSVParser mockParser = mock(ICSVParser.class);
19  
20      @BeforeEach
21      public void setup() {
22          writer = new StringWriter();
23          builder = new CSVWriterBuilder(writer);
24      }
25  
26      @Test
27      public void builderHasWriter() throws IllegalAccessException {
28          Field writerField = FieldUtils.getField(builder.getClass(), "writer", true);
29          assertEquals(writer, writerField.get(builder));
30      }
31  
32      @Test
33      public void withParser() throws IllegalAccessException {
34          CSVWriterBuilder newBuilder = builder.withParser(mockParser);
35          assertSame(builder, newBuilder);
36          Field parserField = FieldUtils.getDeclaredField(builder.getClass(), "parser", true);
37          assertEquals(mockParser, parserField.get(builder));
38      }
39  
40      @Test
41      public void withSeparator() throws IllegalAccessException {
42          CSVWriterBuilder newBuilder = builder.withSeparator(ICSVParser.DEFAULT_SEPARATOR);
43          assertSame(builder, newBuilder);
44          Field separatorField = FieldUtils.getDeclaredField(builder.getClass(), "separator", true);
45          assertEquals(ICSVParser.DEFAULT_SEPARATOR, separatorField.get(builder));
46      }
47  
48      @Test
49      public void withSeparatorFailsIfParserSet() {
50          Assertions.assertThrows(IllegalArgumentException.class, () -> builder.withParser(mockParser).withSeparator(ICSVParser.DEFAULT_SEPARATOR));
51      }
52  
53      @Test
54      public void withParserFailsIfSeparatorSet() {
55          Assertions.assertThrows(IllegalArgumentException.class, () -> builder.withSeparator(ICSVParser.DEFAULT_SEPARATOR).withParser(mockParser));
56      }
57  
58      @Test
59      public void withQuoteChar() throws IllegalAccessException {
60          CSVWriterBuilder newBuilder = builder.withQuoteChar(ICSVParser.DEFAULT_QUOTE_CHARACTER);
61          assertSame(builder, newBuilder);
62          Field quoteCharField = FieldUtils.getDeclaredField(builder.getClass(), "quotechar", true);
63          assertEquals(ICSVParser.DEFAULT_QUOTE_CHARACTER, quoteCharField.get(builder));
64      }
65  
66      @Test
67      public void withQuoteCharFailsIfParserSet() {
68          Assertions.assertThrows(IllegalArgumentException.class, () -> builder.withParser(mockParser).withQuoteChar(ICSVParser.DEFAULT_SEPARATOR));
69      }
70  
71      @Test
72      public void withParserFailsIfQuoteCharSet() {
73          Assertions.assertThrows(IllegalArgumentException.class, () -> builder.withQuoteChar(ICSVParser.DEFAULT_SEPARATOR).withParser(mockParser));
74      }
75  
76      @Test
77      public void withEscapeChar() throws IllegalAccessException {
78          CSVWriterBuilder newBuilder = builder.withEscapeChar(ICSVParser.DEFAULT_ESCAPE_CHARACTER);
79          assertSame(builder, newBuilder);
80          Field escapeCharField = FieldUtils.getDeclaredField(builder.getClass(), "escapechar", true);
81          assertEquals(ICSVParser.DEFAULT_ESCAPE_CHARACTER, escapeCharField.get(builder));
82      }
83  
84      @Test
85      public void withEscapeCharFailsIfParserSet() {
86          Assertions.assertThrows(IllegalArgumentException.class, () -> builder.withParser(mockParser).withEscapeChar(ICSVParser.DEFAULT_ESCAPE_CHARACTER));
87      }
88  
89      @Test
90      public void withParserFailsIfEscapeCharSet() {
91          Assertions.assertThrows(IllegalArgumentException.class, () -> builder.withEscapeChar(ICSVParser.DEFAULT_ESCAPE_CHARACTER).withParser(mockParser));
92      }
93  
94      @Test
95      public void withLineEnd() throws IllegalAccessException {
96          CSVWriterBuilder newBuilder = builder.withLineEnd(ICSVParser.NEWLINE);
97          assertSame(builder, newBuilder);
98          Field lineEndField = FieldUtils.getDeclaredField(builder.getClass(), "lineEnd", true);
99          assertEquals(ICSVParser.NEWLINE, lineEndField.get(builder));
100     }
101 
102     @Test
103     public void buildWillProduceCSVWriterByDefault() throws IllegalAccessException {
104         ICSVWriter csvWriter = builder.build();
105         assertTrue(csvWriter instanceof CSVWriter);
106         assertSame(writer, FieldUtils.readField(csvWriter, "writer", true));
107         assertEquals(ICSVWriter.DEFAULT_SEPARATOR, FieldUtils.readField(csvWriter, "separator", true));
108         assertEquals(ICSVWriter.DEFAULT_QUOTE_CHARACTER, FieldUtils.readField(csvWriter, "quotechar", true));
109         assertEquals(ICSVWriter.DEFAULT_ESCAPE_CHARACTER, FieldUtils.readField(csvWriter, "escapechar", true));
110         assertEquals(ICSVWriter.DEFAULT_LINE_END, FieldUtils.readField(csvWriter, "lineEnd", true));
111     }
112 
113     @Test
114     public void buildCSVParserWithValues() throws IllegalAccessException {
115         ICSVWriter csvWriter = builder
116                 .withEscapeChar('a')
117                 .withQuoteChar('b')
118                 .withSeparator('c')
119                 .withLineEnd("Stop")
120                 .build();
121         assertTrue(csvWriter instanceof CSVWriter);
122         assertSame(writer, FieldUtils.readField(csvWriter, "writer", true));
123         assertEquals('c', FieldUtils.readField(csvWriter, "separator", true));
124         assertEquals('b', FieldUtils.readField(csvWriter, "quotechar", true));
125         assertEquals('a', FieldUtils.readField(csvWriter, "escapechar", true));
126         assertEquals("Stop", FieldUtils.readField(csvWriter, "lineEnd", true));
127     }
128 
129     @Test
130     public void buildWillProduceCSVParserWriterIfParserIsSupplied() throws IllegalAccessException {
131         ICSVWriter csvWriter = builder
132                 .withParser(mockParser)
133                 .withLineEnd("Stop")
134                 .build();
135         assertTrue(csvWriter instanceof CSVParserWriter);
136         assertSame(writer, FieldUtils.readField(csvWriter, "writer", true));
137         assertSame(mockParser, FieldUtils.readField(csvWriter, "parser", true));
138         assertEquals("Stop", FieldUtils.readField(csvWriter, "lineEnd", true));
139     }
140 
141     @Test
142     public void buildWithResultSetHelpler() {
143         ResultSetHelper mockHelper = mock(ResultSetHelper.class);
144         CSVWriter csvWriter = (CSVWriter) builder
145                 .withResultSetHelper(mockHelper)
146                 .build();
147         assertSame(mockHelper, csvWriter.resultService());
148     }
149 
150     @Test
151     public void buildWithParserResultSetHelper() {
152         ResultSetHelper mockHelper = mock(ResultSetHelper.class);
153         AbstractCSVWriter csvWriter = (AbstractCSVWriter) builder
154                 .withParser(mockParser)
155                 .withResultSetHelper(mockHelper)
156                 .build();
157         assertSame(mockHelper, csvWriter.resultService());
158     }
159 }