package com.berryworks.edireader.plugin;
import com.berryworks.edireader.EDISyntaxException;
import com.berryworks.edireader.Plugin;
import com.berryworks.edireader.demo.EDItoXML;
import org.junit.Before;
import org.junit.Test;
import java.io.StringReader;
import java.io.StringWriter;
import static org.junit.Assert.*;
public class PluginControllerImplTest {
private PluginControllerImpl controller;
private Plugin plugin;
@Before
public void setUp() {
controller = new PluginControllerImpl("TestStandard", null);
PluginControllerImpl.setDebug(true);
}
@Test
public void canLoadPluginFor110() throws EDISyntaxException {
plugin = new ANSI_110();
plugin.prepare();
assertEquals(8, plugin.getLoopDescriptors().length);
controller.setPlugin(plugin);
assertSame(plugin, controller.getPlugin());
controller.setEnabled(true);
assertTrue(controller.isEnabled());
assertEquals("Air Freight Details and Invoice", controller.getDocumentName());
assertNull(controller.getDocumentType());
controller.setDocumentType("Document Type");
assertEquals("Document Type", controller.getDocumentType());
}
@Test
public void canLoadPluginFor210() throws EDISyntaxException {
plugin = new ANSI_210();
plugin.prepare();
assertEquals(38, plugin.getLoopDescriptors().length);
controller.setPlugin(plugin);
assertSame(plugin, controller.getPlugin());
controller.setEnabled(true);
assertTrue(controller.isEnabled());
assertEquals("Motor Carrier Freight Details and Invoice", controller.getDocumentName());
assertNull(controller.getDocumentType());
controller.setDocumentType("Document Type");
assertEquals("Document Type", controller.getDocumentType());
}
@Test
public void canLoadPluginFor277() throws EDISyntaxException {
plugin = new ANSI_277();
plugin.prepare();
assertEquals(16, plugin.getLoopDescriptors().length);
controller.setPlugin(plugin);
assertSame(plugin, controller.getPlugin());
controller.setEnabled(true);
assertTrue(controller.isEnabled());
assertEquals("Health Care Claim Status Notification", controller.getDocumentName());
assertNull(controller.getDocumentType());
controller.setDocumentType("Document Type");
assertEquals("Document Type", controller.getDocumentType());
}
@Test
public void canLoadPluginFor810() throws EDISyntaxException {
plugin = new ANSI_810();
plugin.prepare();
assertEquals(85, plugin.getLoopDescriptors().length);
controller.setPlugin(plugin);
assertSame(plugin, controller.getPlugin());
controller.setEnabled(true);
assertTrue(controller.isEnabled());
assertEquals("Invoice", controller.getDocumentName());
assertNull(controller.getDocumentType());
controller.setDocumentType("Document Type");
assertEquals("Document Type", controller.getDocumentType());
}
@Test
public void canLoadPluginFor856() throws EDISyntaxException {
plugin = new ANSI_856();
plugin.prepare();
assertEquals(3, plugin.getLoopDescriptors().length);
controller.setPlugin(plugin);
assertSame(plugin, controller.getPlugin());
controller.setEnabled(true);
assertTrue(controller.isEnabled());
assertEquals("Advance Ship Notice", controller.getDocumentName());
assertNull(controller.getDocumentType());
controller.setDocumentType("Document Type");
assertEquals("Document Type", controller.getDocumentType());
}
@Test
public void canLoadPluginFor870() throws EDISyntaxException {
plugin = new ANSI_870();
plugin.prepare();
assertEquals(53, plugin.getLoopDescriptors().length);
controller.setPlugin(plugin);
assertSame(plugin, controller.getPlugin());
controller.setEnabled(true);
assertTrue(controller.isEnabled());
assertEquals("Order Status Report", controller.getDocumentName());
assertNull(controller.getDocumentType());
controller.setDocumentType("Document Type");
assertEquals("Document Type", controller.getDocumentType());
}
@Test
public void canLoadPluginFor872() throws EDISyntaxException {
plugin = new ANSI_872();
plugin.prepare();
assertEquals(19, plugin.getLoopDescriptors().length);
controller.setPlugin(plugin);
assertSame(plugin, controller.getPlugin());
controller.setEnabled(true);
assertTrue(controller.isEnabled());
assertEquals("Residential Mortgage Insurance Application", controller.getDocumentName());
assertNull(controller.getDocumentType());
controller.setDocumentType("Document Type");
assertEquals("Document Type", controller.getDocumentType());
}
@Test
public void canTransitionThrough210() throws EDISyntaxException {
plugin = new ANSI_210();
plugin.prepare();
controller.setPlugin(plugin);
controller.setEnabled(true);
assertEquals("Motor Carrier Freight Details and Invoice", controller.getDocumentName());
assertFalse(controller.transition("B3"));
assertTransition("N1", 1, "N1", "/N1", 0);
assertFalse(controller.transition("N3"));
assertFalse(controller.transition("N4"));
assertTransition("N1", 1, "N1", "/N1", 1);
assertFalse(controller.transition("N3"));
assertFalse(controller.transition("N4"));
assertTransition("N1", 1, "N1", "/N1", 1);
assertFalse(controller.transition("N3"));
assertFalse(controller.transition("N4"));
assertTransition("LX", 1, "LX", "/LX", 1);
assertFalse(controller.transition("L5"));
assertFalse(controller.transition("L0"));
assertFalse(controller.transition("L7"));
assertTransition("LX", 1, "LX", "/LX", 1);
assertFalse(controller.transition("L5"));
assertFalse(controller.transition("L0"));
assertFalse(controller.transition("L1"));
assertFalse(controller.transition("L7"));
assertTransition("LX", 1, "LX", "/LX", 1);
assertFalse(controller.transition("L1"));
assertTransition("LX", 1, "LX", "/LX", 1);
assertFalse(controller.transition("L1"));
assertTrue(controller.transition("L3"));
}
@Test
public void canTransitionThrough850WithDifficultAMT() throws EDISyntaxException {
plugin = new ANSI_850_X_003999();
plugin.prepare();
controller.setPlugin(plugin);
controller.setEnabled(true);
assertEquals("Purchase Order (for test purposes only)", controller.getDocumentName());
assertFalse(controller.transition("BEG"));
assertFalse(controller.transition("CUR"));
assertFalse(controller.transition("FOB"));
assertFalse(controller.transition("ITD"));
assertFalse(controller.transition("DTM"));
assertFalse(controller.transition("DTM"));
assertFalse(controller.transition("TD5"));
assertTransition("AMT", 1, "AMT-0200", "/AMT-0200", 0);
assertTransition("AMT", 1, "AMT-0200", "/AMT-0200", 1);
assertTransition("N9", 1, "N9", "/N9", 1);
assertTransition("N9", 1, "N9", "/N9", 1);
assertTransition("N9", 1, "N9", "/N9", 1);
assertTransition("N9", 1, "N9", "/N9", 1);
assertTransition("N1", 1, "N1", "/N1", 1);
assertTransition("N1", 1, "N1", "/N1", 1);
assertFalse(controller.transition("N2"));
assertFalse(controller.transition("N3"));
assertFalse(controller.transition("N4"));
assertTransition("PO1", 1, "PO1-0700", "/PO1-0700", 1);
assertTransition("PID", 2, "PID", "/PO1-0700/PID", 0);
assertFalse(controller.transition("N9*"));
assertFalse(controller.transition("MSG"));
assertTransition("PO1", 1, "PO1-0700", "/PO1-0700", 2);
assertFalse(controller.transition("PI"));
assertTransition("N9", 2, "N9", "/PO1-0700/N9", 0);
assertTransition("AMT", 2, "AMT-0790", "/PO1-0700/AMT-0790", 1);
assertTransition("AMT", 2, "AMT-0790", "/PO1-0700/AMT-0790", 1);
assertFalse(controller.transition("MSG"));
assertTransition("CTT", 0, "/", "/", 2, true);
assertFalse(controller.transition("AMT"));
}
// @Ignore
@Test
public void canProduceCorrectXmlFor850WithDifficultAMT() {
String TINY_850 =
"ISA*00* *00* *ZZ*04000 *ZZ*58401 *040714*1003*U*00204*000038449*0*P*<$" +
"GS*PO*04000*58401*040714*1003*38327*X*003999$" +
"ST*850*000042460$" +
"BEG*00*RL*SPE1C115D1099*1594*160701****FR*SP$" +
"REF*DS*DOC9$" +
"AMT*KC*121.2$" +
"AT**97 0X0X49305CBX*****S33189**001 2620$" +
"REF*AX*BX$" +
"N1*BY*DLA TROOP SUPPORT*10*SPE1C1$" +
"N2*C AND T SUPPLY CHAIN$" +
"N3*800 SNOWBALL AVENUE$" +
"N4*PHILADELPHIA*PA*191115096*US$" +
"N1*SE*ANOTHER, INC. DBA*33*1CAY9$" +
"N2*ADS$" +
"N3*921 HAVEN HWY STE 100$" +
"N4*VIRGINIA BEACH*VA*234527448*US$" +
"PO1*0001*1*BX*121.20000**FS*8465015151158*UA*718020072050$" +
"PID*F****STRAP, INVOLUNTARY, RESTRAINT$" +
"CTT*1$" +
"AMT*TT*121.2$" +
"SE*19*000042460$" +
"GE*1*38327$" +
"IEA*1*000038449$";
StringWriter writer = new StringWriter();
new EDItoXML(new StringReader(TINY_850), writer).run();
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<ediroot>" +
"<interchange Standard=\"ANSI X.12\" AuthorizationQual=\"00\" Authorization=\" \" SecurityQual=\"00\" Security=\" \" Date=\"040714\" Time=\"1003\" StandardsId=\"U\" Version=\"00204\" Control=\"000038449\" AckRequest=\"0\" TestIndicator=\"P\">" +
"<sender><address Id=\"04000 \" Qual=\"ZZ\"/></sender>" +
"<receiver><address Id=\"58401 \" Qual=\"ZZ\"/></receiver>" +
"<group GroupType=\"PO\" ApplSender=\"04000\" ApplReceiver=\"58401\" Date=\"040714\" Time=\"1003\" Control=\"38327\" StandardCode=\"X\" StandardVersion=\"003999\">" +
"<transaction DocType=\"850\" Name=\"Purchase Order (for test purposes only)\" Control=\"000042460\">" +
"<segment Id=\"BEG\"><element Id=\"BEG01\">00</element><element Id=\"BEG02\">RL</element><element Id=\"BEG03\">SPE1C115D1099</element><element Id=\"BEG04\">1594</element><element Id=\"BEG05\">160701</element><element Id=\"BEG09\">FR</element><element Id=\"BEG10\">SP</element></segment>" +
"<segment Id=\"REF\"><element Id=\"REF01\">DS</element><element Id=\"REF02\">DOC9</element></segment>" +
"<loop Id=\"AMT-0200\">" +
"<segment Id=\"AMT\"><element Id=\"AMT01\">KC</element><element Id=\"AMT02\">121.2</element></segment>" +
"<segment Id=\"AT\"><element Id=\"AT02\">97 0X0X49305CBX</element><element Id=\"AT07\">S33189</element><element Id=\"AT09\">001 2620</element></segment>" +
"<segment Id=\"REF\"><element Id=\"REF01\">AX</element><element Id=\"REF02\">BX</element></segment>" +
"</loop>" +
"<loop Id=\"N1\">" +
"<segment Id=\"N1\"><element Id=\"N101\">BY</element><element Id=\"N102\">DLA TROOP SUPPORT</element><element Id=\"N103\">10</element><element Id=\"N104\">SPE1C1</element></segment>" +
"<segment Id=\"N2\"><element Id=\"N201\">C AND T SUPPLY CHAIN</element></segment><segment Id=\"N3\"><element Id=\"N301\">800 SNOWBALL AVENUE</element></segment>" +
"<segment Id=\"N4\"><element Id=\"N401\">PHILADELPHIA</element><element Id=\"N402\">PA</element><element Id=\"N403\">191115096</element><element Id=\"N404\">US</element></segment>" +
"</loop>" +
"<loop Id=\"N1\">" +
"<segment Id=\"N1\"><element Id=\"N101\">SE</element><element Id=\"N102\">ANOTHER, INC. DBA</element><element Id=\"N103\">33</element><element Id=\"N104\">1CAY9</element></segment>" +
"<segment Id=\"N2\"><element Id=\"N201\">ADS</element></segment><segment Id=\"N3\"><element Id=\"N301\">921 HAVEN HWY STE 100</element></segment>" +
"<segment Id=\"N4\"><element Id=\"N401\">VIRGINIA BEACH</element><element Id=\"N402\">VA</element><element Id=\"N403\">234527448</element><element Id=\"N404\">US</element></segment>" +
"</loop>" +
"<loop Id=\"PO1-0700\">" +
"<segment Id=\"PO1\"><element Id=\"PO101\">0001</element><element Id=\"PO102\">1</element><element Id=\"PO103\">BX</element><element Id=\"PO104\">121.20000</element><element Id=\"PO106\">FS</element><element Id=\"PO107\">8465015151158</element><element Id=\"PO108\">UA</element><element Id=\"PO109\">718020072050</element></segment>" +
"<loop Id=\"PID\">" +
"<segment Id=\"PID\"><element Id=\"PID01\">F</element><element Id=\"PID05\">STRAP, INVOLUNTARY, RESTRAINT</element></segment>" +
"</loop>" +
"</loop>" +
"<segment Id=\"CTT\"><element Id=\"CTT01\">1</element></segment>" +
"<segment Id=\"AMT\"><element Id=\"AMT01\">TT</element><element Id=\"AMT02\">121.2</element></segment>" +
"</transaction>" +
"</group>" +
"</interchange>" +
"</ediroot>",
writer.toString());
}
private void assertTransition(String segment, int nestingLevel, String loopEntered, String loopStack, int closedCount, boolean resumed) throws EDISyntaxException {
assertTrue(controller.transition(segment));
assertEquals(loopEntered, controller.getLoopEntered());
assertEquals(nestingLevel, controller.getNestingLevel());
assertEquals(loopStack, controller.getLoopStack().toString());
assertEquals(closedCount, controller.closedCount());
assertEquals(resumed, controller.isResumed());
}
private void assertTransition(String segment, int nestingLevel, String loopEntered, String loopStack, int closedCount) throws EDISyntaxException {
assertTransition(segment, nestingLevel, loopEntered, loopStack, closedCount, false);
}
@Test
public void pluginMustBeEnabled() throws EDISyntaxException {
plugin = new ANSI_210();
plugin.prepare();
controller.setPlugin(plugin);
controller.setEnabled(false);
assertFalse(controller.transition("B3"));
assertFalse(controller.transition("N1"));
}
}