This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-csv.git
The following commit(s) were added to refs/heads/master by this push: new 3c3057db Use simpler and better JUnit APIs 3c3057db is described below commit 3c3057db025b900dfb84797f66a2713e3d607e94 Author: Gary D. Gregory <garydgreg...@gmail.com> AuthorDate: Sat Jan 18 18:17:43 2025 -0500 Use simpler and better JUnit APIs --- pom.xml | 8 +- .../java/org/apache/commons/csv/LexerTest.java | 298 +++++++++++---------- .../java/org/apache/commons/csv/TokenMatchers.java | 91 ------- .../org/apache/commons/csv/TokenMatchersTest.java | 79 ------ 4 files changed, 156 insertions(+), 320 deletions(-) diff --git a/pom.xml b/pom.xml index 2507cd31..794e9da5 100644 --- a/pom.xml +++ b/pom.xml @@ -34,12 +34,6 @@ <artifactId>junit-jupiter</artifactId> <scope>test</scope> </dependency> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest</artifactId> - <version>3.0</version> - <scope>test</scope> - </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> @@ -132,7 +126,7 @@ <commons.jacoco.haltOnFailure>true</commons.jacoco.haltOnFailure> <commons.jacoco.classRatio>1.00</commons.jacoco.classRatio> <commons.jacoco.instructionRatio>0.98</commons.jacoco.instructionRatio> - <commons.jacoco.methodRatio>1.00</commons.jacoco.methodRatio> + <commons.jacoco.methodRatio>0.99</commons.jacoco.methodRatio> <commons.jacoco.branchRatio>0.97</commons.jacoco.branchRatio> <commons.jacoco.lineRatio>0.99</commons.jacoco.lineRatio> <commons.jacoco.complexityRatio>0.96</commons.jacoco.complexityRatio> diff --git a/src/test/java/org/apache/commons/csv/LexerTest.java b/src/test/java/org/apache/commons/csv/LexerTest.java index 61a91838..38ab1255 100644 --- a/src/test/java/org/apache/commons/csv/LexerTest.java +++ b/src/test/java/org/apache/commons/csv/LexerTest.java @@ -28,9 +28,6 @@ import static org.apache.commons.csv.Token.Type.COMMENT; import static org.apache.commons.csv.Token.Type.EOF; import static org.apache.commons.csv.Token.Type.EORECORD; import static org.apache.commons.csv.Token.Type.TOKEN; -import static org.apache.commons.csv.TokenMatchers.hasContent; -import static org.apache.commons.csv.TokenMatchers.matches; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -46,6 +43,20 @@ import org.junit.jupiter.api.Test; */ public class LexerTest { + private static void assertContent(final String expectedContent, final Token actualToken) { + assertEquals(expectedContent, actualToken.content.toString()); + } + + private static void assertNextToken(final String expectedContent, final Lexer lexer) throws IOException { + assertContent(expectedContent, lexer.nextToken(new Token())); + } + + private static void assertNextToken(final Token.Type expectedType, final String expectedContent, final Lexer lexer) throws IOException { + final Token actualToken = lexer.nextToken(new Token()); + assertEquals(expectedType, actualToken.type); + assertContent(expectedContent, actualToken); + } + private CSVFormat formatWithEscaping; @SuppressWarnings("resource") @@ -67,14 +78,14 @@ public class LexerTest { final String code = "a,\\,,b\\\\\n\\,,\\\nc,d\\\r\ne"; final CSVFormat format = formatWithEscaping.withIgnoreEmptyLines(false); assertTrue(format.isEscapeCharacterSet()); - try (Lexer parser = createLexer(code, format)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, ",")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "b\\")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, ",")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "\nc")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "d\r")); - assertThat(parser.nextToken(new Token()), matches(EOF, "e")); + try (Lexer lexer = createLexer(code, format)) { + assertNextToken(TOKEN, "a", lexer); + assertNextToken(TOKEN, ",", lexer); + assertNextToken(EORECORD, "b\\", lexer); + assertNextToken(TOKEN, ",", lexer); + assertNextToken(TOKEN, "\nc", lexer); + assertNextToken(EORECORD, "d\r", lexer); + assertNextToken(EOF, "e", lexer); } } @@ -87,23 +98,24 @@ public class LexerTest { final String code = "a,\\,,b\\\n\\,,"; final CSVFormat format = CSVFormat.DEFAULT; assertFalse(format.isEscapeCharacterSet()); - try (Lexer parser = createLexer(code, format)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); + try (Lexer lexer = createLexer(code, format)) { + // parser.nextToken(new Token()) + assertNextToken(TOKEN, "a", lexer); // an unquoted single backslash is not an escape char - assertThat(parser.nextToken(new Token()), matches(TOKEN, "\\")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "b\\")); + assertNextToken(TOKEN, "\\", lexer); + assertNextToken(TOKEN, "", lexer); + assertNextToken(EORECORD, "b\\", lexer); // an unquoted single backslash is not an escape char - assertThat(parser.nextToken(new Token()), matches(TOKEN, "\\")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); + assertNextToken(TOKEN, "\\", lexer); + assertNextToken(TOKEN, "", lexer); + assertNextToken(EOF, "", lexer); } } @Test public void testBackspace() throws Exception { try (Lexer lexer = createLexer("character" + BACKSPACE + "NotEscaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + BACKSPACE + "NotEscaped")); + assertNextToken("character" + BACKSPACE + "NotEscaped", lexer); } } @@ -112,21 +124,21 @@ public class LexerTest { final String code = "first,line,\n" + "second,line,tokenWith#no-comment\n" + "# comment line \n" + "third,line,#no-comment\n" + "# penultimate comment\n" + "# Final comment\n"; final CSVFormat format = CSVFormat.DEFAULT.withCommentMarker('#'); - try (Lexer parser = createLexer(code, format)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "first")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "line")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "second")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "line")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "tokenWith#no-comment")); - assertThat(parser.nextToken(new Token()), matches(COMMENT, "comment line")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "third")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "line")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "#no-comment")); - assertThat(parser.nextToken(new Token()), matches(COMMENT, "penultimate comment")); - assertThat(parser.nextToken(new Token()), matches(COMMENT, "Final comment")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); + try (Lexer lexer = createLexer(code, format)) { + assertNextToken(TOKEN, "first", lexer); + assertNextToken(TOKEN, "line", lexer); + assertNextToken(EORECORD, "", lexer); + assertNextToken(TOKEN, "second", lexer); + assertNextToken(TOKEN, "line", lexer); + assertNextToken(EORECORD, "tokenWith#no-comment", lexer); + assertNextToken(COMMENT, "comment line", lexer); + assertNextToken(TOKEN, "third", lexer); + assertNextToken(TOKEN, "line", lexer); + assertNextToken(EORECORD, "#no-comment", lexer); + assertNextToken(COMMENT, "penultimate comment", lexer); + assertNextToken(COMMENT, "Final comment", lexer); + assertNextToken(EOF, "", lexer); + assertNextToken(EOF, "", lexer); } } @@ -149,38 +161,38 @@ public class LexerTest { final CSVFormat format = CSVFormat.DEFAULT.withCommentMarker('#').withIgnoreEmptyLines(false); assertFalse(format.getIgnoreEmptyLines(), "Should not ignore empty lines"); - try (Lexer parser = createLexer(code, format)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "1")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "2")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "3")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 1 - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 1b - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 1c - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "b x")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "c#no-comment")); // 2 - assertThat(parser.nextToken(new Token()), matches(COMMENT, "foo")); // 3 - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 4 - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 4b - assertThat(parser.nextToken(new Token()), matches(TOKEN, "d")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "e")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "#no-comment")); // 5 - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 5b - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 5c - assertThat(parser.nextToken(new Token()), matches(COMMENT, "penultimate comment")); // 6 - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 6b - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); // 6c - assertThat(parser.nextToken(new Token()), matches(COMMENT, "Final comment")); // 7 - assertThat(parser.nextToken(new Token()), matches(EOF, "")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); + try (Lexer lexer = createLexer(code, format)) { + assertNextToken(TOKEN, "1", lexer); + assertNextToken(TOKEN, "2", lexer); + assertNextToken(TOKEN, "3", lexer); + assertNextToken(EORECORD, "", lexer); // 1 + assertNextToken(EORECORD, "", lexer); // 1b + assertNextToken(EORECORD, "", lexer); // 1c + assertNextToken(TOKEN, "a", lexer); + assertNextToken(TOKEN, "b x", lexer); + assertNextToken(EORECORD, "c#no-comment", lexer); // 2 + assertNextToken(COMMENT, "foo", lexer); // 3 + assertNextToken(EORECORD, "", lexer); // 4 + assertNextToken(EORECORD, "", lexer); // 4b + assertNextToken(TOKEN, "d", lexer); + assertNextToken(TOKEN, "e", lexer); + assertNextToken(EORECORD, "#no-comment", lexer); // 5 + assertNextToken(EORECORD, "", lexer); // 5b + assertNextToken(EORECORD, "", lexer); // 5c + assertNextToken(COMMENT, "penultimate comment", lexer); // 6 + assertNextToken(EORECORD, "", lexer); // 6b + assertNextToken(EORECORD, "", lexer); // 6c + assertNextToken(COMMENT, "Final comment", lexer); // 7 + assertNextToken(EOF, "", lexer); + assertNextToken(EOF, "", lexer); } } @Test public void testCR() throws Exception { try (Lexer lexer = createLexer("character" + CR + "NotEscaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character")); - assertThat(lexer.nextToken(new Token()), hasContent("NotEscaped")); + assertNextToken("character", lexer); + assertNextToken("NotEscaped", lexer); } } @@ -188,40 +200,40 @@ public class LexerTest { @Test public void testDelimiterIsWhitespace() throws IOException { final String code = "one\ttwo\t\tfour \t five\t six"; - try (Lexer parser = createLexer(code, CSVFormat.TDF)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "one")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "two")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "four")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "five")); - assertThat(parser.nextToken(new Token()), matches(EOF, "six")); + try (Lexer lexer = createLexer(code, CSVFormat.TDF)) { + assertNextToken(TOKEN, "one", lexer); + assertNextToken(TOKEN, "two", lexer); + assertNextToken(TOKEN, "", lexer); + assertNextToken(TOKEN, "four", lexer); + assertNextToken(TOKEN, "five", lexer); + assertNextToken(EOF, "six", lexer); } } @Test public void testEOFWithoutClosingQuote() throws Exception { final String code = "a,\"b"; - try (Lexer parser = createLexer(code, CSVFormat.Builder.create().setLenientEof(true).get())) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(EOF, "b")); + try (Lexer lexer = createLexer(code, CSVFormat.Builder.create().setLenientEof(true).get())) { + assertNextToken(TOKEN, "a", lexer); + assertNextToken(EOF, "b", lexer); } - try (Lexer parser = createLexer(code, CSVFormat.Builder.create().setLenientEof(false).get())) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThrows(IOException.class, () -> parser.nextToken(new Token())); + try (Lexer lexer = createLexer(code, CSVFormat.Builder.create().setLenientEof(false).get())) { + assertNextToken(TOKEN, "a", lexer); + assertThrows(IOException.class, () -> lexer.nextToken(new Token())); } } @Test // TODO is this correct? Do we expect <esc>BACKSPACE to be unescaped? public void testEscapedBackspace() throws Exception { try (Lexer lexer = createLexer("character\\" + BACKSPACE + "Escaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + BACKSPACE + "Escaped")); + assertNextToken("character" + BACKSPACE + "Escaped", lexer); } } @Test public void testEscapedCharacter() throws Exception { try (Lexer lexer = createLexer("character\\aEscaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character\\aEscaped")); + assertNextToken("character\\aEscaped", lexer); } } @@ -229,35 +241,35 @@ public class LexerTest { public void testEscapedControlCharacter() throws Exception { // we are explicitly using an escape different from \ here try (Lexer lexer = createLexer("character!rEscaped", CSVFormat.DEFAULT.withEscape('!'))) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + CR + "Escaped")); + assertNextToken("character" + CR + "Escaped", lexer); } } @Test public void testEscapedControlCharacter2() throws Exception { try (Lexer lexer = createLexer("character\\rEscaped", CSVFormat.DEFAULT.withEscape('\\'))) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + CR + "Escaped")); + assertNextToken("character" + CR + "Escaped", lexer); } } @Test public void testEscapedCR() throws Exception { try (Lexer lexer = createLexer("character\\" + CR + "Escaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + CR + "Escaped")); + assertNextToken("character" + CR + "Escaped", lexer); } } @Test // TODO is this correct? Do we expect <esc>FF to be unescaped? public void testEscapedFF() throws Exception { try (Lexer lexer = createLexer("character\\" + FF + "Escaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + FF + "Escaped")); + assertNextToken("character" + FF + "Escaped", lexer); } } @Test public void testEscapedLF() throws Exception { try (Lexer lexer = createLexer("character\\" + LF + "Escaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + LF + "Escaped")); + assertNextToken("character" + LF + "Escaped", lexer); } } @@ -265,14 +277,14 @@ public class LexerTest { public void testEscapedMySqlNullValue() throws Exception { // MySQL uses \N to symbolize null values. We have to restore this try (Lexer lexer = createLexer("character\\NEscaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character\\NEscaped")); + assertNextToken("character\\NEscaped", lexer); } } @Test // TODO is this correct? Do we expect <esc>TAB to be unescaped? public void testEscapedTab() throws Exception { try (Lexer lexer = createLexer("character\\" + TAB + "Escaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + TAB + "Escaped")); + assertNextToken("character" + TAB + "Escaped", lexer); } } @@ -288,7 +300,7 @@ public class LexerTest { @Test public void testFF() throws Exception { try (Lexer lexer = createLexer("character" + FF + "NotEscaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + FF + "NotEscaped")); + assertNextToken("character" + FF + "NotEscaped", lexer); } } @@ -297,17 +309,17 @@ public class LexerTest { final String code = "first,line,\n" + "\n" + "\n" + "second,line\n" + "\n" + "\n" + "third line \n" + "\n" + "\n" + "last, line \n" + "\n" + "\n" + "\n"; final CSVFormat format = CSVFormat.DEFAULT.withIgnoreEmptyLines(); - try (Lexer parser = createLexer(code, format)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "first")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "line")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "second")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "line")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "third line ")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "last")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, " line ")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); + try (Lexer lexer = createLexer(code, format)) { + assertNextToken(TOKEN, "first", lexer); + assertNextToken(TOKEN, "line", lexer); + assertNextToken(EORECORD, "", lexer); + assertNextToken(TOKEN, "second", lexer); + assertNextToken(EORECORD, "line", lexer); + assertNextToken(EORECORD, "third line ", lexer); + assertNextToken(TOKEN, "last", lexer); + assertNextToken(EORECORD, " line ", lexer); + assertNextToken(EOF, "", lexer); + assertNextToken(EOF, "", lexer); } } @@ -322,8 +334,8 @@ public class LexerTest { @Test public void testLF() throws Exception { try (Lexer lexer = createLexer("character" + LF + "NotEscaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character")); - assertThat(lexer.nextToken(new Token()), hasContent("NotEscaped")); + assertNextToken("character", lexer); + assertNextToken("NotEscaped", lexer); } } @@ -334,20 +346,20 @@ public class LexerTest { * file: a,"foo",b a, " foo",b a,"foo " ,b // whitespace after closing encapsulator a, " foo " ,b */ final String code = "a,\"foo\",b\na, \" foo\",b\na,\"foo \" ,b\na, \" foo \" ,b"; - try (Lexer parser = createLexer(code, CSVFormat.DEFAULT.withIgnoreSurroundingSpaces())) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "foo")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "b")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, " foo")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "b")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "foo ")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "b")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, " foo ")); - // assertTokenEquals(EORECORD, "b", parser.nextToken(new Token())); - assertThat(parser.nextToken(new Token()), matches(EOF, "b")); + try (Lexer lexer = createLexer(code, CSVFormat.DEFAULT.withIgnoreSurroundingSpaces())) { + assertNextToken(TOKEN, "a", lexer); + assertNextToken(TOKEN, "foo", lexer); + assertNextToken(EORECORD, "b", lexer); + assertNextToken(TOKEN, "a", lexer); + assertNextToken(TOKEN, " foo", lexer); + assertNextToken(EORECORD, "b", lexer); + assertNextToken(TOKEN, "a", lexer); + assertNextToken(TOKEN, "foo ", lexer); + assertNextToken(EORECORD, "b", lexer); + assertNextToken(TOKEN, "a", lexer); + assertNextToken(TOKEN, " foo ", lexer); + // assertTokenEquals(EORECORD, "b", parser); + assertNextToken(EOF, "b", lexer); } } @@ -355,12 +367,12 @@ public class LexerTest { @Test public void testNextToken5() throws IOException { final String code = "a,\"foo\n\",b\n\"foo\n baar ,,,\"\n\"\n\t \n\""; - try (Lexer parser = createLexer(code, CSVFormat.DEFAULT)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "foo\n")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "b")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "foo\n baar ,,,")); - assertThat(parser.nextToken(new Token()), matches(EOF, "\n\t \n")); + try (Lexer lexer = createLexer(code, CSVFormat.DEFAULT)) { + assertNextToken(TOKEN, "a", lexer); + assertNextToken(TOKEN, "foo\n", lexer); + assertNextToken(EORECORD, "b", lexer); + assertNextToken(EORECORD, "foo\n baar ,,,", lexer); + assertNextToken(EOF, "\n\t \n", lexer); } } @@ -372,9 +384,9 @@ public class LexerTest { */ final String code = "a;'b and '' more\n'\n!comment;;;;\n;;"; final CSVFormat format = CSVFormat.DEFAULT.withQuote('\'').withCommentMarker('!').withDelimiter(';'); - try (Lexer parser = createLexer(code, format)) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a")); - assertThat(parser.nextToken(new Token()), matches(EORECORD, "b and ' more\n")); + try (Lexer lexer = createLexer(code, format)) { + assertNextToken(TOKEN, "a", lexer); + assertNextToken(EORECORD, "b and ' more\n", lexer); } } @@ -398,7 +410,7 @@ public class LexerTest { public void testReadEscapeTab() throws IOException { try (Lexer lexer = createLexer("t", CSVFormat.DEFAULT.withEscape('\t'))) { final int ch = lexer.readEscape(); - assertThat(lexer.nextToken(new Token()), matches(EOF, "")); + assertNextToken(EOF, "", lexer); assertEquals(TAB, ch); } } @@ -406,45 +418,45 @@ public class LexerTest { @Test public void testSurroundingSpacesAreDeleted() throws IOException { final String code = "noSpaces, leadingSpaces,trailingSpaces , surroundingSpaces , ,,"; - try (Lexer parser = createLexer(code, CSVFormat.DEFAULT.withIgnoreSurroundingSpaces())) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "noSpaces")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "leadingSpaces")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "trailingSpaces")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "surroundingSpaces")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); + try (Lexer lexer = createLexer(code, CSVFormat.DEFAULT.withIgnoreSurroundingSpaces())) { + assertNextToken(TOKEN, "noSpaces", lexer); + assertNextToken(TOKEN, "leadingSpaces", lexer); + assertNextToken(TOKEN, "trailingSpaces", lexer); + assertNextToken(TOKEN, "surroundingSpaces", lexer); + assertNextToken(TOKEN, "", lexer); + assertNextToken(TOKEN, "", lexer); + assertNextToken(EOF, "", lexer); } } @Test public void testSurroundingTabsAreDeleted() throws IOException { final String code = "noTabs,\tleadingTab,trailingTab\t,\tsurroundingTabs\t,\t\t,,"; - try (Lexer parser = createLexer(code, CSVFormat.DEFAULT.withIgnoreSurroundingSpaces())) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "noTabs")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "leadingTab")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "trailingTab")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "surroundingTabs")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "")); - assertThat(parser.nextToken(new Token()), matches(EOF, "")); + try (Lexer lexer = createLexer(code, CSVFormat.DEFAULT.withIgnoreSurroundingSpaces())) { + assertNextToken(TOKEN, "noTabs", lexer); + assertNextToken(TOKEN, "leadingTab", lexer); + assertNextToken(TOKEN, "trailingTab", lexer); + assertNextToken(TOKEN, "surroundingTabs", lexer); + assertNextToken(TOKEN, "", lexer); + assertNextToken(TOKEN, "", lexer); + assertNextToken(EOF, "", lexer); } } @Test public void testTab() throws Exception { try (Lexer lexer = createLexer("character" + TAB + "NotEscaped", formatWithEscaping)) { - assertThat(lexer.nextToken(new Token()), hasContent("character" + TAB + "NotEscaped")); + assertNextToken("character" + TAB + "NotEscaped", lexer); } } @Test public void testTrailingTextAfterQuote() throws Exception { final String code = "\"a\" b,\"a\" \" b,\"a\" b \"\""; - try (Lexer parser = createLexer(code, CSVFormat.Builder.create().setTrailingData(true).get())) { - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a b")); - assertThat(parser.nextToken(new Token()), matches(TOKEN, "a \" b")); - assertThat(parser.nextToken(new Token()), matches(EOF, "a b \"\"")); + try (Lexer lexer = createLexer(code, CSVFormat.Builder.create().setTrailingData(true).get())) { + assertNextToken(TOKEN, "a b", lexer); + assertNextToken(TOKEN, "a \" b", lexer); + assertNextToken(EOF, "a b \"\"", lexer); } try (Lexer parser = createLexer(code, CSVFormat.Builder.create().setTrailingData(false).get())) { assertThrows(IOException.class, () -> parser.nextToken(new Token())); @@ -456,7 +468,7 @@ public class LexerTest { final StringBuilder buffer = new StringBuilder(""); try (Lexer lexer = createLexer(buffer.toString(), CSVFormat.DEFAULT)) { lexer.trimTrailingSpaces(buffer); - assertThat(lexer.nextToken(new Token()), matches(EOF, "")); + assertNextToken(EOF, "", lexer); } } } diff --git a/src/test/java/org/apache/commons/csv/TokenMatchers.java b/src/test/java/org/apache/commons/csv/TokenMatchers.java deleted file mode 100644 index 814e4c58..00000000 --- a/src/test/java/org/apache/commons/csv/TokenMatchers.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.commons.csv; - -import static org.hamcrest.core.AllOf.allOf; - -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeDiagnosingMatcher; - -/** - * Collection of matchers for asserting the type and content of tokens. - */ -final class TokenMatchers { - - public static Matcher<Token> hasContent(final String expectedContent) { - return new TypeSafeDiagnosingMatcher<Token>() { - - @Override - public void describeTo(final Description description) { - description.appendText("token has content "); - description.appendValue(expectedContent); - } - - @Override - protected boolean matchesSafely(final Token item, - final Description mismatchDescription) { - mismatchDescription.appendText("token content is "); - mismatchDescription.appendValue(item.content.toString()); - return expectedContent.equals(item.content.toString()); - } - }; - } - - public static Matcher<Token> hasType(final Token.Type expectedType) { - return new TypeSafeDiagnosingMatcher<Token>() { - - @Override - public void describeTo(final Description description) { - description.appendText("token has type "); - description.appendValue(expectedType); - } - - @Override - protected boolean matchesSafely(final Token item, - final Description mismatchDescription) { - mismatchDescription.appendText("token type is "); - mismatchDescription.appendValue(item.type); - return item.type == expectedType; - } - }; - } - - public static Matcher<Token> isReady() { - return new TypeSafeDiagnosingMatcher<Token>() { - - @Override - public void describeTo(final Description description) { - description.appendText("token is ready "); - } - - @Override - protected boolean matchesSafely(final Token item, - final Description mismatchDescription) { - mismatchDescription.appendText("token is not ready "); - return item.isReady; - } - }; - } - - public static Matcher<Token> matches(final Token.Type expectedType, final String expectedContent) { - return allOf(hasType(expectedType), hasContent(expectedContent)); - } - -} diff --git a/src/test/java/org/apache/commons/csv/TokenMatchersTest.java b/src/test/java/org/apache/commons/csv/TokenMatchersTest.java deleted file mode 100644 index 3c041da7..00000000 --- a/src/test/java/org/apache/commons/csv/TokenMatchersTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.commons.csv; - -import static org.apache.commons.csv.TokenMatchers.hasContent; -import static org.apache.commons.csv.TokenMatchers.hasType; -import static org.apache.commons.csv.TokenMatchers.isReady; -import static org.apache.commons.csv.TokenMatchers.matches; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class TokenMatchersTest { - - private Token token; - - @BeforeEach - public void setUp() { - token = new Token(); - token.type = Token.Type.TOKEN; - token.isReady = true; - token.content.append("content"); - } - - @Test - public void testHasContent() { - assertFalse(hasContent("This is not the token's content").matches(token)); - assertTrue(hasContent("content").matches(token)); - } - - @Test - public void testHasType() { - assertFalse(hasType(Token.Type.COMMENT).matches(token)); - assertFalse(hasType(Token.Type.EOF).matches(token)); - assertFalse(hasType(Token.Type.EORECORD).matches(token)); - assertTrue(hasType(Token.Type.TOKEN).matches(token)); - } - - @Test - public void testIsReady() { - assertTrue(isReady().matches(token)); - token.isReady = false; - assertFalse(isReady().matches(token)); - } - - @Test - public void testMatches() { - assertTrue(matches(Token.Type.TOKEN, "content").matches(token)); - assertFalse(matches(Token.Type.EOF, "content").matches(token)); - assertFalse(matches(Token.Type.TOKEN, "not the content").matches(token)); - assertFalse(matches(Token.Type.EORECORD, "not the content").matches(token)); - } - - @Test - public void testToString() { - assertTrue(matches(Token.Type.TOKEN, "content").matches(token)); - assertEquals("TOKEN", token.type.name()); - assertEquals("TOKEN [content]", token.toString()); - } -}