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 }