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.assertEquals;
19  import static org.supercsv.SuperCsvTestUtils.HEADER;
20  import static org.supercsv.SuperCsvTestUtils.HEADER_CSV;
21  
22  import java.io.IOException;
23  import java.io.StringWriter;
24  import java.io.Writer;
25  
26  import org.junit.After;
27  import org.junit.Before;
28  import org.junit.Test;
29  import org.supercsv.prefs.CsvPreference;
30  
31  
32  
33  
34  
35  
36  
37  public class AbstractCsvWriterTest {
38  	
39  	private static final CsvPreference PREFS = CsvPreference.STANDARD_PREFERENCE;
40  	private static final CsvPreference SURROUNDING_SPACES_REQUIRE_QUOTES_PREFS = new CsvPreference.Builder(
41  		CsvPreference.STANDARD_PREFERENCE).surroundingSpacesNeedQuotes(true).build();
42  	
43  	private Writer writer;
44  	
45  	private AbstractCsvWriter abstractWriter;
46  	private AbstractCsvWriter surroundingSpacesNeedQuotesAbstractWriter;
47  	
48  	
49  
50  
51  	static class MockCsvWriter extends AbstractCsvWriter {
52  		
53  		private CsvPreference preference;
54  		
55  		public MockCsvWriter(Writer writer, CsvPreference preference) {
56  			super(writer, preference);
57  			this.preference = preference;
58  		}
59  	}
60  	
61  	
62  
63  
64  	@Before
65  	public void setUp() {
66  		writer = new StringWriter();
67  		abstractWriter = new MockCsvWriter(writer, PREFS);
68  		surroundingSpacesNeedQuotesAbstractWriter = new MockCsvWriter(writer, SURROUNDING_SPACES_REQUIRE_QUOTES_PREFS);
69  	}
70  	
71  	
72  
73  
74  	@After
75  	public void tearDown() throws IOException {
76  		abstractWriter.close();
77  		surroundingSpacesNeedQuotesAbstractWriter.close();
78  	}
79  	
80  	
81  
82  
83  	@Test
84  	public void testWriteHeader() throws IOException {
85  		assertEquals(0, abstractWriter.getLineNumber());
86  		assertEquals(0, abstractWriter.getRowNumber());
87  		
88  		abstractWriter.writeHeader(HEADER);
89  		
90  		assertEquals(1, abstractWriter.getLineNumber());
91  		assertEquals(1, abstractWriter.getRowNumber());
92  		
93  		abstractWriter.flush();
94  		assertEquals(HEADER_CSV + "\r\n", writer.toString());
95  	}
96  	
97  	
98  
99  
100 	@Test
101 	public void testWriteComment() throws IOException {
102 		assertEquals(0, abstractWriter.getLineNumber());
103 		assertEquals(0, abstractWriter.getRowNumber());
104 		
105 		final String comment = "#this is a comment";
106 		abstractWriter.writeComment(comment);
107 		assertEquals(1, abstractWriter.getLineNumber());
108 		assertEquals(0, abstractWriter.getRowNumber());
109 		
110 		final String header = "this,is,the,header";
111 		abstractWriter.writeHeader(header.split(","));
112 		assertEquals(2, abstractWriter.getLineNumber());
113 		assertEquals(1, abstractWriter.getRowNumber());
114 		
115 		abstractWriter.writeComment(comment);
116 		assertEquals(3, abstractWriter.getLineNumber());
117 		assertEquals(1, abstractWriter.getRowNumber());
118 		
119 		abstractWriter.writeHeader(header.split(","));
120 		assertEquals(4, abstractWriter.getLineNumber());
121 		assertEquals(2, abstractWriter.getRowNumber());
122 		
123 		abstractWriter.flush();
124 		final String eol = PREFS.getEndOfLineSymbols();
125 		final String expected = comment + eol + header + eol + comment + eol + header + eol;
126 		assertEquals(expected, writer.toString());
127 	}
128 	
129 	
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 	private void writeHeaderWithEmbeddedEndOfLineSymbols(final MockCsvWriter csvWriter) throws IOException {
141 		
142 		final String eolSymbols = csvWriter.preference.getEndOfLineSymbols();
143 		
144 		final String textWithNewline = "text that\nspans\nthree lines";
145 		final String textWithCarriageReturn = "text that\rspans\rthree lines";
146 		final String textWithCarriageAndNewline = "text that\r\nspans\r\nthree lines";
147 		
148 		final String expected = "\"text that" + eolSymbols + "spans" + eolSymbols + "three lines\"" + eolSymbols;
149 		
150 		
151 		csvWriter.writeHeader(textWithNewline);
152 		csvWriter.flush();
153 		assertEquals(expected, writer.toString());
154 		assertEquals(3, csvWriter.getLineNumber());
155 		assertEquals(1, csvWriter.getRowNumber());
156 		
157 		
158 		csvWriter.writeHeader(textWithCarriageReturn);
159 		csvWriter.flush();
160 		assertEquals(expected + expected, writer.toString());
161 		assertEquals(6, csvWriter.getLineNumber());
162 		assertEquals(2, csvWriter.getRowNumber());
163 		
164 		
165 		csvWriter.writeHeader(textWithCarriageAndNewline);
166 		csvWriter.flush();
167 		assertEquals(expected + expected + expected, writer.toString());
168 		assertEquals(9, csvWriter.getLineNumber());
169 		assertEquals(3, csvWriter.getRowNumber());
170 		
171 		
172 		csvWriter.writeHeader("\r\n\n");
173 		csvWriter.flush();
174 		assertEquals(expected + expected + expected + "\"" + eolSymbols + eolSymbols + "\"" + eolSymbols,
175 			writer.toString());
176 		assertEquals(12, csvWriter.getLineNumber());
177 		assertEquals(4, csvWriter.getRowNumber());
178 		
179 		csvWriter.close();
180 	}
181 	
182 	
183 
184 
185 	@Test
186 	public void testWriteHeaderWithCarriageReturnNewline() throws IOException {
187 		writeHeaderWithEmbeddedEndOfLineSymbols(new MockCsvWriter(writer, CsvPreference.STANDARD_PREFERENCE));
188 	}
189 	
190 	
191 
192 
193 	@Test
194 	public void testWriteHeaderWithNewline() throws IOException {
195 		writeHeaderWithEmbeddedEndOfLineSymbols(new MockCsvWriter(writer, CsvPreference.EXCEL_PREFERENCE));
196 	}
197 	
198 	
199 
200 
201 	@Test
202 	public void testWriteHeaderWithCarriageReturn() throws IOException {
203 		writeHeaderWithEmbeddedEndOfLineSymbols(new MockCsvWriter(writer,
204 			new CsvPreference.Builder('"', ',', "\r").build()));
205 	}
206 	
207 	
208 
209 
210 	@Test(expected = NullPointerException.class)
211 	public void writeCommentWithNull() throws IOException {
212 		abstractWriter.writeComment(null);
213 	}
214 	
215 	
216 
217 
218 	@Test(expected = NullPointerException.class)
219 	public void writeHeaderWithNull() throws IOException {
220 		abstractWriter.writeHeader((String[]) null);
221 	}
222 	
223 	
224 
225 
226 	@Test(expected = IllegalArgumentException.class)
227 	public void writeHeaderWithEmptyArray() throws IOException {
228 		abstractWriter.writeHeader(new String[] {});
229 	}
230 	
231 	
232 
233 
234 	@SuppressWarnings("resource")
235 	@Test(expected = NullPointerException.class)
236 	public void testConstructorWithNullWriter() {
237 		new MockCsvWriter(null, PREFS);
238 	}
239 	
240 	
241 
242 
243 	@SuppressWarnings("resource")
244 	@Test(expected = NullPointerException.class)
245 	public void testConstructorWithNullPreferences() {
246 		new MockCsvWriter(writer, null);
247 	}
248 }