package com.berryworks.edireader;
import com.berryworks.edireader.benchmark.EDITestData;
import com.berryworks.edireader.util.BranchingWriter;
import org.junit.Before;
import org.junit.Test;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class AnsiFAGeneratorTest {
public static final String TEST_DATA_997 = "ISA~00~ ~00~ ~ZZ~58401 ~ZZ~04000 ~999999~9999~U~00204~000038449~0~P~<$" +
"GS~FA~58401~04000~999999~9999~12345~X~002040CHRY$" +
"ST~997~0001$" +
"AK1~AG~38327$" +
"AK2~824~000042460$AK5~A$" +
"AK9~A~1~1~1$SE~6~0001$" +
"GE~1~12345$" +
"IEA~1~000038449$";
private MyAnsiFAGenerator generator;
private StringWriter output;
private BranchingWriter ackStream;
private StandardReader ansiReader;
private SyntaxDescriptor syntaxDescriptor;
@Before
public void setUp() {
output = new StringWriter();
ackStream = new BranchingWriter(output);
ansiReader = new AnsiReader();
syntaxDescriptor = new SyntaxDescriptor();
syntaxDescriptor.setDelimiter('^');
ansiReader.setAcknowledgmentSyntaxDescriptor(syntaxDescriptor);
generator = new MyAnsiFAGenerator(ansiReader, ackStream);
}
@Test
public void canGenerate997() throws IOException, SAXException {
ansiReader = new AnsiReader();
ansiReader.setContentHandler(new DefaultHandler());
ansiReader.setAcknowledgment(ackStream);
ansiReader.parse(EDITestData.getAnsiInputSource());
// assertEquals(TEST_DATA_997, output.toString());
assertLikeness(TEST_DATA_997, output.toString());
}
@Test
public void canGenerate997FromVariableLengthISAInput() throws IOException, SAXException {
ansiReader = new AnsiReader();
ansiReader.setContentHandler(new DefaultHandler());
ansiReader.setAcknowledgment(ackStream);
String ansiInterchange = EDITestData.getAnsiInterchange();
ansiInterchange = ansiInterchange.replaceAll("58401 ", "58401");
final InputSource inputSource = new InputSource(new StringReader(ansiInterchange));
ansiReader.parse(inputSource);
assertLikeness(TEST_DATA_997, output.toString());
}
@Test
public void canGenerate997WithDelimiterDifferentThanInput() throws IOException, SAXException {
ansiReader = new AnsiReader();
ansiReader.setContentHandler(new DefaultHandler());
final SyntaxDescriptor syntaxDescriptor = new SyntaxDescriptor();
syntaxDescriptor.setDelimiter('-');
ansiReader.setAcknowledgment(ackStream, syntaxDescriptor);
ansiReader.parse(EDITestData.getAnsiInputSource());
// assertEquals(TEST_DATA_997, output.toString());
assertLikeness(TEST_DATA_997.replaceAll("~", "-"), output.toString());
}
@Test
public void canBuildPreambleWithFixedLengthISA() throws IOException {
final String original = "ISA^00^ ^00^ ^01^007941230 ^ZZ^8145 ^100903^0143^U^00401^500009740^0^P^|~";
final String expected = "ISA^00^ ^00^ ^ZZ^8145 ^01^007941230 ^999999^9999^U^00401^500009740^0^P^|~";
generator._generateAcknowledgementPreamble(original, "group sender", "group receiver", 8, "group version");
assertEquals(expected.substring(0, 105), maskDate(output.toString().substring(0, 105)));
}
@Test
public void canBuildPreambleWithVariableLengthISA() throws IOException {
final String original = "ISA^00^ ^00^ ^01^007941230 ^ZZ^8145 ^100903^0143^U^00401^500009740^0^P^|~";
final String expected = "ISA^00^ ^00^ ^ZZ^8145 ^01^007941230 ^999999^9999^U^00401^500009740^0^P^|~";
generator._generateAcknowledgementPreamble(original, "group sender", "group receiver", 8, "group version");
assertEquals(expected.substring(0, 105), maskDate(output.toString().substring(0, 105)));
}
@Test
public void canBuildPreambleWithReallyOddDelimiter() throws IOException {
final String original = "ISAx00x x00x x01x007941230 xZZx8145 x100903x0143xUx00401x500009740x0xPx|~";
final String expected = "ISAx00x x00x xZZx8145 x01x007941230 x999999x9999xUx00401x500009740x0xPx|~";
syntaxDescriptor.setDelimiter('x');
generator._generateAcknowledgementPreamble(original, "group sender", "group receiver", 8, "group version");
assertEquals(expected.substring(0, 105), maskDate(output.toString().substring(0, 105)));
}
private String maskDate(String isa) {
final char delimiter = isa.charAt(3);
final String firstPart = isa.substring(0, 70);
final String lastPart = isa.substring(81);
return firstPart + "999999" + delimiter + "9999" + lastPart;
}
class MyAnsiFAGenerator extends AnsiFAGenerator {
public MyAnsiFAGenerator(StandardReader ansiReader, BranchingWriter ackStream) {
super(ansiReader, ackStream);
}
public void _generateAcknowledgementPreamble(String firstSegment,
String groupSender, String groupReceiver, int groupDateLength,
String groupVersion) throws IOException {
generateAcknowledgementPreamble(firstSegment, groupSender, groupReceiver, groupDateLength, groupVersion);
}
}
private void assertLikeness(String expected, String actual) {
assertEquals(expected.length(), actual.length());
for (int i = 0; i < expected.length(); i++) {
final char expectedChar = expected.charAt(i);
final char actualChar = actual.charAt(i);
if (expectedChar == actualChar) {
continue;
}
if (expectedChar == '9') {
// 9 is interpreted as a wildcard matching any digit
assertTrue("Digit expected at index " + i, Character.isDigit(actualChar));
continue;
}
assertEquals("Character mismatch at index " + i, String.valueOf(expectedChar), String.valueOf(actualChar));
}
}
}