/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.collect.io; import static com.opengamma.strata.collect.TestHelper.assertThrows; import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import java.io.File; import java.io.StringReader; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.regex.Pattern; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; import com.google.common.io.CharSource; import com.google.common.io.Files; /** * Test {@link CsvFile}. */ @Test public class CsvFileTest { private final String CSV1 = "" + "h1,h2\n" + "r11,r12\n" + "r21,r22"; private final String CSV1T = "" + "h1\th2\n" + "r11\tr12\n" + "r21\tr22"; private final String CSV2 = "" + "h1,h2\n" + "#r11,r12\n" + ";r11,r12\n" + "\n" + "r21,r22\n"; private final String CSV3 = "" + "r11,r12\n" + ",\n" + "r21,r22\n"; private final String CSV4 = "" + "\"alpha\",\"be, \"\"at\"\", one\"\n" + "\"alpha\"\",\"be\"\"\", \"\"at\"\", one\"\n" + "r21,\" r22 \"\n"; private final String CSV5 = "" + "a,b,c,b,c\n" + "aa,b1,c1,b2,c2\n"; private final String CSV6 = "" + "a,b,c\n" + "r11\n" + "r21,r22"; //------------------------------------------------------------------------- public void test_of_ioException() { assertThrows( () -> CsvFile.of(Files.asCharSource(new File("src/test/resources"), StandardCharsets.UTF_8), false), UncheckedIOException.class); } public void test_of_empty_no_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(""), false); assertEquals(csvFile.headers().size(), 0); assertEquals(csvFile.rowCount(), 0); } public void test_of_empty_with_header() { assertThrowsIllegalArg(() -> CsvFile.of(CharSource.wrap(""), true)); } public void test_of_simple_no_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), false); assertEquals(csvFile.headers().size(), 0); assertEquals(csvFile.rowCount(), 3); assertEquals(csvFile.row(0).headers().size(), 0); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "h1"); assertEquals(csvFile.row(0).field(1), "h2"); assertEquals(csvFile.row(1).headers().size(), 0); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r11"); assertEquals(csvFile.row(1).field(1), "r12"); assertEquals(csvFile.row(2).headers().size(), 0); assertEquals(csvFile.row(2).fieldCount(), 2); assertEquals(csvFile.row(2).field(0), "r21"); assertEquals(csvFile.row(2).field(1), "r22"); assertEquals(csvFile.row(0).subRow(0).fieldCount(), 2); assertEquals(csvFile.row(0).subRow(1).fieldCount(), 1); assertEquals(csvFile.row(0).subRow(2).fieldCount(), 0); } public void test_of_simple_no_header_tabs() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1T), false, '\t'); assertEquals(csvFile.headers().size(), 0); assertEquals(csvFile.rowCount(), 3); assertEquals(csvFile.row(0).headers().size(), 0); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "h1"); assertEquals(csvFile.row(0).field(1), "h2"); assertEquals(csvFile.row(1).headers().size(), 0); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r11"); assertEquals(csvFile.row(1).field(1), "r12"); assertEquals(csvFile.row(2).headers().size(), 0); assertEquals(csvFile.row(2).fieldCount(), 2); assertEquals(csvFile.row(2).field(0), "r21"); assertEquals(csvFile.row(2).field(1), "r22"); } public void test_of_simple_with_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), true); ImmutableList<String> headers = csvFile.headers(); assertEquals(headers.size(), 2); assertEquals(headers.get(0), "h1"); assertEquals(headers.get(1), "h2"); assertEquals(csvFile.rowCount(), 2); assertEquals(csvFile.row(0).headers(), headers); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "r11"); assertEquals(csvFile.row(0).field(1), "r12"); assertEquals(csvFile.row(1).headers(), headers); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r21"); assertEquals(csvFile.row(1).field(1), "r22"); assertEquals(csvFile.row(0).getField("h1"), "r11"); assertEquals(csvFile.row(0).getField("h2"), "r12"); assertEquals(csvFile.row(1).getField("h1"), "r21"); assertEquals(csvFile.row(1).getField("h2"), "r22"); assertThrowsIllegalArg(() -> csvFile.row(0).getField("zzz")); assertEquals(csvFile.row(0).findField("h1"), Optional.of("r11")); assertEquals(csvFile.row(0).findField("h2"), Optional.of("r12")); assertEquals(csvFile.row(1).findField("h1"), Optional.of("r21")); assertEquals(csvFile.row(1).findField("h2"), Optional.of("r22")); assertEquals(csvFile.row(0).findField("zzz"), Optional.empty()); assertEquals(csvFile.row(0).getField(Pattern.compile("h[13]")), "r11"); assertEquals(csvFile.row(0).getField(Pattern.compile("h[24]")), "r12"); assertThrowsIllegalArg(() -> csvFile.row(0).getField(Pattern.compile("zzz"))); assertEquals(csvFile.row(0).findField(Pattern.compile("h[13]")), Optional.of("r11")); assertEquals(csvFile.row(0).findField(Pattern.compile("h[24]")), Optional.of("r12")); assertEquals(csvFile.row(0).findField(Pattern.compile("zzz")), Optional.empty()); assertEquals(csvFile.row(0).subRow(0).fieldCount(), 2); assertEquals(csvFile.row(0).subRow(1).fieldCount(), 1); assertEquals(csvFile.row(0).subRow(2).fieldCount(), 0); assertEquals(csvFile.row(0).subRow(0, 0).fieldCount(), 0); assertEquals(csvFile.row(0).subRow(0, 1).fieldCount(), 1); assertEquals(csvFile.row(0).subRow(2, 2).fieldCount(), 0); } public void test_of_duplicate_headers() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV5), true); assertEquals(csvFile.headers(), ImmutableList.of("a", "b", "c", "b", "c")); assertEquals(csvFile.row(0).getField("a"), "aa"); assertEquals(csvFile.row(0).getField("b"), "b1"); assertEquals(csvFile.row(0).getField("c"), "c1"); assertEquals(csvFile.row(0).subRow(1, 3).getField("b"), "b1"); assertEquals(csvFile.row(0).subRow(1, 3).getField("c"), "c1"); assertEquals(csvFile.row(0).subRow(3).getField("b"), "b2"); assertEquals(csvFile.row(0).subRow(3).getField("c"), "c2"); } public void test_of_short_data_row() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV6), true); assertEquals(csvFile.headers(), ImmutableList.of("a", "b", "c")); assertEquals(csvFile.row(0).getField("a"), "r11"); assertEquals(csvFile.row(0).getField("b"), ""); assertEquals(csvFile.row(0).getField("c"), ""); assertEquals(csvFile.row(0).field(0), "r11"); assertEquals(csvFile.row(0).field(1), ""); assertEquals(csvFile.row(0).field(2), ""); assertThrows(() -> csvFile.row(0).field(4), IndexOutOfBoundsException.class); assertEquals(csvFile.row(1).getField("a"), "r21"); assertEquals(csvFile.row(1).getField("b"), "r22"); assertEquals(csvFile.row(1).getField("c"), ""); } public void test_of_comment_blank_no_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV2), false); assertEquals(csvFile.headers().size(), 0); assertEquals(csvFile.rowCount(), 2); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "h1"); assertEquals(csvFile.row(0).field(1), "h2"); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r21"); assertEquals(csvFile.row(1).field(1), "r22"); } public void test_of_comment_blank_with_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV2), true); ImmutableList<String> headers = csvFile.headers(); assertEquals(headers.size(), 2); assertEquals(headers.get(0), "h1"); assertEquals(headers.get(1), "h2"); assertEquals(csvFile.rows().size(), 1); assertEquals(csvFile.rowCount(), 1); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "r21"); assertEquals(csvFile.row(0).field(1), "r22"); assertEquals(csvFile.rows().get(0), csvFile.row(0)); } public void test_of_simple_no_header_access_by_field() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), false); assertEquals(csvFile.row(0).findField("h1"), Optional.empty()); assertThrowsIllegalArg(() -> csvFile.row(0).getField("h1")); } public void test_of_simple_with_header_access_by_invalid_field() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), true); assertEquals(csvFile.row(0).findField("h3"), Optional.empty()); assertThrowsIllegalArg(() -> csvFile.row(0).getField("h3")); } public void test_of_blank_row() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV3), false); assertEquals(csvFile.rowCount(), 2); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "r11"); assertEquals(csvFile.row(0).field(1), "r12"); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "r21"); assertEquals(csvFile.row(1).field(1), "r22"); } public void test_of_quoting() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV4), false); assertEquals(csvFile.rowCount(), 3); assertEquals(csvFile.row(0).fieldCount(), 2); assertEquals(csvFile.row(0).field(0), "alpha"); assertEquals(csvFile.row(0).field(1), "be, \"at\", one"); assertEquals(csvFile.row(1).fieldCount(), 2); assertEquals(csvFile.row(1).field(0), "alpha\",\"be\""); assertEquals(csvFile.row(1).field(1), "\"at\", one"); assertEquals(csvFile.row(2).fieldCount(), 2); assertEquals(csvFile.row(2).field(0), "r21"); assertEquals(csvFile.row(2).field(1), " r22 "); } public void test_of_quoting_mismatched() { assertThrowsIllegalArg(() -> CsvFile.of(CharSource.wrap("\"alpha"), false)); assertThrowsIllegalArg(() -> CsvFile.of(CharSource.wrap("\"al\"pha"), false)); assertThrowsIllegalArg(() -> CsvFile.of(CharSource.wrap("\"al\"\"pha"), false)); assertThrowsIllegalArg(() -> CsvFile.of(CharSource.wrap("\"al,pha"), false)); } //------------------------------------------------------------------------- public void test_of_lists_noHeader() { List<String> headers = Collections.emptyList(); List<List<String>> rows = Arrays.asList(Arrays.asList("a", "x"), Arrays.asList("b", "y")); CsvFile csvFile = CsvFile.of(headers, rows); assertEquals(csvFile.headers(), headers); assertEquals(csvFile.rows().size(), 2); assertEquals(csvFile.row(0).fields(), Arrays.asList("a", "x")); assertEquals(csvFile.row(1).fields(), Arrays.asList("b", "y")); } public void test_of_lists_noHeaderNoRows() { List<String> headers = Collections.emptyList(); List<List<String>> rows = Collections.emptyList(); CsvFile csvFile = CsvFile.of(headers, rows); assertEquals(csvFile.headers(), headers); assertEquals(csvFile.rows(), rows); } public void test_of_lists_header() { List<String> headers = Arrays.asList("1", "2"); List<List<String>> rows = Arrays.asList(Arrays.asList("a", "x"), Arrays.asList("b", "y")); CsvFile csvFile = CsvFile.of(headers, rows); assertEquals(csvFile.headers(), headers); assertEquals(csvFile.rows().size(), 2); assertEquals(csvFile.row(0).fields(), Arrays.asList("a", "x")); assertEquals(csvFile.row(1).fields(), Arrays.asList("b", "y")); } public void test_of_lists_sizeMismatch() { List<String> headers = Arrays.asList("1", "2"); List<List<String>> rows = Arrays.asList(Arrays.asList("a", "x"), Arrays.asList("b")); assertThrowsIllegalArg(() -> CsvFile.of(headers, rows)); } //------------------------------------------------------------------------- public void test_of_empty_no_header_reader() { CsvFile csvFile = CsvFile.of(new StringReader(""), false, ','); assertEquals(csvFile.headers().size(), 0); assertEquals(csvFile.rowCount(), 0); } //------------------------------------------------------------------------- public void test_equalsHashCodeToString() { CsvFile a1 = CsvFile.of(CharSource.wrap(CSV1), true); CsvFile a2 = CsvFile.of(CharSource.wrap(CSV1), true); CsvFile b = CsvFile.of(CharSource.wrap(CSV2), true); CsvFile c = CsvFile.of(CharSource.wrap(CSV3), false); // file assertEquals(a1.equals(a1), true); assertEquals(a1.equals(a2), true); assertEquals(a1.equals(b), false); assertEquals(a1.equals(c), false); assertEquals(a1.equals(null), false); assertEquals(a1.equals(""), false); assertEquals(a1.hashCode(), a2.hashCode()); assertNotNull(a1.toString()); // row assertEquals(a1.row(0).equals(a1.row(0)), true); assertEquals(a1.row(0).equals(a2.row(0)), true); assertEquals(a1.row(0).equals(b.row(0)), false); assertEquals(c.row(0).equals(c.row(1)), false); assertEquals(a1.row(0).equals(""), false); assertEquals(a1.row(0).equals(null), false); assertEquals(a1.row(0).hashCode(), a2.row(0).hashCode()); assertNotNull(a1.row(0).toString()); } }