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);