View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.io;
18  
19  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertThrows;
22  
23  import java.io.OutputStream;
24  import java.io.OutputStreamWriter;
25  import java.io.Writer;
26  import java.nio.charset.StandardCharsets;
27  import java.util.Arrays;
28  import java.util.List;
29  
30  import org.apache.commons.io.output.ByteArrayOutputStream;
31  import org.apache.commons.io.test.TestUtils;
32  import org.apache.commons.io.test.ThrowOnFlushAndCloseOutputStream;
33  import org.junit.jupiter.api.Test;
34  
35  /**
36   * Tests IOUtils write methods.
37   *
38   * @see IOUtils
39   */
40  @SuppressWarnings("deprecation") // includes tests for deprecated methods
41  public class IOUtilsWriteTest {
42  
43      private static final int FILE_SIZE = 1024 * 4 + 1;
44  
45      private final byte[] inData = TestUtils.generateTestData(FILE_SIZE);
46  
47      @Test
48      public void testWrite_byteArrayToOutputStream() throws Exception {
49          final ByteArrayOutputStream baout = new ByteArrayOutputStream();
50          final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
51  
52          IOUtils.write(inData, out);
53          out.off();
54          out.flush();
55  
56          assertEquals(inData.length, baout.size(), "Sizes differ");
57          assertArrayEquals(inData, baout.toByteArray(), "Content differs");
58      }
59  
60      @Test
61      public void testWrite_byteArrayToOutputStream_nullData() throws Exception {
62          final ByteArrayOutputStream baout = new ByteArrayOutputStream();
63          final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
64  
65          IOUtils.write((byte[]) null, out);
66          out.off();
67          out.flush();
68  
69          assertEquals(0, baout.size(), "Sizes differ");
70      }
71  
72      @Test
73      public void testWrite_byteArrayToOutputStream_nullStream() throws Exception {
74          assertThrows(NullPointerException.class, () -> IOUtils.write(inData, (OutputStream) null));
75      }
76  
77      @Test
78      public void testWrite_byteArrayToWriter() throws Exception {
79          final ByteArrayOutputStream baout = new ByteArrayOutputStream();
80          @SuppressWarnings("resource") // deliberately not closed
81          final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
82          final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
83  
84          IOUtils.write(inData, writer);
85          out.off();
86          writer.flush();
87  
88          assertEquals(inData.length, baout.size(), "Sizes differ");
89          assertArrayEquals(inData, baout.toByteArray(), "Content differs");
90      }
91  
92      @Test
93      public void testWrite_byteArrayToWriter_Encoding() throws Exception {
94          final ByteArrayOutputStream baout = new ByteArrayOutputStream();
95          @SuppressWarnings("resource") // deliberately not closed
96          final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
97          final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
98  
99          IOUtils.write(inData, writer, "UTF8");
100         out.off();
101         writer.flush();
102 
103         byte[] bytes = baout.toByteArray();
104         bytes = new String(bytes, StandardCharsets.UTF_8).getBytes(StandardCharsets.US_ASCII);
105         assertArrayEquals(inData, bytes, "Content differs");
106     }
107 
108     @Test
109     public void testWrite_byteArrayToWriter_Encoding_nullData() throws Exception {
110         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
111         @SuppressWarnings("resource") // deliberately not closed
112         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
113         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
114 
115         IOUtils.write(null, writer, "UTF8");
116         out.off();
117         writer.flush();
118 
119         assertEquals(0, baout.size(), "Sizes differ");
120     }
121 
122     @Test
123     public void testWrite_byteArrayToWriter_Encoding_nullEncoding() throws Exception {
124         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
125         @SuppressWarnings("resource") // deliberately not closed
126         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
127         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
128 
129         IOUtils.write(inData, writer, (String) null);
130         out.off();
131         writer.flush();
132 
133         assertEquals(inData.length, baout.size(), "Sizes differ");
134         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
135     }
136 
137     @Test
138     public void testWrite_byteArrayToWriter_Encoding_nullWriter() throws Exception {
139         assertThrows(NullPointerException.class, () -> IOUtils.write(inData, null, "UTF8"));
140     }
141 
142     @Test
143     public void testWrite_byteArrayToWriter_nullData() throws Exception {
144         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
145         @SuppressWarnings("resource") // deliberately not closed
146         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
147         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
148 
149         IOUtils.write((byte[]) null, writer);
150         out.off();
151         writer.flush();
152 
153         assertEquals(0, baout.size(), "Sizes differ");
154     }
155 
156     @Test
157     public void testWrite_byteArrayToWriter_nullWriter() throws Exception {
158         assertThrows(NullPointerException.class, () -> IOUtils.write(inData, (Writer) null));
159     }
160 
161     @Test
162     public void testWrite_charArrayToOutputStream() throws Exception {
163         final String str = new String(inData, StandardCharsets.US_ASCII);
164 
165         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
166         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
167 
168         IOUtils.write(str.toCharArray(), out);
169         out.off();
170         out.flush();
171 
172         assertEquals(inData.length, baout.size(), "Sizes differ");
173         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
174     }
175 
176     @Test
177     public void testWrite_charArrayToOutputStream_Encoding() throws Exception {
178         final String str = new String(inData, StandardCharsets.US_ASCII);
179 
180         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
181         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
182 
183         IOUtils.write(str.toCharArray(), out, "UTF16");
184         out.off();
185         out.flush();
186 
187         byte[] bytes = baout.toByteArray();
188         bytes = new String(bytes, StandardCharsets.UTF_16).getBytes(StandardCharsets.US_ASCII);
189         assertArrayEquals(inData, bytes, "Content differs");
190     }
191 
192     @Test
193     public void testWrite_charArrayToOutputStream_Encoding_nullData() throws Exception {
194         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
195         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
196 
197         IOUtils.write((char[]) null, out);
198         out.off();
199         out.flush();
200 
201         assertEquals(0, baout.size(), "Sizes differ");
202     }
203 
204     @Test
205     public void testWrite_charArrayToOutputStream_Encoding_nullStream() throws Exception {
206         final String str = new String(inData, StandardCharsets.US_ASCII);
207         assertThrows(NullPointerException.class, () -> IOUtils.write(str.toCharArray(), (OutputStream) null));
208     }
209 
210     @Test
211     public void testWrite_charArrayToOutputStream_nullData() throws Exception {
212         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
213         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
214 
215         IOUtils.write((char[]) null, out);
216         out.off();
217         out.flush();
218 
219         assertEquals(0, baout.size(), "Sizes differ");
220     }
221 
222     @Test
223     public void testWrite_charArrayToOutputStream_nullEncoding() throws Exception {
224         final String str = new String(inData, StandardCharsets.US_ASCII);
225 
226         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
227         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
228 
229         IOUtils.write(str.toCharArray(), out, (String) null);
230         out.off();
231         out.flush();
232 
233         assertEquals(inData.length, baout.size(), "Sizes differ");
234         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
235     }
236 
237     @Test
238     public void testWrite_charArrayToOutputStream_nullStream() throws Exception {
239         final String str = new String(inData, StandardCharsets.US_ASCII);
240         assertThrows(NullPointerException.class, () -> IOUtils.write(str.toCharArray(), (OutputStream) null));
241     }
242 
243     @Test
244     public void testWrite_charArrayToWriter() throws Exception {
245         final String str = new String(inData, StandardCharsets.US_ASCII);
246 
247         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
248         @SuppressWarnings("resource") // deliberately not closed
249         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
250         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
251 
252         IOUtils.write(str.toCharArray(), writer);
253         out.off();
254         writer.flush();
255 
256         assertEquals(inData.length, baout.size(), "Sizes differ");
257         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
258     }
259 
260     @Test
261     public void testWrite_charArrayToWriter_Encoding_nullData() throws Exception {
262         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
263         @SuppressWarnings("resource") // deliberately not closed
264         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
265         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
266 
267         IOUtils.write((char[]) null, writer);
268         out.off();
269         writer.flush();
270 
271         assertEquals(0, baout.size(), "Sizes differ");
272     }
273 
274     @Test
275     public void testWrite_charArrayToWriter_Encoding_nullStream() throws Exception {
276         final String str = new String(inData, StandardCharsets.US_ASCII);
277         assertThrows(NullPointerException.class, () -> IOUtils.write(str.toCharArray(), (Writer) null));
278     }
279 
280     @Test
281     public void testWrite_charSequenceToOutputStream() throws Exception {
282         final CharSequence csq = new StringBuilder(new String(inData, StandardCharsets.US_ASCII));
283 
284         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
285         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
286 
287         IOUtils.write(csq, out);
288         out.off();
289         out.flush();
290 
291         assertEquals(inData.length, baout.size(), "Sizes differ");
292         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
293     }
294 
295     @Test
296     public void testWrite_charSequenceToOutputStream_Encoding() throws Exception {
297         final CharSequence csq = new StringBuilder(new String(inData, StandardCharsets.US_ASCII));
298 
299         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
300         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
301 
302         IOUtils.write(csq, out, "UTF16");
303         out.off();
304         out.flush();
305 
306         byte[] bytes = baout.toByteArray();
307         bytes = new String(bytes, StandardCharsets.UTF_16).getBytes(StandardCharsets.US_ASCII);
308         assertArrayEquals(inData, bytes, "Content differs");
309     }
310 
311     @Test
312     public void testWrite_charSequenceToOutputStream_Encoding_nullData() throws Exception {
313         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
314         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
315 
316         IOUtils.write((CharSequence) null, out);
317         out.off();
318         out.flush();
319 
320         assertEquals(0, baout.size(), "Sizes differ");
321     }
322 
323     @Test
324     public void testWrite_charSequenceToOutputStream_Encoding_nullStream() throws Exception {
325         final CharSequence csq = new StringBuilder(new String(inData, StandardCharsets.US_ASCII));
326         assertThrows(NullPointerException.class, () -> IOUtils.write(csq, (OutputStream) null));
327     }
328 
329     @Test
330     public void testWrite_charSequenceToOutputStream_nullData() throws Exception {
331         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
332         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
333 
334         IOUtils.write((CharSequence) null, out);
335         out.off();
336         out.flush();
337 
338         assertEquals(0, baout.size(), "Sizes differ");
339     }
340 
341     @Test
342     public void testWrite_charSequenceToOutputStream_nullEncoding() throws Exception {
343         final CharSequence csq = new StringBuilder(new String(inData, StandardCharsets.US_ASCII));
344 
345         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
346         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
347 
348         IOUtils.write(csq, out, (String) null);
349         out.off();
350         out.flush();
351 
352         assertEquals(inData.length, baout.size(), "Sizes differ");
353         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
354     }
355 
356     @Test
357     public void testWrite_charSequenceToOutputStream_nullStream() throws Exception {
358         final CharSequence csq = new StringBuilder(new String(inData, StandardCharsets.US_ASCII));
359         assertThrows(NullPointerException.class, () -> IOUtils.write(csq, (OutputStream) null));
360     }
361 
362     @Test
363     public void testWrite_charSequenceToWriter() throws Exception {
364         final CharSequence csq = new StringBuilder(new String(inData, StandardCharsets.US_ASCII));
365 
366         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
367         @SuppressWarnings("resource") // deliberately not closed
368         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
369         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
370 
371         IOUtils.write(csq, writer);
372         out.off();
373         writer.flush();
374 
375         assertEquals(inData.length, baout.size(), "Sizes differ");
376         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
377     }
378 
379     @Test
380     public void testWrite_charSequenceToWriter_Encoding_nullData() throws Exception {
381         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
382         @SuppressWarnings("resource") // deliberately not closed
383         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
384         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
385 
386         IOUtils.write((CharSequence) null, writer);
387         out.off();
388         writer.flush();
389 
390         assertEquals(0, baout.size(), "Sizes differ");
391     }
392 
393     @Test
394     public void testWrite_charSequenceToWriter_Encoding_nullStream() throws Exception {
395         final CharSequence csq = new StringBuilder(new String(inData, StandardCharsets.US_ASCII));
396         assertThrows(NullPointerException.class, () -> IOUtils.write(csq, (Writer) null));
397     }
398 
399     @Test
400     public void testWrite_stringToOutputStream() throws Exception {
401         final String str = new String(inData, StandardCharsets.US_ASCII);
402 
403         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
404         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
405 
406         IOUtils.write(str, out);
407         out.off();
408         out.flush();
409 
410         assertEquals(inData.length, baout.size(), "Sizes differ");
411         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
412     }
413 
414     @Test
415     public void testWrite_stringToOutputStream_Encoding() throws Exception {
416         final String str = new String(inData, StandardCharsets.US_ASCII);
417 
418         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
419         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
420 
421         IOUtils.write(str, out, "UTF16");
422         out.off();
423         out.flush();
424 
425         byte[] bytes = baout.toByteArray();
426         bytes = new String(bytes, StandardCharsets.UTF_16).getBytes(StandardCharsets.US_ASCII);
427         assertArrayEquals(inData, bytes, "Content differs");
428     }
429 
430     @Test
431     public void testWrite_stringToOutputStream_Encoding_nullData() throws Exception {
432         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
433         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
434 
435         IOUtils.write((String) null, out);
436         out.off();
437         out.flush();
438 
439         assertEquals(0, baout.size(), "Sizes differ");
440     }
441 
442     @Test
443     public void testWrite_stringToOutputStream_Encoding_nullStream() throws Exception {
444         final String str = new String(inData, StandardCharsets.US_ASCII);
445         assertThrows(NullPointerException.class, () -> IOUtils.write(str, (OutputStream) null));
446     }
447 
448     @Test
449     public void testWrite_stringToOutputStream_nullData() throws Exception {
450         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
451         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
452 
453         IOUtils.write((String) null, out);
454         out.off();
455         out.flush();
456 
457         assertEquals(0, baout.size(), "Sizes differ");
458     }
459 
460     @Test
461     public void testWrite_stringToOutputStream_nullEncoding() throws Exception {
462         final String str = new String(inData, StandardCharsets.US_ASCII);
463 
464         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
465         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
466 
467         IOUtils.write(str, out, (String) null);
468         out.off();
469         out.flush();
470 
471         assertEquals(inData.length, baout.size(), "Sizes differ");
472         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
473     }
474 
475     @Test
476     public void testWrite_stringToOutputStream_nullStream() throws Exception {
477         final String str = new String(inData, StandardCharsets.US_ASCII);
478         assertThrows(NullPointerException.class, () -> IOUtils.write(str, (OutputStream) null));
479     }
480 
481     @Test
482     public void testWrite_stringToWriter() throws Exception {
483         final String str = new String(inData, StandardCharsets.US_ASCII);
484 
485         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
486         @SuppressWarnings("resource") // deliberately not closed
487         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
488         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
489 
490         IOUtils.write(str, writer);
491         out.off();
492         writer.flush();
493 
494         assertEquals(inData.length, baout.size(), "Sizes differ");
495         assertArrayEquals(inData, baout.toByteArray(), "Content differs");
496     }
497 
498     @Test
499     public void testWrite_stringToWriter_Encoding_nullData() throws Exception {
500         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
501         @SuppressWarnings("resource") // deliberately not closed
502         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
503         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
504 
505         IOUtils.write((String) null, writer);
506         out.off();
507         writer.flush();
508 
509         assertEquals(0, baout.size(), "Sizes differ");
510     }
511 
512     @Test
513     public void testWrite_stringToWriter_Encoding_nullStream() throws Exception {
514         final String str = new String(inData, StandardCharsets.US_ASCII);
515         assertThrows(NullPointerException.class, () -> IOUtils.write(str, (Writer) null));
516     }
517 
518     @Test
519     public void testWriteLines_OutputStream() throws Exception {
520         final Object[] data = {
521                 "hello", new StringBuffer("world"), "", "this is", null, "some text"};
522         final List<Object> list = Arrays.asList(data);
523 
524         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
525         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, false, true);
526 
527         IOUtils.writeLines(list, "*", out);
528 
529         out.off();
530         out.flush();
531 
532         final String expected = "hello*world**this is**some text*";
533         final String actual = baout.toString();
534         assertEquals(expected, actual);
535     }
536 
537     @Test
538     public void testWriteLines_OutputStream_Encoding() throws Exception {
539         final Object[] data = {
540                 "hello\u8364", new StringBuffer("world"), "", "this is", null, "some text"};
541         final List<Object> list = Arrays.asList(data);
542 
543         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
544         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, false, true);
545 
546         IOUtils.writeLines(list, "*", out, StandardCharsets.UTF_8.name());
547 
548         out.off();
549         out.flush();
550 
551         final String expected = "hello\u8364*world**this is**some text*";
552         final String actual = baout.toString(StandardCharsets.UTF_8.name());
553         assertEquals(expected, actual);
554     }
555 
556     @Test
557     public void testWriteLines_OutputStream_Encoding_nullData() throws Exception {
558         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
559         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, false, true);
560 
561         IOUtils.writeLines(null, "*", out, StandardCharsets.US_ASCII.name());
562         out.off();
563         out.flush();
564 
565         assertEquals(0, baout.size(), "Sizes differ");
566     }
567 
568     @Test
569     public void testWriteLines_OutputStream_Encoding_nullEncoding() throws Exception {
570         final Object[] data = {
571                 "hello", new StringBuffer("world"), "", "this is", null, "some text"};
572         final List<Object> list = Arrays.asList(data);
573 
574         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
575         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, false, true);
576 
577         IOUtils.writeLines(list, "*", out, (String) null);
578 
579         out.off();
580         out.flush();
581 
582         final String expected = "hello*world**this is**some text*";
583         final String actual = baout.toString();
584         assertEquals(expected, actual);
585     }
586 
587     @Test
588     public void testWriteLines_OutputStream_Encoding_nullSeparator() throws Exception {
589         final Object[] data = {"hello", "world"};
590         final List<Object> list = Arrays.asList(data);
591 
592         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
593         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, false, true);
594 
595         IOUtils.writeLines(list, null, out, StandardCharsets.US_ASCII.name());
596         out.off();
597         out.flush();
598 
599         final String expected = "hello" + System.lineSeparator() + "world" + System.lineSeparator();
600         final String actual = baout.toString();
601         assertEquals(expected, actual);
602     }
603 
604     @Test
605     public void testWriteLines_OutputStream_Encoding_nullStream() throws Exception {
606         final Object[] data = { "hello", "world" };
607         final List<Object> list = Arrays.asList(data);
608         assertThrows(NullPointerException.class, () -> IOUtils.writeLines(list, "*", null, StandardCharsets.US_ASCII.name()));
609     }
610 
611     @Test
612     public void testWriteLines_OutputStream_nullData() throws Exception {
613         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
614         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, false, true);
615 
616         IOUtils.writeLines(null, "*", out);
617         out.off();
618         out.flush();
619 
620         assertEquals(0, baout.size(), "Sizes differ");
621     }
622 
623     @Test
624     public void testWriteLines_OutputStream_nullSeparator() throws Exception {
625         final Object[] data = {"hello", "world"};
626         final List<Object> list = Arrays.asList(data);
627 
628         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
629         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, false, true);
630 
631         IOUtils.writeLines(list, null, out);
632         out.off();
633         out.flush();
634 
635         final String expected = "hello" + System.lineSeparator() + "world" + System.lineSeparator();
636         final String actual = baout.toString();
637         assertEquals(expected, actual);
638     }
639 
640     @Test
641     public void testWriteLines_OutputStream_nullStream() throws Exception {
642         final Object[] data = {"hello", "world"};
643         final List<Object> list = Arrays.asList(data);
644         assertThrows(NullPointerException.class, () -> IOUtils.writeLines(list, "*", (OutputStream) null));
645     }
646 
647     @Test
648     public void testWriteLines_Writer() throws Exception {
649         final Object[] data = {
650                 "hello", new StringBuffer("world"), "", "this is", null, "some text"};
651         final List<Object> list = Arrays.asList(data);
652 
653         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
654         @SuppressWarnings("resource") // deliberately not closed
655         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
656         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
657 
658         IOUtils.writeLines(list, "*", writer);
659 
660         out.off();
661         writer.flush();
662 
663         final String expected = "hello*world**this is**some text*";
664         final String actual = baout.toString();
665         assertEquals(expected, actual);
666     }
667 
668     @Test
669     public void testWriteLines_Writer_nullData() throws Exception {
670         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
671         @SuppressWarnings("resource") // deliberately not closed
672         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
673         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
674 
675         IOUtils.writeLines(null, "*", writer);
676         out.off();
677         writer.flush();
678 
679         assertEquals(0, baout.size(), "Sizes differ");
680     }
681 
682     @Test
683     public void testWriteLines_Writer_nullSeparator() throws Exception {
684         final Object[] data = {"hello", "world"};
685         final List<Object> list = Arrays.asList(data);
686 
687         final ByteArrayOutputStream baout = new ByteArrayOutputStream();
688         @SuppressWarnings("resource") // deliberately not closed
689         final ThrowOnFlushAndCloseOutputStream out = new ThrowOnFlushAndCloseOutputStream(baout, true, true);
690         final Writer writer = new OutputStreamWriter(baout, StandardCharsets.US_ASCII);
691 
692         IOUtils.writeLines(list, null, writer);
693         out.off();
694         writer.flush();
695 
696         final String expected = "hello" + System.lineSeparator() + "world" + System.lineSeparator();
697         final String actual = baout.toString();
698         assertEquals(expected, actual);
699     }
700 
701     @Test
702     public void testWriteLines_Writer_nullStream() throws Exception {
703         final Object[] data = {"hello", "world"};
704         final List<Object> list = Arrays.asList(data);
705         assertThrows(NullPointerException.class, () -> IOUtils.writeLines(list, "*", (Writer) null));
706     }
707 
708 }