/* * Copyright 2009-2014 the original author or authors. * * Licensed 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 * * http://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 com.orangesignal.csv; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.util.List; import java.util.regex.Pattern; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; /** * {@link CsvReader} クラスの単体テストです。 * * @author Koji Sugisawa */ public final class CsvReaderTest { @Rule public ExpectedException exception = ExpectedException.none(); @Test public void testCsvReaderReaderIntCsvConfig() throws IOException { final CsvReader reader = new CsvReader(new StringReader(""), 8192, new CsvConfig()); reader.close(); } @Test public void testCsvReaderReaderIntCsvConfigIllegalArgumentException1() { exception.expect(IllegalArgumentException.class); final Reader reader = new StringReader(""); try { new CsvReader(reader, 0, new CsvConfig()); } finally { Csv.closeQuietly(reader); } } @Test public void testCsvReaderReaderIntCsvConfigIllegalArgumentException2() { exception.expect(IllegalArgumentException.class); final Reader reader = new StringReader(""); try { new CsvReader(reader, -8192, new CsvConfig()); } finally { Csv.closeQuietly(reader); } } @Test public void testCsvReaderReaderIntCsvConfigIllegalArgumentException3() { exception.expect(IllegalArgumentException.class); exception.expectMessage("CsvConfig must not be null"); final Reader reader = new StringReader(""); try { new CsvReader(reader, 8192, null); } finally { Csv.closeQuietly(reader); } } @Test public void testCsvReaderReaderCsvConfig() throws IOException { final CsvReader reader = new CsvReader(new StringReader(""), new CsvConfig()); reader.close(); } @Test public void testCsvReaderReaderCsvConfigIllegalArgumentException() { exception.expect(IllegalArgumentException.class); exception.expectMessage("CsvConfig must not be null"); final Reader reader = new StringReader(""); try { new CsvReader(reader, null); } finally { Csv.closeQuietly(reader); } } @Test public void testCsvReaderReaderInt() throws IOException { final CsvReader reader = new CsvReader(new StringReader(""), 8192); reader.close(); } @Test public void testCsvReaderReaderIntIllegalArgumentException1() { exception.expect(IllegalArgumentException.class); final Reader reader = new StringReader(""); try { new CsvReader(reader, 0); } finally { Csv.closeQuietly(reader); } } @Test public void testCsvReaderReaderIntIllegalArgumentException2() { exception.expect(IllegalArgumentException.class); final Reader reader = new StringReader(""); try { new CsvReader(reader, -8192); } finally { Csv.closeQuietly(reader); } } @Test public void testCsvReaderReader() throws IOException { final CsvReader reader = new CsvReader(new StringReader("")); reader.close(); } @Test public void testReadTokens() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '\\'); cfg.setNullString("NULL"); cfg.setBreakString("\n"); cfg.setIgnoreTrailingWhitespaces(true); cfg.setIgnoreLeadingWhitespaces(true); cfg.setIgnoreEmptyLines(true); cfg.setIgnoreLinePatterns(Pattern.compile("^#.*$")); final CsvReader reader = new CsvReader(new StringReader("# text/tab-separated-values \r\n aaa , \"b\r\nb\\\\b\" , \"c\\\"cc\" \r\n zzz , yyy , NULL \r\n# Copyright 2009 OrangeSignal. "), cfg); try { final List<CsvToken> tokens1 = reader.readTokens(); assertThat(reader.getLineNumber(), is(2)); assertThat(reader.getStartLineNumber(), is(2)); assertThat(reader.getEndLineNumber(), is(3)); assertThat(tokens1.size(), is(3)); assertThat(tokens1.get(0).getValue(), is("aaa")); assertThat(tokens1.get(0).getStartLineNumber(), is(2)); assertThat(tokens1.get(0).getEndLineNumber(), is(2)); assertThat(tokens1.get(0).isEnclosed(), is(false)); assertThat(tokens1.get(1).getValue(), is("b\nb\\\\b")); assertThat(tokens1.get(1).getStartLineNumber(), is(2)); assertThat(tokens1.get(1).getEndLineNumber(), is(3)); assertThat(tokens1.get(1).isEnclosed(), is(true)); assertThat(tokens1.get(2).getValue(), is("c\"cc")); assertThat(tokens1.get(2).getStartLineNumber(), is(3)); assertThat(tokens1.get(2).getEndLineNumber(), is(3)); assertThat(tokens1.get(2).isEnclosed(), is(true)); final List<CsvToken> tokens2 = reader.readTokens(); assertThat(reader.getLineNumber(), is(3)); assertThat(reader.getStartLineNumber(), is(4)); assertThat(reader.getEndLineNumber(), is(4)); assertThat(tokens2.size(), is(3)); assertThat(tokens2.get(0).getValue(), is("zzz")); assertThat(tokens2.get(0).getStartLineNumber(), is(4)); assertThat(tokens2.get(0).getEndLineNumber(), is(4)); assertThat(tokens2.get(0).isEnclosed(), is(false)); assertThat(tokens2.get(1).getValue(), is("yyy")); assertThat(tokens2.get(1).getStartLineNumber(), is(4)); assertThat(tokens2.get(1).getEndLineNumber(), is(4)); assertThat(tokens2.get(1).isEnclosed(), is(false)); assertThat(tokens2.get(2).getValue(), nullValue()); assertThat(tokens2.get(1).getStartLineNumber(), is(4)); assertThat(tokens2.get(1).getEndLineNumber(), is(4)); assertThat(tokens2.get(1).isEnclosed(), is(false)); final List<CsvToken> tokens3 = reader.readTokens(); assertThat(reader.getLineNumber(), is(4)); assertThat(reader.getStartLineNumber(), is(5)); assertThat(reader.getEndLineNumber(), is(5)); assertThat(tokens3, nullValue()); } finally { reader.close(); } } @Test public void Issue32a() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("aaa\r\n\r\nccc"), cfg); try { final List<CsvToken> tokens1 = reader.readTokens(); assertThat(tokens1.size(), is(1)); assertThat(tokens1.get(0).getValue(), is("aaa")); final List<CsvToken> tokens2 = reader.readTokens(); assertNull(tokens2); assertThat(reader.isEndOfFile(), is(false)); final List<CsvToken> tokens3 = reader.readTokens(); assertThat(tokens3.size(), is(1)); assertThat(tokens3.get(0).getValue(), is("ccc")); final List<CsvToken> tokens4 = reader.readTokens(); assertNull(tokens4); assertThat(reader.isEndOfFile(), is(true)); } finally { reader.close(); } } @Test public void Issue32b() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("1,aaa\r\n\r\n3,ccc"), cfg); try { final List<CsvToken> tokens1 = reader.readTokens(); assertThat(tokens1.size(), is(2)); assertThat(tokens1.get(0).getValue(), is("1")); assertThat(tokens1.get(1).getValue(), is("aaa")); final List<CsvToken> tokens2 = reader.readTokens(); assertNull(tokens2); assertThat(reader.isEndOfFile(), is(false)); final List<CsvToken> tokens3 = reader.readTokens(); assertThat(tokens3.size(), is(2)); assertThat(tokens3.get(0).getValue(), is("3")); assertThat(tokens3.get(1).getValue(), is("ccc")); final List<CsvToken> tokens4 = reader.readTokens(); assertNull(tokens4); assertThat(reader.isEndOfFile(), is(true)); } finally { reader.close(); } } @Test public void testReadTokensIssue30() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("aaa\r\n\r\nccc\r\n"), cfg); try { final List<CsvToken> tokens1 = reader.readTokens(); assertThat(tokens1.size(), is(1)); assertThat(tokens1.get(0).getValue(), is("aaa")); final List<CsvToken> tokens2 = reader.readTokens(); assertNull(tokens2); assertThat(reader.isEndOfFile(), is(false)); final List<CsvToken> tokens3 = reader.readTokens(); assertThat(tokens3.size(), is(1)); assertThat(tokens3.get(0).getValue(), is("ccc")); final List<CsvToken> tokens4 = reader.readTokens(); assertNull(tokens4); assertThat(reader.isEndOfFile(), is(true)); } finally { reader.close(); } } @Test public void testReadValuesIssue30() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("aaa\r\n\r\nccc\r\n"), cfg); try { final List<String> values1 = reader.readValues(); assertThat(values1.size(), is(1)); assertThat(values1.get(0), is("aaa")); final List<String> values2 = reader.readValues(); assertNull(values2); assertThat(reader.isEndOfFile(), is(false)); final List<String> values3 = reader.readValues(); assertThat(values3.size(), is(1)); assertThat(values3.get(0), is("ccc")); final List<String> values4 = reader.readValues(); assertNull(values4); assertThat(reader.isEndOfFile(), is(true)); } finally { reader.close(); } } @Test public void testReadValues() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '\\'); cfg.setNullString("NULL"); cfg.setBreakString("\n"); cfg.setIgnoreTrailingWhitespaces(true); cfg.setIgnoreLeadingWhitespaces(true); cfg.setIgnoreEmptyLines(true); cfg.setIgnoreLinePatterns(Pattern.compile("^#.*$")); final CsvReader reader = new CsvReader(new StringReader("# text/tab-separated-values \r\n aaa , \"b\r\nb\\\\b\" , \"c\\\"cc\", , \r\n zzz , yyy , NULL \r\n# Copyright 2009 OrangeSignal. "), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(5)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("b\nb\\\\b")); assertThat(line1.get(2), is("c\"cc")); assertThat(line1.get(3), is("")); assertThat(line1.get(4), is("")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("zzz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), nullValue()); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadValues2() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '\\'); cfg.setQuoteDisabled(true); cfg.setNullString("NULL"); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("aaa,b\\,b\\,b,c\\,cc\r\nz\\,zz,yyy,NULL\r\n"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("b,b,b")); assertThat(line1.get(2), is("c,cc")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("z,zz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), nullValue()); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadTSV() throws IOException { final CsvConfig cfg = new CsvConfig('\t', '"', '\\'); cfg.setNullString("NULL"); cfg.setBreakString("\n"); cfg.setIgnoreTrailingWhitespaces(true); cfg.setIgnoreLeadingWhitespaces(true); cfg.setIgnoreEmptyLines(true); cfg.setIgnoreLinePatterns(Pattern.compile("^#.*$")); final CsvReader reader = new CsvReader(new StringReader("# text/tab-separated-values \r\n aaa \t \"b\r\nb\\\\b\" \t \"c\\\"cc\" \r\n zzz \t yyy \t NULL \r\n# Copyright 2009 OrangeSignal. "), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("b\nb\\\\b")); assertThat(line1.get(2), is("c\"cc")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("zzz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), nullValue()); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadRFC4180_2_1() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("aaa,bbb,ccc\r\nzzz,yyy,xxx\r\n"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("bbb")); assertThat(line1.get(2), is("ccc")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("zzz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), is("xxx")); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadRFC4180_2_2() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("aaa,bbb,ccc\r\nzzz,yyy,xxx"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("bbb")); assertThat(line1.get(2), is("ccc")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("zzz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), is("xxx")); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadRFC4180_2_3() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("field_name,field_name,field_name\r\naaa,bbb,ccc\r\nzzz,yyy,xxx\r\n"), cfg); try { final List<String> line0 = reader.readValues(); assertThat(line0.size(), is(3)); assertThat(line0.get(0), is("field_name")); assertThat(line0.get(1), is("field_name")); assertThat(line0.get(2), is("field_name")); final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("bbb")); assertThat(line1.get(2), is("ccc")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("zzz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), is("xxx")); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadRFC4180_5() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("\"aaa\",\"bbb\",\"ccc\"\r\nzzz,yyy,xxx"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("bbb")); assertThat(line1.get(2), is("ccc")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("zzz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), is("xxx")); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadRFC4180_6() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("\"aaa\",\"b\r\nbb\",\"ccc\"\r\nzzz,yyy,xxx"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("b\r\nbb")); assertThat(line1.get(2), is("ccc")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("zzz")); assertThat(line2.get(1), is("yyy")); assertThat(line2.get(2), is("xxx")); final List<String> line3 = reader.readValues(); assertThat(line3, nullValue()); } finally { reader.close(); } } @Test public void testReadRFC4180_7() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("\"aaa\",\"b\"\"bb\",\"ccc\""), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("aaa")); assertThat(line1.get(1), is("b\"bb")); assertThat(line1.get(2), is("ccc")); final List<String> line2 = reader.readValues(); assertThat(line2, nullValue()); } finally { reader.close(); } } @Test public void testReadEscapedDoubleQuoteWithLineBreak() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("\"a\",\"b\",\"c\"\r\n\"1,000\",\"2,000\",\"3,000\"\r\n\"a\",\"\"\"b\"\"b\r\nb\",\"c\"\r\n"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("a")); assertThat(line1.get(1), is("b")); assertThat(line1.get(2), is("c")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("1,000")); assertThat(line2.get(1), is("2,000")); assertThat(line2.get(2), is("3,000")); final List<String> line3 = reader.readValues(); assertThat(line3.size(), is(3)); assertThat(line3.get(0), is("a")); assertThat(line3.get(1), is("\"b\"b\r\nb")); assertThat(line3.get(2), is("c")); } finally { reader.close(); } } @Test public void testReadEscapedDoubleQuoteWithLineBreak2() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("\"a\",\"b\",\"c\"\r\n\"1,000\",\"2,000\",\"3,000\"\r\n\"a\",\"\"\"b\"\"b\"\"\r\nb\",\"c\"\r\n"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("a")); assertThat(line1.get(1), is("b")); assertThat(line1.get(2), is("c")); final List<String> line2 = reader.readValues(); assertThat(line2.size(), is(3)); assertThat(line2.get(0), is("1,000")); assertThat(line2.get(1), is("2,000")); assertThat(line2.get(2), is("3,000")); final List<String> line3 = reader.readValues(); assertThat(line3.size(), is(3)); assertThat(line3.get(0), is("a")); assertThat(line3.get(1), is("\"b\"b\"\r\nb")); assertThat(line3.get(2), is("c")); } finally { reader.close(); } } @Test public void testReadEscapedDoubleQuote() throws IOException { final CsvConfig cfg = new CsvConfig(',', '"', '"'); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader("\"\"\"\"\"x\"\"\"\"\",\"y\"\"y\"\"y\",\"z\"\"\"\"z\""), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("\"\"x\"\"")); assertThat(line1.get(1), is("y\"y\"y")); assertThat(line1.get(2), is("z\"\"z")); } finally { reader.close(); } } @Test public void testReadUtf8bomFromInputStreamReader() throws IOException { final byte[] bytes = "\uFEFF佐藤,鈴木".getBytes("UTF8"); // System.out.println(new HexDumpEncoder().encodeBuffer(bytes)); final CsvConfig cfg = new CsvConfig(); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new InputStreamReader(new ByteArrayInputStream(bytes), "UTF8")); try { final List<String> line = reader.readValues(); assertThat(line.size(), is(2)); assertThat(line.get(0), is("佐藤")); assertThat(line.get(1), is("鈴木")); } finally { reader.close(); } } /* @Test public void testReadUtf8bomFromStringReader() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new StringReader(new String("\uFEFF佐藤,鈴木"))); try { final List<String> line = reader.readValues(); assertThat(line.size(), is(2)); assertThat(line.get(0), is("佐藤")); assertThat(line.get(1), is("鈴木")); } finally { reader.close(); } } */ @Test public void testReadUtf8bomFromFileInputStream() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setIgnoreEmptyLines(true); final CsvReader reader = new CsvReader(new InputStreamReader(new FileInputStream("src/test/resources/utf8bom.csv"), "UTF-8"), cfg); try { final List<String> line = reader.readValues(); assertThat(line.size(), is(2)); assertThat(line.get(0), is("佐藤")); assertThat(line.get(1), is("鈴木")); } finally { reader.close(); } } @Test public void testReadTokensCsvTokenException() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setVariableColumns(false); final CsvReader reader = new CsvReader(new StringReader("a,b,c\r\nx,y"), cfg); try { final List<CsvToken> line1 = reader.readTokens(); assertThat(line1.size(), is(3)); assertThat(line1.get(0).getValue(), is("a")); assertThat(line1.get(1).getValue(), is("b")); assertThat(line1.get(2).getValue(), is("c")); // Act reader.readTokens(); } catch (final CsvTokenException e) { // Assert assertThat(e.getMessage(), is("Invalid column count in CSV input on line 2.")); final List<CsvToken> tokens = e.getTokens(); assertThat(tokens.size(), is(2)); assertThat(tokens.get(0).getValue(), is("x")); assertThat(tokens.get(1).getValue(), is("y")); } finally { reader.close(); } } @Test public void testReadValuesCsvTokenException() throws IOException { final CsvConfig cfg = new CsvConfig(); cfg.setVariableColumns(false); final CsvReader reader = new CsvReader(new StringReader("a,b,c\r\nx,y"), cfg); try { final List<String> line1 = reader.readValues(); assertThat(line1.size(), is(3)); assertThat(line1.get(0), is("a")); assertThat(line1.get(1), is("b")); assertThat(line1.get(2), is("c")); // Act reader.readValues(); } catch (final CsvTokenException e) { // Assert assertThat(e.getMessage(), is("Invalid column count in CSV input on line 2.")); final List<CsvToken> tokens = e.getTokens(); assertThat(tokens.size(), is(2)); assertThat(tokens.get(0).getValue(), is("x")); assertThat(tokens.get(1).getValue(), is("y")); } finally { reader.close(); } } @Test public void testClosed() throws IOException { // Arrange exception.expect(IOException.class); exception.expectMessage("Reader closed"); final CsvReader reader = new CsvReader(new StringReader(""), new CsvConfig()); reader.close(); // Act reader.readValues(); } }