/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.examples.regression;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.testng.Assert;
import com.google.common.base.Strings;
import com.opengamma.strata.collect.Messages;
/**
* Utility class for trade report regression tests.
*/
public final class TradeReportRegressionTestUtils {
/**
* Restricted constructor.
*/
private TradeReportRegressionTestUtils() {
}
public static void assertAsciiTableEquals(String actual, String expected) {
List<String> actualLines = toLines(actual);
List<String> expectedLines = toLines(expected);
int maxLines = Math.max(actualLines.size(), expectedLines.size());
for (int i = 0; i < maxLines; i++) {
if (i >= actualLines.size()) {
String expectedLine = expectedLines.get(i);
Assert.fail(Messages.format("No more results but expected:\n{}", expectedLine));
}
if (i >= expectedLines.size()) {
String actualLine = actualLines.get(i);
Assert.fail(Messages.format("Expected end of results but got:\n{}", actualLine));
}
String actualLine = actualLines.get(i);
String expectedLine = expectedLines.get(i);
if (!actualLine.equals(expectedLine)) {
if (isDataRow(expectedLine) && isDataRow(actualLine)) {
List<String> actualCells = toCells(actualLine);
List<String> expectedCells = toCells(expectedLine);
Assert.assertEquals(actualCells, expectedCells, "Mismatch at line " + i);
} else {
Assert.fail(Messages.format(
"Mismatch at line {}:\n" +
"Expected:\n" +
"{}\n" +
"Got:\n" +
"{}\n" +
"Expected table:\n" +
"{}\n" +
"Actual table:\n" +
"{}",
i,
expectedLine,
actualLine,
expected,
actual));
}
}
}
}
private static List<String> toLines(String asciiTable) {
return Arrays.asList(asciiTable.split("\\r?\\n")).stream()
.filter(line -> !Strings.nullToEmpty(line).trim().isEmpty())
.collect(Collectors.toList());
}
private static boolean isDataRow(String asciiLine) {
return asciiLine.contains("|");
}
private static List<String> toCells(String asciiLine) {
return Arrays.asList(asciiLine.split("\\|"));
}
}