removing last parsed content from exception message, instead making respective method public

This commit is contained in:
gbidsilva 2023-08-31 18:33:35 +05:30
parent 9c50c7b49f
commit ae8c0cd5c3
2 changed files with 49 additions and 10 deletions

View File

@ -462,12 +462,12 @@ public final class CSVParser implements Iterable<CSVRecord>, Closeable {
* </pre> * </pre>
* @return parsed CSV content of current reading line * @return parsed CSV content of current reading line
*/ */
private String getLastParsedContent() { public String getLastParsedContent() {
String parsedContent = ""; String parsedContent = "";
int recordListSize = this.recordList.size(); int recordListSize = this.recordList.size();
if (recordListSize > 0) { if (recordListSize > 0) {
if (recordListSize <= this.maxParsedTokenCount) { if (recordListSize <= this.maxParsedTokenCount) {
parsedContent = String.join("", this.recordList.toArray(Constants.EMPTY_STRING_ARRAY)); parsedContent = String.join(this.format.getDelimiterString(), this.recordList.toArray(Constants.EMPTY_STRING_ARRAY));
} else { } else {
// number of parsed token exceed required token count. Take the expected tokens from the end. // number of parsed token exceed required token count. Take the expected tokens from the end.
int startIndex = recordListSize - maxParsedTokenCount; int startIndex = recordListSize - maxParsedTokenCount;
@ -810,8 +810,7 @@ public final class CSVParser implements Iterable<CSVRecord>, Closeable {
this.lexer.nextToken(this.reusableToken); this.lexer.nextToken(this.reusableToken);
} catch (IOException ioe) { } catch (IOException ioe) {
String errorMessage = "An exception occurred while tying to parse the CSV content. Issue in line: " String errorMessage = "An exception occurred while tying to parse the CSV content. Issue in line: "
+ this.lexer.getCurrentLineNumber() + ", position: " + this.lexer.getCharacterPosition() + this.lexer.getCurrentLineNumber() + ", position: " + this.lexer.getCharacterPosition();
+ ", last parsed content: " + this.getLastParsedContent();
throw new IOException(errorMessage, ioe); throw new IOException(errorMessage, ioe);
} }
switch (this.reusableToken.type) { switch (this.reusableToken.type) {

View File

@ -27,6 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -1643,7 +1644,7 @@ public class CSVParserTest {
} }
@Test @Test
public void testFaultyCSVShouldThrowErrorWithDetailedMessage() { public void testFaultyCSVShouldThrowErrorAndDetailedMessageShouldBeAvailable_1() {
String csvContent = "col1,col2,col3,col4,col5,col6,col7,col8,col9,col10\n" + String csvContent = "col1,col2,col3,col4,col5,col6,col7,col8,col9,col10\n" +
"rec1,rec2,rec3,rec4,rec5,rec6,rec7,rec8,\"\"rec9\"\",rec10"; "rec1,rec2,rec3,rec4,rec5,rec6,rec7,rec8,\"\"rec9\"\",rec10";
@ -1653,20 +1654,59 @@ public class CSVParserTest {
.setSkipHeaderRecord(true) .setSkipHeaderRecord(true)
.build(); .build();
CSVParser csvParser = null;
try {
csvParser = csvFormat.parse(stringReader);
} catch (IOException e) {
fail("Failed to parse the CSV content");
}
final Iterable<CSVRecord> finalRecords = csvParser;
Exception exception = assertThrows(UncheckedIOException.class, () -> { Exception exception = assertThrows(UncheckedIOException.class, () -> {
Iterable<CSVRecord> records = csvFormat.parse(stringReader); for (CSVRecord record : finalRecords) {
for (CSVRecord record : records) {
System.out.println(record.get(0) + " " + record.get(1) + " " + record.get(2) + " " + record.get(3) System.out.println(record.get(0) + " " + record.get(1) + " " + record.get(2) + " " + record.get(3)
+ " " + record.get(4) + " " + record.get(5) + " " + record.get(6) + " " + record.get(7) + " " + record.get(4) + " " + record.get(5) + " " + record.get(6) + " " + record.get(7)
+ " " + record.get(8) + " " + record.get(9)); + " " + record.get(8) + " " + record.get(9));
} }
}); });
String expectedErrorMessage = "Exception reading next record: java.io.IOException: An exception occurred " + String expectedErrorMessage = "Exception reading next record: java.io.IOException: An exception occurred " +
"while tying to parse the CSV content. Issue in line: 2, position: 94, last parsed content: " + "while tying to parse the CSV content. Issue in line: 2, position: 94";
"...rec4,rec5,rec6,rec7,rec8";
String actualMessage = exception.getMessage(); String actualMessage = exception.getMessage();
assertTrue(actualMessage.contains(expectedErrorMessage)); assertTrue(actualMessage.contains(expectedErrorMessage));
assertNotNull(csvParser);
String expectedLastParsedContent = "...rec4,rec5,rec6,rec7,rec8";
assertEquals(expectedLastParsedContent, csvParser.getLastParsedContent());
} }
@Test
public void testFaultyCSVShouldThrowErrorAndDetailedMessageShouldBeAvailable_2() {
String csvContent = "col1,col2,col3,col4,col5,col6,col7,col8\n" +
"rec1,rec2,rec3,rec4,\"\"rec5\"\",rec6,rec7,rec8";
StringReader stringReader = new StringReader(csvContent);
CSVFormat csvFormat = CSVFormat.DEFAULT.builder()
.setHeader()
.setSkipHeaderRecord(true)
.build();
CSVParser csvParser = null;
try {
csvParser = csvFormat.parse(stringReader);
} catch (IOException e) {
fail("Failed to parse the CSV content");
}
final Iterable<CSVRecord> finalRecords = csvParser;
Exception exception = assertThrows(UncheckedIOException.class, () -> {
for (CSVRecord record : finalRecords) {
System.out.println(record.get(0) + " " + record.get(1) + " " + record.get(2) + " " + record.get(3)
+ " " + record.get(4) + " " + record.get(5) + " " + record.get(6) + " " + record.get(7));
}
});
String expectedErrorMessage = "Exception reading next record: java.io.IOException: An exception occurred " +
"while tying to parse the CSV content. Issue in line: 2, position: 63";
String actualMessage = exception.getMessage();
assertTrue(actualMessage.contains(expectedErrorMessage));
assertNotNull(csvParser);
String expectedLastParsedContent = "rec1,rec2,rec3,rec4";
assertEquals(expectedLastParsedContent, csvParser.getLastParsedContent());
}
} }