/**
* Copyright (C) 2016 - 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 java.util.stream.Collectors.toList;
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.List;
import java.util.NoSuchElementException;
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 CsvIterator}.
*/
@Test
public class CsvIteratorTest {
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";
//-------------------------------------------------------------------------
public void test_of_ioException() {
assertThrows(
() -> CsvIterator.of(Files.asCharSource(new File("src/test/resources"), StandardCharsets.UTF_8), false),
UncheckedIOException.class);
}
public void test_of_empty_no_header() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(""), false)) {
assertEquals(csvFile.headers().size(), 0);
assertEquals(csvFile.hasNext(), false);
assertEquals(csvFile.hasNext(), false);
assertThrows(() -> csvFile.peek(), NoSuchElementException.class);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.remove(), UnsupportedOperationException.class);
}
}
public void test_of_empty_with_header() {
assertThrowsIllegalArg(() -> CsvIterator.of(CharSource.wrap(""), true));
}
public void test_of_simple_no_header() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), false)) {
assertEquals(csvFile.headers().size(), 0);
assertEquals(csvFile.hasNext(), true);
assertEquals(csvFile.hasNext(), true);
CsvRow peeked = csvFile.peek();
CsvRow row0 = csvFile.next();
assertEquals(row0, peeked);
assertEquals(row0.headers().size(), 0);
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "h1");
assertEquals(row0.field(1), "h2");
CsvRow row1 = csvFile.next();
assertEquals(row1.headers().size(), 0);
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r11");
assertEquals(row1.field(1), "r12");
CsvRow row2 = csvFile.next();
assertEquals(row2.headers().size(), 0);
assertEquals(row2.fieldCount(), 2);
assertEquals(row2.field(0), "r21");
assertEquals(row2.field(1), "r22");
assertEquals(csvFile.hasNext(), false);
assertThrows(() -> csvFile.peek(), NoSuchElementException.class);
assertThrows(() -> csvFile.peek(), NoSuchElementException.class);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.remove(), UnsupportedOperationException.class);
}
}
public void test_of_simple_no_header_tabs() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1T), false, '\t')) {
assertEquals(csvFile.headers().size(), 0);
CsvRow row0 = csvFile.next();
assertEquals(row0.headers().size(), 0);
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "h1");
assertEquals(row0.field(1), "h2");
assertEquals(csvFile.hasNext(), true);
CsvRow row1 = csvFile.next();
assertEquals(row1.headers().size(), 0);
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r11");
assertEquals(row1.field(1), "r12");
assertEquals(csvFile.hasNext(), true);
CsvRow row2 = csvFile.next();
assertEquals(row2.headers().size(), 0);
assertEquals(row2.fieldCount(), 2);
assertEquals(row2.field(0), "r21");
assertEquals(row2.field(1), "r22");
assertEquals(csvFile.hasNext(), false);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.remove(), UnsupportedOperationException.class);
}
}
public void test_of_simple_with_header() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), true)) {
ImmutableList<String> headers = csvFile.headers();
assertEquals(headers.size(), 2);
assertEquals(headers.get(0), "h1");
assertEquals(headers.get(1), "h2");
CsvRow peeked = csvFile.peek();
CsvRow row0 = csvFile.next();
assertEquals(row0, peeked);
assertEquals(row0.headers(), headers);
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "r11");
assertEquals(row0.field(1), "r12");
CsvRow row1 = csvFile.next();
assertEquals(row1.headers(), headers);
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r21");
assertEquals(row1.field(1), "r22");
assertEquals(csvFile.hasNext(), false);
assertThrows(() -> csvFile.peek(), NoSuchElementException.class);
assertThrows(() -> csvFile.peek(), NoSuchElementException.class);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.next(), NoSuchElementException.class);
assertThrows(() -> csvFile.remove(), UnsupportedOperationException.class);
}
}
public void test_of_comment_blank_no_header() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV2), false)) {
assertEquals(csvFile.headers().size(), 0);
assertEquals(csvFile.hasNext(), true);
CsvRow row0 = csvFile.next();
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "h1");
assertEquals(row0.field(1), "h2");
CsvRow row1 = csvFile.next();
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r21");
assertEquals(row1.field(1), "r22");
assertEquals(csvFile.hasNext(), false);
}
}
public void test_of_comment_blank_with_header() {
try (CsvIterator csvFile = CsvIterator.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.hasNext(), true);
CsvRow row0 = csvFile.next();
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "r21");
assertEquals(row0.field(1), "r22");
assertEquals(csvFile.hasNext(), false);
}
}
public void test_of_blank_row() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV3), false)) {
assertEquals(csvFile.hasNext(), true);
CsvRow row0 = csvFile.next();
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "r11");
assertEquals(row0.field(1), "r12");
CsvRow row1 = csvFile.next();
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r21");
assertEquals(row1.field(1), "r22");
assertEquals(csvFile.hasNext(), false);
}
}
//-------------------------------------------------------------------------
public void test_of_empty_no_header_reader() {
try (CsvIterator csvFile = CsvIterator.of(new StringReader(""), false, ',')) {
assertEquals(csvFile.headers().size(), 0);
assertEquals(csvFile.hasNext(), false);
}
}
//-------------------------------------------------------------------------
public void test_nextBatch1() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), true)) {
ImmutableList<String> headers = csvFile.headers();
assertEquals(headers.size(), 2);
assertEquals(headers.get(0), "h1");
assertEquals(headers.get(1), "h2");
List<CsvRow> a = csvFile.nextBatch(0);
assertEquals(a.size(), 0);
List<CsvRow> b = csvFile.nextBatch(1);
assertEquals(b.size(), 1);
CsvRow row0 = b.get(0);
assertEquals(row0.headers(), headers);
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "r11");
assertEquals(row0.field(1), "r12");
List<CsvRow> c = csvFile.nextBatch(2);
assertEquals(c.size(), 1);
CsvRow row1 = c.get(0);
assertEquals(row1.headers(), headers);
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r21");
assertEquals(row1.field(1), "r22");
List<CsvRow> d = csvFile.nextBatch(2);
assertEquals(d.size(), 0);
assertEquals(csvFile.hasNext(), false);
}
}
public void test_nextBatch2() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), true)) {
ImmutableList<String> headers = csvFile.headers();
assertEquals(headers.size(), 2);
assertEquals(headers.get(0), "h1");
assertEquals(headers.get(1), "h2");
List<CsvRow> a = csvFile.nextBatch(3);
assertEquals(a.size(), 2);
CsvRow row0 = a.get(0);
assertEquals(row0.headers(), headers);
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "r11");
assertEquals(row0.field(1), "r12");
CsvRow row1 = a.get(1);
assertEquals(row1.headers(), headers);
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r21");
assertEquals(row1.field(1), "r22");
List<CsvRow> d = csvFile.nextBatch(2);
assertEquals(d.size(), 0);
assertEquals(csvFile.hasNext(), false);
assertEquals(csvFile.hasNext(), false);
}
}
//-------------------------------------------------------------------------
public void test_asStream_empty_no_header() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(""), false)) {
assertEquals(csvFile.asStream().collect(toList()).size(), 0);
}
}
public void test_asStream_simple_no_header() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), false)) {
assertEquals(csvFile.headers().size(), 0);
List<CsvRow> rows = csvFile.asStream().collect(toList());
assertEquals(csvFile.hasNext(), false);
assertEquals(rows.size(), 3);
CsvRow row0 = rows.get(0);
assertEquals(row0.headers().size(), 0);
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "h1");
assertEquals(row0.field(1), "h2");
CsvRow row1 = rows.get(1);
assertEquals(row1.headers().size(), 0);
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r11");
assertEquals(row1.field(1), "r12");
CsvRow row2 = rows.get(2);
assertEquals(row2.headers().size(), 0);
assertEquals(row2.fieldCount(), 2);
assertEquals(row2.field(0), "r21");
assertEquals(row2.field(1), "r22");
}
}
public void test_asStream_simple_with_header() {
try (CsvIterator csvFile = CsvIterator.of(CharSource.wrap(CSV1), true)) {
ImmutableList<String> headers = csvFile.headers();
assertEquals(headers.size(), 2);
assertEquals(headers.get(0), "h1");
assertEquals(headers.get(1), "h2");
List<CsvRow> rows = csvFile.asStream().collect(toList());
assertEquals(csvFile.hasNext(), false);
assertEquals(rows.size(), 2);
CsvRow row0 = rows.get(0);
assertEquals(row0.headers(), headers);
assertEquals(row0.fieldCount(), 2);
assertEquals(row0.field(0), "r11");
assertEquals(row0.field(1), "r12");
CsvRow row1 = rows.get(1);
assertEquals(row1.headers(), headers);
assertEquals(row1.fieldCount(), 2);
assertEquals(row1.field(0), "r21");
assertEquals(row1.field(1), "r22");
}
}
//-------------------------------------------------------------------------
public void test_toString() {
try (CsvIterator test = CsvIterator.of(CharSource.wrap(CSV1), true)) {
assertNotNull(test.toString());
}
}
}