From 920c9497cb7dfa82648c28dc5ab9a05f2dd63bb8 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Thu, 10 Oct 2024 17:52:49 -0400 Subject: [PATCH] [CSV-313] Add CSVPrinter.getRecordCount() --- src/changes/changes.xml | 3 +- .../org/apache/commons/csv/CSVPrinter.java | 34 ++++- .../apache/commons/csv/CSVPrinterTest.java | 142 ++++++++++++++---- 3 files changed, 148 insertions(+), 31 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 8b1645ce..48a1f771 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -40,9 +40,10 @@ Apache Commons CSV Release Notes - + + Add CSVPrinter.getRecordCount(). Bump org.apache.commons:commons-parent from 76 to 77 #486. diff --git a/src/main/java/org/apache/commons/csv/CSVPrinter.java b/src/main/java/org/apache/commons/csv/CSVPrinter.java index 77ae61a8..09db126c 100644 --- a/src/main/java/org/apache/commons/csv/CSVPrinter.java +++ b/src/main/java/org/apache/commons/csv/CSVPrinter.java @@ -83,6 +83,8 @@ public final class CSVPrinter implements Flushable, Closeable { /** True if we just began a new record. */ private boolean newRecord = true; + private long recordCount; + /** * Creates a printer that will print values to the given stream following the CSVFormat. *

@@ -140,6 +142,17 @@ public final class CSVPrinter implements Flushable, Closeable { } } + /** + * Outputs the record separator and increments the record count. + * + * @throws IOException + * If an I/O error occurs + */ + private synchronized void endOfRecord() throws IOException { + println(); + recordCount++; + } + /** * Flushes the underlying stream. * @@ -162,6 +175,16 @@ public final class CSVPrinter implements Flushable, Closeable { return this.appendable; } + /** + * Gets the record count printed, this does not include comments or headers. + * + * @return the record count, this does not include comments or headers. + * @since 1.13.0 + */ + public long getRecordCount() { + return recordCount; + } + /** * Prints the string as the next value on the line. The value will be escaped or encapsulated as needed. * @@ -235,7 +258,10 @@ public final class CSVPrinter implements Flushable, Closeable { * @since 1.9.0 */ public synchronized void printHeaders(final ResultSet resultSet) throws IOException, SQLException { - printRecord((Object[]) format.builder().setHeader(resultSet).build().getHeader()); + try (IOStream stream = IOStream.of(format.builder().setHeader(resultSet).build().getHeader())) { + stream.forEachOrdered(this::print); + } + println(); } /** @@ -265,7 +291,7 @@ public final class CSVPrinter implements Flushable, Closeable { @SuppressWarnings("resource") public synchronized void printRecord(final Iterable values) throws IOException { IOStream.of(values).forEachOrdered(this::print); - println(); + endOfRecord(); } /** @@ -302,7 +328,7 @@ public final class CSVPrinter implements Flushable, Closeable { @SuppressWarnings("resource") // caller closes. public synchronized void printRecord(final Stream values) throws IOException { IOStream.adapt(values).forEachOrdered(this::print); - println(); + endOfRecord(); } private void printRecordObject(final Object value) throws IOException { @@ -426,7 +452,7 @@ public final class CSVPrinter implements Flushable, Closeable { print(object); } } - println(); + endOfRecord(); } } diff --git a/src/test/java/org/apache/commons/csv/CSVPrinterTest.java b/src/test/java/org/apache/commons/csv/CSVPrinterTest.java index ce938073..2bd318ca 100644 --- a/src/test/java/org/apache/commons/csv/CSVPrinterTest.java +++ b/src/test/java/org/apache/commons/csv/CSVPrinterTest.java @@ -73,6 +73,7 @@ import org.junit.jupiter.api.Test; */ public class CSVPrinterTest { + private static final int TABLE_RECORD_COUNT = 2; private static final char DQUOTE_CHAR = '"'; private static final char EURO_CH = '\u20AC'; private static final int ITERATIONS_FOR_RANDOM_TEST = 50000; @@ -95,6 +96,10 @@ public class CSVPrinterTest { private final String recordSeparator = CSVFormat.DEFAULT.getRecordSeparator(); + private void assertInitialState(final CSVPrinter printer) { + assertEquals(0, printer.getRecordCount()); + } + private File createTempFile() throws IOException { return createTempPath().toFile(); } @@ -181,16 +186,15 @@ public class CSVPrinterTest { .setHeader("Col1", "Col2") .build(); // @formatter:on - final CSVPrinter csvPrinter = format.print(sw); - csvPrinter.printRecord("A", "B"); - csvPrinter.printRecord("C", "D"); - csvPrinter.close(); - return csvPrinter; + final CSVPrinter printer = format.print(sw); + printer.printRecord("A", "B"); + printer.printRecord("C", "D"); + printer.close(); + return printer; } private String randStr() { final Random r = new Random(); - final int sz = r.nextInt(20); // sz = r.nextInt(3); final char[] buf = new char[sz]; @@ -252,8 +256,8 @@ public class CSVPrinterTest { public void testCloseBackwardCompatibility() throws IOException { try (final Writer writer = mock(Writer.class)) { final CSVFormat csvFormat = CSVFormat.DEFAULT; - try (CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat)) { - // empty + try (CSVPrinter printer = new CSVPrinter(writer, csvFormat)) { + assertInitialState(printer); } verify(writer, never()).flush(); verify(writer, times(1)).close(); @@ -264,8 +268,8 @@ public class CSVPrinterTest { public void testCloseWithCsvFormatAutoFlushOff() throws IOException { try (final Writer writer = mock(Writer.class)) { final CSVFormat csvFormat = CSVFormat.DEFAULT.withAutoFlush(false); - try (CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat)) { - // empty + try (CSVPrinter printer = new CSVPrinter(writer, csvFormat)) { + assertInitialState(printer); } verify(writer, never()).flush(); verify(writer, times(1)).close(); @@ -277,8 +281,8 @@ public class CSVPrinterTest { // System.out.println("start method"); try (final Writer writer = mock(Writer.class)) { final CSVFormat csvFormat = CSVFormat.DEFAULT.withAutoFlush(true); - try (CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat)) { - // empty + try (CSVPrinter printer = new CSVPrinter(writer, csvFormat)) { + assertInitialState(printer); } verify(writer, times(1)).flush(); verify(writer, times(1)).close(); @@ -290,8 +294,10 @@ public class CSVPrinterTest { try (final Writer writer = mock(Writer.class)) { final CSVFormat csvFormat = CSVFormat.DEFAULT; @SuppressWarnings("resource") - final CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat); - csvPrinter.close(false); + final CSVPrinter printer = new CSVPrinter(writer, csvFormat); + assertInitialState(printer); + printer.close(false); + assertEquals(0, printer.getRecordCount()); verify(writer, never()).flush(); verify(writer, times(1)).close(); } @@ -301,8 +307,10 @@ public class CSVPrinterTest { public void testCloseWithFlushOn() throws IOException { try (final Writer writer = mock(Writer.class)) { @SuppressWarnings("resource") - final CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT); - csvPrinter.close(true); + final CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT); + assertInitialState(printer); + printer.close(true); + assertEquals(0, printer.getRecordCount()); verify(writer, times(1)).flush(); } } @@ -312,10 +320,13 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); final Object value = "abc"; try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withCommentMarker('#'))) { + assertInitialState(printer); printer.print(value); + assertEquals(0, printer.getRecordCount()); printer.printComment("This is a comment\r\non multiple lines\rthis is next comment\r"); assertEquals("abc" + recordSeparator + "# This is a comment" + recordSeparator + "# on multiple lines" + recordSeparator + "# this is next comment" + recordSeparator + "# " + recordSeparator, sw.toString()); + assertEquals(0, printer.getRecordCount()); } } @@ -347,6 +358,7 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); try (final Reader reader = new FileReader("src/test/resources/org/apache/commons/csv/CSV-259/sample.txt"); final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withEscape('!').withQuote(null))) { + assertInitialState(printer); printer.print(reader); assertEquals("x!,y!,z", sw.toString()); } @@ -356,6 +368,7 @@ public class CSVPrinterTest { public void testDelimeterQuoted() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote('\''))) { + assertInitialState(printer); printer.print("a,b,c"); printer.print("xyz"); assertEquals("'a,b,c',xyz", sw.toString()); @@ -367,6 +380,7 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); final CSVFormat format = CSVFormat.DEFAULT.withEscape('!').withQuoteMode(QuoteMode.NONE); try (final CSVPrinter printer = new CSVPrinter(sw, format)) { + assertInitialState(printer); printer.print("a,b,c"); printer.print("xyz"); assertEquals("a!,b!,c,xyz", sw.toString()); @@ -377,6 +391,7 @@ public class CSVPrinterTest { public void testDelimeterStringQuoted() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.builder().setDelimiter("[|]").setQuote('\'').build())) { + assertInitialState(printer); printer.print("a[|]b[|]c"); printer.print("xyz"); assertEquals("'a[|]b[|]c'[|]xyz", sw.toString()); @@ -388,6 +403,7 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); final CSVFormat format = CSVFormat.DEFAULT.builder().setDelimiter("[|]").setEscape('!').setQuoteMode(QuoteMode.NONE).build(); try (final CSVPrinter printer = new CSVPrinter(sw, format)) { + assertInitialState(printer); printer.print("a[|]b[|]c"); printer.print("xyz"); printer.print("a[xy]bc[]"); @@ -399,6 +415,7 @@ public class CSVPrinterTest { public void testDelimiterEscaped() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withEscape('!').withQuote(null))) { + assertInitialState(printer); printer.print("a,b,c"); printer.print("xyz"); assertEquals("a!,b!,c,xyz", sw.toString()); @@ -409,6 +426,7 @@ public class CSVPrinterTest { public void testDelimiterPlain() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(null))) { + assertInitialState(printer); printer.print("a,b,c"); printer.print("xyz"); assertEquals("a,b,c,xyz", sw.toString()); @@ -419,6 +437,7 @@ public class CSVPrinterTest { public void testDelimiterStringEscaped() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.builder().setDelimiter("|||").setEscape('!').setQuote(null).build())) { + assertInitialState(printer); printer.print("a|||b|||c"); printer.print("xyz"); assertEquals("a!|!|!|b!|!|!|c|||xyz", sw.toString()); @@ -429,8 +448,10 @@ public class CSVPrinterTest { public void testDisabledComment() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printComment("This is a comment"); assertEquals("", sw.toString()); + assertEquals(0, printer.getRecordCount()); } } @@ -438,6 +459,7 @@ public class CSVPrinterTest { public void testDontQuoteEuroFirstChar() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.RFC4180)) { + assertInitialState(printer); printer.printRecord(EURO_CH, "Deux"); assertEquals(EURO_CH + ",Deux" + recordSeparator, sw.toString()); } @@ -447,6 +469,7 @@ public class CSVPrinterTest { public void testEolEscaped() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(null).withEscape('!'))) { + assertInitialState(printer); printer.print("a\rb\nc"); printer.print("x\fy\bz"); assertEquals("a!rb!nc,x\fy\bz", sw.toString()); @@ -457,6 +480,7 @@ public class CSVPrinterTest { public void testEolPlain() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(null))) { + assertInitialState(printer); printer.print("a\rb\nc"); printer.print("x\fy\bz"); assertEquals("a\rb\nc,x\fy\bz", sw.toString()); @@ -467,6 +491,7 @@ public class CSVPrinterTest { public void testEolQuoted() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote('\''))) { + assertInitialState(printer); printer.print("a\rb\nc"); printer.print("x\by\fz"); assertEquals("'a\rb\nc',x\by\fz", sw.toString()); @@ -477,6 +502,7 @@ public class CSVPrinterTest { public void testEscapeBackslash1() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(QUOTE_CH))) { + assertInitialState(printer); printer.print("\\"); } assertEquals("\\", sw.toString()); @@ -486,6 +512,7 @@ public class CSVPrinterTest { public void testEscapeBackslash2() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(QUOTE_CH))) { + assertInitialState(printer); printer.print("\\\r"); } assertEquals("'\\\r'", sw.toString()); @@ -495,6 +522,7 @@ public class CSVPrinterTest { public void testEscapeBackslash3() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(QUOTE_CH))) { + assertInitialState(printer); printer.print("X\\\r"); } assertEquals("'X\\\r'", sw.toString()); @@ -504,6 +532,7 @@ public class CSVPrinterTest { public void testEscapeBackslash4() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(QUOTE_CH))) { + assertInitialState(printer); printer.print("\\\\"); } assertEquals("\\\\", sw.toString()); @@ -513,6 +542,7 @@ public class CSVPrinterTest { public void testEscapeBackslash5() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(QUOTE_CH))) { + assertInitialState(printer); printer.print("\\\\"); } assertEquals("\\\\", sw.toString()); @@ -522,6 +552,7 @@ public class CSVPrinterTest { public void testEscapeNull1() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withEscape(null))) { + assertInitialState(printer); printer.print("\\"); } assertEquals("\\", sw.toString()); @@ -531,6 +562,7 @@ public class CSVPrinterTest { public void testEscapeNull2() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withEscape(null))) { + assertInitialState(printer); printer.print("\\\r"); } assertEquals("\"\\\r\"", sw.toString()); @@ -540,6 +572,7 @@ public class CSVPrinterTest { public void testEscapeNull3() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withEscape(null))) { + assertInitialState(printer); printer.print("X\\\r"); } assertEquals("\"X\\\r\"", sw.toString()); @@ -549,6 +582,7 @@ public class CSVPrinterTest { public void testEscapeNull4() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withEscape(null))) { + assertInitialState(printer); printer.print("\\\\"); } assertEquals("\\\\", sw.toString()); @@ -558,6 +592,7 @@ public class CSVPrinterTest { public void testEscapeNull5() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withEscape(null))) { + assertInitialState(printer); printer.print("\\\\"); } assertEquals("\\\\", sw.toString()); @@ -567,6 +602,7 @@ public class CSVPrinterTest { public void testExcelPrintAllArrayOfArrays() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords((Object[]) new String[][] { { "r1c1", "r1c2" }, { "r2c1", "r2c2" } }); assertEquals("r1c1,r1c2" + recordSeparator + "r2c1,r2c2" + recordSeparator, sw.toString()); } @@ -576,6 +612,7 @@ public class CSVPrinterTest { public void testExcelPrintAllArrayOfArraysWithFirstEmptyValue2() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords((Object[]) new String[][] { { "" } }); assertEquals("\"\"" + recordSeparator, sw.toString()); } @@ -585,6 +622,7 @@ public class CSVPrinterTest { public void testExcelPrintAllArrayOfArraysWithFirstSpaceValue1() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords((Object[]) new String[][] { { " ", "r1c2" } }); assertEquals("\" \",r1c2" + recordSeparator, sw.toString()); } @@ -594,6 +632,7 @@ public class CSVPrinterTest { public void testExcelPrintAllArrayOfArraysWithFirstTabValue1() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords((Object[]) new String[][] { { "\t", "r1c2" } }); assertEquals("\"\t\",r1c2" + recordSeparator, sw.toString()); } @@ -603,6 +642,7 @@ public class CSVPrinterTest { public void testExcelPrintAllArrayOfLists() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords((Object[]) new List[] { Arrays.asList("r1c1", "r1c2"), Arrays.asList("r2c1", "r2c2") }); assertEquals("r1c1,r1c2" + recordSeparator + "r2c1,r2c2" + recordSeparator, sw.toString()); } @@ -612,6 +652,7 @@ public class CSVPrinterTest { public void testExcelPrintAllArrayOfListsWithFirstEmptyValue2() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords((Object[]) new List[] { Arrays.asList("") }); assertEquals("\"\"" + recordSeparator, sw.toString()); } @@ -621,6 +662,7 @@ public class CSVPrinterTest { public void testExcelPrintAllIterableOfArrays() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords(Arrays.asList(new String[][] { { "r1c1", "r1c2" }, { "r2c1", "r2c2" } })); assertEquals("r1c1,r1c2" + recordSeparator + "r2c1,r2c2" + recordSeparator, sw.toString()); } @@ -630,6 +672,7 @@ public class CSVPrinterTest { public void testExcelPrintAllIterableOfArraysWithFirstEmptyValue2() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords(Arrays.asList(new String[][] { { "" } })); assertEquals("\"\"" + recordSeparator, sw.toString()); } @@ -639,6 +682,7 @@ public class CSVPrinterTest { public void testExcelPrintAllIterableOfLists() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords(Arrays.asList(Arrays.asList("r1c1", "r1c2"), Arrays.asList("r2c1", "r2c2"))); assertEquals("r1c1,r1c2" + recordSeparator + "r2c1,r2c2" + recordSeparator, sw.toString()); } @@ -648,6 +692,7 @@ public class CSVPrinterTest { public void testExcelPrintAllStreamOfArrays() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecords(Stream.of(new String[][] { { "r1c1", "r1c2" }, { "r2c1", "r2c2" } })); assertEquals("r1c1,r1c2" + recordSeparator + "r2c1,r2c2" + recordSeparator, sw.toString()); } @@ -657,6 +702,7 @@ public class CSVPrinterTest { public void testExcelPrinter1() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecord("a", "b"); assertEquals("a,b" + recordSeparator, sw.toString()); } @@ -666,6 +712,7 @@ public class CSVPrinterTest { public void testExcelPrinter2() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.EXCEL)) { + assertInitialState(printer); printer.printRecord("a,b", "b"); assertEquals("\"a,b\",b" + recordSeparator, sw.toString()); } @@ -675,6 +722,7 @@ public class CSVPrinterTest { public void testHeader() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(null).withHeader("C1", "C2", "C3"))) { + assertEquals(1, printer.getRecordCount()); printer.printRecord("a", "b", "c"); printer.printRecord("x", "y", "z"); assertEquals("C1,C2,C3\r\na,b,c\r\nx,y,z\r\n", sw.toString()); @@ -705,6 +753,7 @@ public class CSVPrinterTest { public void testHeaderNotSet() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuote(null))) { + assertInitialState(printer); printer.printRecord("a", "b", "c"); printer.printRecord("x", "y", "z"); assertEquals("a,b,c\r\nx,y,z\r\n", sw.toString()); @@ -725,7 +774,9 @@ public class CSVPrinterTest { try (final Statement stmt = connection.createStatement(); final CSVPrinter printer = new CSVPrinter(sw, csvFormat); final ResultSet resultSet = stmt.executeQuery("select ID, NAME, TEXT, BIN_DATA from TEST");) { + assertInitialState(printer); printer.printRecords(resultSet); + assertEquals(TABLE_RECORD_COUNT, printer.getRecordCount()); } } final String csv = sw.toString(); @@ -785,10 +836,12 @@ public class CSVPrinterTest { final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT);) { try (final ResultSet resultSet = stmt.executeQuery("select ID, NAME from TEST")) { printer.printRecords(resultSet, true); + assertEquals(TABLE_RECORD_COUNT, printer.getRecordCount()); assertEquals("ID,NAME" + recordSeparator + "1,r1" + recordSeparator + "2,r2" + recordSeparator, sw.toString()); } try (final ResultSet resultSet = stmt.executeQuery("select ID, NAME from TEST")) { printer.printRecords(resultSet, false); + assertEquals(TABLE_RECORD_COUNT * 2, printer.getRecordCount()); assertNotEquals("ID,NAME" + recordSeparator + "1,r1" + recordSeparator + "2,r2" + recordSeparator, sw.toString()); } } @@ -803,7 +856,10 @@ public class CSVPrinterTest { try (final Statement stmt = connection.createStatement(); final ResultSet resultSet = stmt.executeQuery("select ID, NAME, TEXT from TEST"); final CSVPrinter printer = CSVFormat.DEFAULT.withHeader(resultSet.getMetaData()).print(sw)) { + // The header is the first record. + assertEquals(1, printer.getRecordCount()); printer.printRecords(resultSet); + assertEquals(3, printer.getRecordCount()); assertEquals("ID,NAME,TEXT" + recordSeparator + "1,r1,\"long text 1\"" + recordSeparator + "2,r2,\"" + longText2 + "\"" + recordSeparator, sw.toString()); } @@ -880,6 +936,7 @@ public class CSVPrinterTest { try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.MONGODB_CSV)) { printer.printRecord("a", "b"); assertEquals("a,b" + recordSeparator, sw.toString()); + assertEquals(1, printer.getRecordCount()); } } @@ -889,6 +946,7 @@ public class CSVPrinterTest { try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.MONGODB_CSV)) { printer.printRecord("a,b", "c"); assertEquals("\"a,b\",c" + recordSeparator, sw.toString()); + assertEquals(1, printer.getRecordCount()); } } @@ -898,6 +956,7 @@ public class CSVPrinterTest { try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.MONGODB_CSV)) { printer.printRecord("a \"c\" b", "d"); assertEquals("\"a \"\"c\"\" b\",d" + recordSeparator, sw.toString()); + assertEquals(1, printer.getRecordCount()); } } @@ -907,6 +966,7 @@ public class CSVPrinterTest { try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.MONGODB_CSV)) { printer.printRecord("a\tb", "c"); assertEquals("a\tb,c" + recordSeparator, sw.toString()); + assertEquals(1, printer.getRecordCount()); } } @@ -916,6 +976,7 @@ public class CSVPrinterTest { try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.MONGODB_TSV)) { printer.printRecord("a", "b"); assertEquals("a\tb" + recordSeparator, sw.toString()); + assertEquals(1, printer.getRecordCount()); } } @@ -925,6 +986,7 @@ public class CSVPrinterTest { try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.MONGODB_TSV)) { printer.printRecord("a,b", "c"); assertEquals("a,b\tc" + recordSeparator, sw.toString()); + assertEquals(1, printer.getRecordCount()); } } @@ -942,8 +1004,8 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withCommentMarker('#'))) { printer.printComment("This is a comment\non multiple lines"); - assertEquals("# This is a comment" + recordSeparator + "# on multiple lines" + recordSeparator, sw.toString()); + assertEquals(0, printer.getRecordCount()); } } @@ -1342,6 +1404,7 @@ public class CSVPrinterTest { public void testPrint() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = CSVFormat.DEFAULT.print(sw)) { + assertInitialState(printer); printer.printRecord("a", "b\\c"); assertEquals("a,b\\c" + recordSeparator, sw.toString()); } @@ -1360,6 +1423,7 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = format.print(sw); final CSVParser parser = CSVParser.parse(code, format)) { + assertInitialState(printer); printer.printRecords(parser); } try (final CSVParser parser = CSVParser.parse(sw.toString(), format)) { @@ -1380,11 +1444,15 @@ public class CSVPrinterTest { final String[][] res = { { "a1", "b1" }, { "a2", "b2" }, { "a3", "b3" }, { "a4", "b4" } }; final CSVFormat format = CSVFormat.DEFAULT; final StringWriter sw = new StringWriter(); + int row = 0; try (final CSVPrinter printer = format.print(sw); final CSVParser parser = CSVParser.parse(code, format)) { + assertInitialState(printer); for (final CSVRecord record : parser) { printer.printRecord(record); + assertEquals(++row, printer.getRecordCount()); } + assertEquals(row, printer.getRecordCount()); } try (final CSVParser parser = CSVParser.parse(sw.toString(), format)) { final List records = parser.getRecords(); @@ -1406,6 +1474,7 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = format.print(sw); final CSVParser parser = CSVParser.parse(code, format)) { + assertInitialState(printer); printer.printRecords(parser.getRecords()); } try (final CSVParser parser = CSVParser.parse(sw.toString(), format)) { @@ -1419,6 +1488,7 @@ public class CSVPrinterTest { public void testPrintCustomNullValues() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withNullString("NULL"))) { + assertInitialState(printer); printer.printRecord("a", null, "b"); assertEquals("a,NULL,b" + recordSeparator, sw.toString()); } @@ -1428,7 +1498,9 @@ public class CSVPrinterTest { public void testPrinter1() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a", "b"); + assertEquals(1, printer.getRecordCount()); assertEquals("a,b" + recordSeparator, sw.toString()); } } @@ -1437,6 +1509,7 @@ public class CSVPrinterTest { public void testPrinter2() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a,b", "b"); assertEquals("\"a,b\",b" + recordSeparator, sw.toString()); } @@ -1446,6 +1519,7 @@ public class CSVPrinterTest { public void testPrinter3() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a, b", "b "); assertEquals("\"a, b\",\"b \"" + recordSeparator, sw.toString()); } @@ -1455,6 +1529,7 @@ public class CSVPrinterTest { public void testPrinter4() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a", "b\"c"); assertEquals("a,\"b\"\"c\"" + recordSeparator, sw.toString()); } @@ -1464,6 +1539,7 @@ public class CSVPrinterTest { public void testPrinter5() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a", "b\nc"); assertEquals("a,\"b\nc\"" + recordSeparator, sw.toString()); } @@ -1473,6 +1549,7 @@ public class CSVPrinterTest { public void testPrinter6() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a", "b\r\nc"); assertEquals("a,\"b\r\nc\"" + recordSeparator, sw.toString()); } @@ -1482,6 +1559,7 @@ public class CSVPrinterTest { public void testPrinter7() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a", "b\\c"); assertEquals("a,b\\c" + recordSeparator, sw.toString()); } @@ -1491,6 +1569,7 @@ public class CSVPrinterTest { public void testPrintNullValues() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT)) { + assertInitialState(printer); printer.printRecord("a", null, "b"); assertEquals("a,,b" + recordSeparator, sw.toString()); } @@ -1500,6 +1579,7 @@ public class CSVPrinterTest { public void testPrintOnePositiveInteger() throws IOException { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withQuoteMode(QuoteMode.MINIMAL))) { + assertInitialState(printer); printer.print(Integer.MAX_VALUE); assertEquals(String.valueOf(Integer.MAX_VALUE), sw.toString()); } @@ -1520,6 +1600,7 @@ public class CSVPrinterTest { final StringBuilder sb = new StringBuilder(); final String content = "testValue"; try (final CSVPrinter printer = new CSVPrinter(sb, CSVFormat.DEFAULT.withQuote(null))) { + assertInitialState(printer); final StringReader value = new StringReader(content); printer.print(value); } @@ -1559,8 +1640,10 @@ public class CSVPrinterTest { final StringWriter sw = new StringWriter(); try (final CSVPrinter printer = format.print(sw); final CSVParser parser = CSVParser.parse(code, format)) { + long count = 0; for (final CSVRecord record : parser) { printer.printRecord(record.stream()); + assertEquals(++count, printer.getRecordCount()); } } try (final CSVParser parser = CSVParser.parse(sw.toString(), format)) { @@ -1576,9 +1659,11 @@ public class CSVPrinterTest { final String rowData = StringUtils.join(values, ','); final CharArrayWriter charArrayWriter = new CharArrayWriter(0); try (final CSVParser parser = CSVFormat.DEFAULT.parse(new StringReader(rowData)); - final CSVPrinter csvPrinter = CSVFormat.INFORMIX_UNLOAD.print(charArrayWriter)) { + final CSVPrinter printer = CSVFormat.INFORMIX_UNLOAD.print(charArrayWriter)) { + long count = 0; for (final CSVRecord record : parser) { - csvPrinter.printRecord(record); + printer.printRecord(record); + assertEquals(++count, printer.getRecordCount()); } } assertEquals(6, charArrayWriter.size()); @@ -1590,12 +1675,13 @@ public class CSVPrinterTest { final PrintStream out = System.out; try { System.setOut(new PrintStream(NullOutputStream.INSTANCE)); - try (CSVPrinter csvPrinter = CSVFormat.POSTGRESQL_TEXT.printer()) { + try (CSVPrinter printer = CSVFormat.POSTGRESQL_TEXT.printer()) { final Vector vector = new Vector<>(); final int expectedCapacity = 23; vector.setSize(expectedCapacity); - csvPrinter.printRecords(vector); + printer.printRecords(vector); assertEquals(expectedCapacity, vector.capacity()); + assertEquals(expectedCapacity, printer.getRecordCount()); } } finally { System.setOut(out); @@ -1605,11 +1691,12 @@ public class CSVPrinterTest { @Test public void testPrintRecordsWithObjectArray() throws IOException { final CharArrayWriter charArrayWriter = new CharArrayWriter(0); - try (CSVPrinter csvPrinter = CSVFormat.INFORMIX_UNLOAD.print(charArrayWriter)) { + final Object[] objectArray = new Object[6]; + try (CSVPrinter printer = CSVFormat.INFORMIX_UNLOAD.print(charArrayWriter)) { final HashSet hashSet = new HashSet<>(); - final Object[] objectArray = new Object[6]; objectArray[3] = hashSet; - csvPrinter.printRecords(objectArray); + printer.printRecords(objectArray); + assertEquals(objectArray.length, printer.getRecordCount()); } assertEquals(6, charArrayWriter.size()); assertEquals("\n\n\n\n\n\n", charArrayWriter.toString()); @@ -1617,9 +1704,11 @@ public class CSVPrinterTest { @Test public void testPrintRecordsWithResultSetOneRow() throws IOException, SQLException { - try (CSVPrinter csvPrinter = CSVFormat.MYSQL.printer()) { + try (CSVPrinter printer = CSVFormat.MYSQL.printer()) { try (ResultSet resultSet = new SimpleResultSet()) { - csvPrinter.printRecords(resultSet); + assertInitialState(printer); + printer.printRecords(resultSet); + assertInitialState(printer); assertEquals(0, resultSet.getRow()); } } @@ -1733,6 +1822,7 @@ public class CSVPrinterTest { try (final CSVPrinter printer = new CSVPrinter(sw, CSVFormat.DEFAULT.withCommentMarker('#'))) { printer.printComment("This is a comment"); assertEquals("# This is a comment" + recordSeparator, sw.toString()); + assertEquals(0, printer.getRecordCount()); } }