diff --git a/.gitignore b/.gitignore index 06906be758..94fd6fca9e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ tests/classes/ tests/output/ test-output/ .DS_Store +TempTest.java # IntelliJ config files *.iws diff --git a/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvFile.java b/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvFile.java index bfb5a74349..4ebb7c7337 100644 --- a/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvFile.java +++ b/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvFile.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.io.Reader; import java.io.UncheckedIOException; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -470,24 +471,36 @@ public CsvRow row(int index) { } /** - * Checks if the header is known. + * Checks if the header is present in the file. *

* Matching is case insensitive. * * @param header the column header to match - * @return true if the header is known + * @return true if the header is present */ public boolean containsHeader(String header) { return searchHeaders.containsKey(header.toLowerCase(Locale.ENGLISH)); } /** - * Checks if the header pattern is known. + * Checks if the headers are present in the file. + *

+ * Matching is case insensitive. + * + * @param headers the column headers to match + * @return true if all the headers are present + */ + public boolean containsHeaders(Collection headers) { + return headers.stream().allMatch(this::containsHeader); + } + + /** + * Checks if the header pattern is present in the file. *

* Matching is case insensitive. * * @param headerPattern the header pattern to match - * @return true if the header is known + * @return true if the header is present */ public boolean containsHeader(Pattern headerPattern) { for (int i = 0; i < headers.size(); i++) { diff --git a/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvIterator.java b/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvIterator.java index 9b6e8cd04c..e9a0ef5622 100644 --- a/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvIterator.java +++ b/modules/collect/src/main/java/com/opengamma/strata/collect/io/CsvIterator.java @@ -10,6 +10,7 @@ import java.io.Reader; import java.io.UncheckedIOException; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.NoSuchElementException; @@ -227,24 +228,36 @@ public ImmutableList headers() { } /** - * Checks if the header is known. + * Checks if the header is present in the file. *

* Matching is case insensitive. * * @param header the column header to match - * @return true if the header is known + * @return true if the header is present */ public boolean containsHeader(String header) { return searchHeaders.containsKey(header.toLowerCase(Locale.ENGLISH)); } /** - * Checks if the header pattern is known. + * Checks if the headers are present in the file. + *

+ * Matching is case insensitive. + * + * @param headers the column headers to match + * @return true if all the headers are present + */ + public boolean containsHeaders(Collection headers) { + return headers.stream().allMatch(this::containsHeader); + } + + /** + * Checks if the header pattern is present in the file. *

* Matching is case insensitive. * * @param headerPattern the header pattern to match - * @return true if the header is known + * @return true if the header is present */ public boolean containsHeader(Pattern headerPattern) { for (int i = 0; i < headers.size(); i++) { diff --git a/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvFileTest.java b/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvFileTest.java index ef26c94d14..4a5c139e26 100644 --- a/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvFileTest.java +++ b/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvFileTest.java @@ -24,6 +24,7 @@ import org.junit.jupiter.params.provider.MethodSource; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.io.CharSource; import com.google.common.io.Files; @@ -92,8 +93,10 @@ public void test_of_empty_no_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(""), false); assertThat(csvFile.headers().size()).isEqualTo(0); assertThat(csvFile.rowCount()).isEqualTo(0); - assertThat(csvFile.containsHeader("Foo")).isEqualTo(false); - assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isEqualTo(false); + assertThat(csvFile.containsHeader("Foo")).isFalse(); + assertThat(csvFile.containsHeaders(ImmutableSet.of())).isTrue(); + assertThat(csvFile.containsHeaders(ImmutableSet.of("foo"))).isFalse(); + assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isFalse(); } @Test @@ -106,8 +109,8 @@ public void test_of_simple_no_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), false); assertThat(csvFile.headers().size()).isEqualTo(0); assertThat(csvFile.rowCount()).isEqualTo(4); - assertThat(csvFile.containsHeader("Foo")).isEqualTo(false); - assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isEqualTo(false); + assertThat(csvFile.containsHeader("Foo")).isFalse(); + assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isFalse(); assertThat(csvFile.row(0).lineNumber()).isEqualTo(1); assertThat(csvFile.row(1).lineNumber()).isEqualTo(2); assertThat(csvFile.row(2).lineNumber()).isEqualTo(3); @@ -135,8 +138,8 @@ public void test_of_simple_no_header() { public void test_of_simple_no_header_tabs() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1T), false, '\t'); assertThat(csvFile.headers().size()).isEqualTo(0); - assertThat(csvFile.containsHeader("Foo")).isEqualTo(false); - assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isEqualTo(false); + assertThat(csvFile.containsHeader("Foo")).isFalse(); + assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isFalse(); assertThat(csvFile.rowCount()).isEqualTo(3); assertThat(csvFile.row(0).lineNumber()).isEqualTo(1); assertThat(csvFile.row(1).lineNumber()).isEqualTo(2); @@ -159,9 +162,13 @@ public void test_of_simple_no_header_tabs() { @Test public void test_of_simple_with_header() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV1), true); - assertThat(csvFile.containsHeader("Foo")).isEqualTo(false); - assertThat(csvFile.containsHeader("h1")).isEqualTo(true); - assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isEqualTo(false); + assertThat(csvFile.containsHeader("Foo")).isFalse(); + assertThat(csvFile.containsHeader("h1")).isTrue(); + assertThat(csvFile.containsHeaders(ImmutableSet.of())).isTrue(); + assertThat(csvFile.containsHeaders(ImmutableSet.of("h1"))).isTrue(); + assertThat(csvFile.containsHeaders(ImmutableSet.of("h1", "h2"))).isTrue(); + assertThat(csvFile.containsHeaders(ImmutableSet.of("h1", "h2", "h3"))).isFalse(); + assertThat(csvFile.containsHeader(Pattern.compile("Foo"))).isFalse(); assertThat(csvFile.containsHeader(Pattern.compile("h[0-9]"))).isTrue(); ImmutableList headers = csvFile.headers(); assertThat(headers.size()).isEqualTo(2); @@ -238,8 +245,8 @@ public void test_of_simple_with_header() { public void test_of_duplicate_headers() { CsvFile csvFile = CsvFile.of(CharSource.wrap(CSV5), true); assertThat(csvFile.headers()).isEqualTo(ImmutableList.of("a", "b", "c", "b", "c")); - assertThat(csvFile.containsHeader("Foo")).isEqualTo(false); - assertThat(csvFile.containsHeader("a")).isEqualTo(true); + assertThat(csvFile.containsHeader("Foo")).isFalse(); + assertThat(csvFile.containsHeader("a")).isTrue(); assertThat(csvFile.row(0).getField("a")).isEqualTo("aa"); assertThat(csvFile.row(0).getField("b")).isEqualTo("b1"); assertThat(csvFile.row(0).getField("c")).isEqualTo("c1"); @@ -556,21 +563,21 @@ public void test_equalsHashCodeToString() { CsvFile b = CsvFile.of(CharSource.wrap(CSV2), true); CsvFile c = CsvFile.of(CharSource.wrap(CSV3), false); // file - assertThat(a1.equals(a1)).isEqualTo(true); - assertThat(a1.equals(a2)).isEqualTo(true); - assertThat(a1.equals(b)).isEqualTo(false); - assertThat(a1.equals(c)).isEqualTo(false); - assertThat(a1.equals(null)).isEqualTo(false); - assertThat(a1.equals(ANOTHER_TYPE)).isEqualTo(false); + assertThat(a1.equals(a1)).isTrue(); + assertThat(a1.equals(a2)).isTrue(); + assertThat(a1.equals(b)).isFalse(); + assertThat(a1.equals(c)).isFalse(); + assertThat(a1.equals(null)).isFalse(); + assertThat(a1.equals(ANOTHER_TYPE)).isFalse(); assertThat(a1.hashCode()).isEqualTo(a2.hashCode()); assertThat(a1.toString()).isNotNull(); // row - assertThat(a1.row(0).equals(a1.row(0))).isEqualTo(true); - assertThat(a1.row(0).equals(a2.row(0))).isEqualTo(true); - assertThat(a1.row(0).equals(b.row(0))).isEqualTo(false); - assertThat(c.row(0).equals(c.row(1))).isEqualTo(false); - assertThat(a1.row(0).equals(ANOTHER_TYPE)).isEqualTo(false); - assertThat(a1.row(0).equals(null)).isEqualTo(false); + assertThat(a1.row(0).equals(a1.row(0))).isTrue(); + assertThat(a1.row(0).equals(a2.row(0))).isTrue(); + assertThat(a1.row(0).equals(b.row(0))).isFalse(); + assertThat(c.row(0).equals(c.row(1))).isFalse(); + assertThat(a1.row(0).equals(ANOTHER_TYPE)).isFalse(); + assertThat(a1.row(0).equals(null)).isFalse(); assertThat(a1.row(0).hashCode()).isEqualTo(a2.row(0).hashCode()); assertThat(a1.row(0)).isNotNull(); } diff --git a/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvIteratorTest.java b/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvIteratorTest.java index e83839ebd1..cf84e0982d 100644 --- a/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvIteratorTest.java +++ b/modules/collect/src/test/java/com/opengamma/strata/collect/io/CsvIteratorTest.java @@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.io.CharSource; import com.google.common.io.Files; @@ -76,9 +77,9 @@ public void test_of_ioException() { public void test_of_empty_no_header() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(""), false)) { assertThat(csvFile.headers().size()).isEqualTo(0); - assertThat(csvFile.containsHeader("a")).isEqualTo(false); - assertThat(csvFile.hasNext()).isEqualTo(false); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.containsHeader("a")).isFalse(); + assertThat(csvFile.hasNext()).isFalse(); + assertThat(csvFile.hasNext()).isFalse(); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.peek()); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.next()); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.next()); @@ -95,8 +96,8 @@ public void test_of_empty_with_header() { public void test_of_simple_no_header() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), false)) { assertThat(csvFile.headers().size()).isEqualTo(0); - assertThat(csvFile.hasNext()).isEqualTo(true); - assertThat(csvFile.hasNext()).isEqualTo(true); + assertThat(csvFile.hasNext()).isTrue(); + assertThat(csvFile.hasNext()).isTrue(); CsvRow peeked = csvFile.peek(); CsvRow row0 = csvFile.next(); assertThat(row0).isEqualTo(peeked); @@ -117,7 +118,7 @@ public void test_of_simple_no_header() { assertThat(row2.fieldCount()).isEqualTo(2); assertThat(row2.field(0)).isEqualTo("r21"); assertThat(row2.field(1)).isEqualTo("r22"); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.peek()); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.peek()); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.next()); @@ -135,19 +136,19 @@ public void test_of_simple_no_header_tabs() { assertThat(row0.fieldCount()).isEqualTo(2); assertThat(row0.field(0)).isEqualTo("h1"); assertThat(row0.field(1)).isEqualTo("h2"); - assertThat(csvFile.hasNext()).isEqualTo(true); + assertThat(csvFile.hasNext()).isTrue(); CsvRow row1 = csvFile.next(); assertThat(row1.headers().size()).isEqualTo(0); assertThat(row1.fieldCount()).isEqualTo(2); assertThat(row1.field(0)).isEqualTo("r11"); assertThat(row1.field(1)).isEqualTo("r12"); - assertThat(csvFile.hasNext()).isEqualTo(true); + assertThat(csvFile.hasNext()).isTrue(); CsvRow row2 = csvFile.next(); assertThat(row2.headers().size()).isEqualTo(0); assertThat(row2.fieldCount()).isEqualTo(2); assertThat(row2.field(0)).isEqualTo("r21"); assertThat(row2.field(1)).isEqualTo("r22"); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.next()); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.next()); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> csvFile.remove()); @@ -159,11 +160,14 @@ public void test_of_simple_with_header() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), true)) { ImmutableList headers = csvFile.headers(); assertThat(headers.size()).isEqualTo(2); - assertThat(csvFile.containsHeader("h1")).isEqualTo(true); - assertThat(csvFile.containsHeader("h2")).isEqualTo(true); - assertThat(csvFile.containsHeader("a")).isEqualTo(false); - assertThat(csvFile.containsHeader(Pattern.compile("h."))).isEqualTo(true); - assertThat(csvFile.containsHeader(Pattern.compile("a"))).isEqualTo(false); + assertThat(csvFile.containsHeader("h1")).isTrue(); + assertThat(csvFile.containsHeader("h2")).isTrue(); + assertThat(csvFile.containsHeader("a")).isFalse(); + assertThat(csvFile.containsHeaders(ImmutableSet.of("h1"))).isTrue(); + assertThat(csvFile.containsHeaders(ImmutableSet.of("h1", "h2"))).isTrue(); + assertThat(csvFile.containsHeaders(ImmutableSet.of("h1", "h2", "h3"))).isFalse(); + assertThat(csvFile.containsHeader(Pattern.compile("h."))).isTrue(); + assertThat(csvFile.containsHeader(Pattern.compile("a"))).isFalse(); assertThat(headers.get(0)).isEqualTo("h1"); assertThat(headers.get(1)).isEqualTo("h2"); CsvRow peeked = csvFile.peek(); @@ -180,7 +184,7 @@ public void test_of_simple_with_header() { assertThat(row1.fieldCount()).isEqualTo(2); assertThat(row1.field(0)).isEqualTo("r21"); assertThat(row1.field(1)).isEqualTo("r22"); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.peek()); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.peek()); assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> csvFile.next()); @@ -193,7 +197,7 @@ public void test_of_simple_with_header() { public void test_of_comment_blank_no_header() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV2), false)) { assertThat(csvFile.headers().size()).isEqualTo(0); - assertThat(csvFile.hasNext()).isEqualTo(true); + assertThat(csvFile.hasNext()).isTrue(); CsvRow row0 = csvFile.next(); assertThat(row0.lineNumber()).isEqualTo(1); assertThat(row0.fieldCount()).isEqualTo(2); @@ -204,7 +208,7 @@ public void test_of_comment_blank_no_header() { assertThat(row1.fieldCount()).isEqualTo(2); assertThat(row1.field(0)).isEqualTo("r21"); assertThat(row1.field(1)).isEqualTo("r22"); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); } } @@ -215,20 +219,20 @@ public void test_of_comment_blank_with_header() { assertThat(headers.size()).isEqualTo(2); assertThat(headers.get(0)).isEqualTo("h1"); assertThat(headers.get(1)).isEqualTo("h2"); - assertThat(csvFile.hasNext()).isEqualTo(true); + assertThat(csvFile.hasNext()).isTrue(); CsvRow row0 = csvFile.next(); assertThat(row0.lineNumber()).isEqualTo(5); assertThat(row0.fieldCount()).isEqualTo(2); assertThat(row0.field(0)).isEqualTo("r21"); assertThat(row0.field(1)).isEqualTo("r22"); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); } } @Test public void test_of_blank_row() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV3), false)) { - assertThat(csvFile.hasNext()).isEqualTo(true); + assertThat(csvFile.hasNext()).isTrue(); CsvRow row0 = csvFile.next(); assertThat(row0.fieldCount()).isEqualTo(2); assertThat(row0.field(0)).isEqualTo("r11"); @@ -237,14 +241,14 @@ public void test_of_blank_row() { assertThat(row1.fieldCount()).isEqualTo(2); assertThat(row1.field(0)).isEqualTo("r21"); assertThat(row1.field(1)).isEqualTo("r22"); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); } } @Test public void test_of_headerComment() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV4), true)) { - assertThat(csvFile.hasNext()).isEqualTo(true); + assertThat(csvFile.hasNext()).isTrue(); CsvRow row0 = csvFile.next(); assertThat(row0.lineNumber()).isEqualTo(3); assertThat(csvFile.headers().size()).isEqualTo(2); @@ -261,7 +265,7 @@ public void test_of_headerComment() { public void test_of_empty_no_header_reader() { try (CsvIterator csvFile = CsvIterator.of(new StringReader(""), false, ',')) { assertThat(csvFile.headers().size()).isEqualTo(0); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); } } @@ -291,7 +295,7 @@ public void test_nextBatch1() { assertThat(row1.field(1)).isEqualTo("r22"); List d = csvFile.nextBatch(2); assertThat(d.size()).isEqualTo(0); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); } } @@ -316,8 +320,8 @@ public void test_nextBatch2() { assertThat(row1.field(1)).isEqualTo("r22"); List d = csvFile.nextBatch(2); assertThat(d.size()).isEqualTo(0); - assertThat(csvFile.hasNext()).isEqualTo(false); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); + assertThat(csvFile.hasNext()).isFalse(); } } @@ -372,7 +376,7 @@ public void test_asStream_simple_no_header() { try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), false)) { assertThat(csvFile.headers().size()).isEqualTo(0); List rows = csvFile.asStream().collect(toList()); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); assertThat(rows.size()).isEqualTo(3); CsvRow row0 = rows.get(0); assertThat(row0.headers().size()).isEqualTo(0); @@ -400,7 +404,7 @@ public void test_asStream_simple_with_header() { assertThat(headers.get(0)).isEqualTo("h1"); assertThat(headers.get(1)).isEqualTo("h2"); List rows = csvFile.asStream().collect(toList()); - assertThat(csvFile.hasNext()).isEqualTo(false); + assertThat(csvFile.hasNext()).isFalse(); assertThat(rows.size()).isEqualTo(2); CsvRow row0 = rows.get(0); assertThat(row0.headers()).isEqualTo(headers);