/*
* Copyright 2005-2011 by BerryWorks Software, LLC. All rights reserved.
*/
package com.berryworks.edireader;
import com.berryworks.edireader.plugin.CompositeAwarePlugin;
import com.berryworks.edireader.plugin.LoopDescriptor;
import com.berryworks.edireader.plugin.PluginControllerImpl;
import com.berryworks.edireader.tokenizer.EDITokenizer;
import com.berryworks.edireader.tokenizer.Tokenizer;
import org.junit.Before;
import org.junit.Test;
import java.io.StringReader;
import java.util.Set;
import static com.berryworks.edireader.Plugin.ANY_CONTEXT;
import static org.junit.Assert.*;
public class PluginTest {
private static final LoopDescriptor[] LOOP_DESCRIPTORS = new LoopDescriptor[]{
new LoopDescriptor("A", "seg1", 1, ANY_CONTEXT),
new LoopDescriptor("*", "N1", 1, "N1"),
new LoopDescriptor("LX", "LX", 1, ANY_CONTEXT),
new LoopDescriptor("N1", "N1", 2, "LX"),
new LoopDescriptor("*", "P1", 1, ANY_CONTEXT),
new LoopDescriptor("L5", "L5", 2, ANY_CONTEXT),
new LoopDescriptor("L1", "L1", 3, ANY_CONTEXT),
new LoopDescriptor("*", "L3", 0, ANY_CONTEXT)
};
private Plugin plugin;
private Plugin.PluginDiff diff;
private LoopDescriptor response;
private Set<String> resultFlags;
@Before
public void setUp() {
plugin = new MockPlugin();
}
@Test
public void testConstruction() {
assertEquals("dt", plugin.getDocumentType());
assertEquals("dn", plugin.getDocumentName());
assertFalse(plugin.isValidating());
assertEquals(
"Plugin com.berryworks.edireader.PluginTest$MockPlugin\n dn (dt)",
plugin.toString());
int countOfPluginsConstructed = Plugin.getCount();
assertTrue(countOfPluginsConstructed > 0);
plugin = new Plugin("T", "N", true) {
};
assertEquals("T", plugin.getDocumentType());
assertEquals("N", plugin.getDocumentName());
assertTrue(plugin.isValidating());
plugin.loops = LOOP_DESCRIPTORS;
assertEquals(
"Plugin com.berryworks.edireader.PluginTest$1\n" +
" N (T)\n" +
"loop A at nesting level 1: encountering segment seg1 anytime\n" +
"loop * at nesting level 1: encountering segment N1 while currently in loop N1\n" +
"loop LX at nesting level 1: encountering segment LX anytime\n" +
"loop N1 at nesting level 2: encountering segment N1 while currently in loop LX\n" +
"loop * at nesting level 1: encountering segment P1 anytime\n" +
"loop L5 at nesting level 2: encountering segment L5 anytime\n" +
"loop L1 at nesting level 3: encountering segment L1 anytime\n" +
"loop * at nesting level 0: encountering segment L3 anytime",
plugin.toString());
assertEquals(countOfPluginsConstructed + 1, Plugin.getCount());
}
@Test
public void canSetLoopDescriptors() {
assertNull(plugin.getLoopDescriptors());
plugin.loops = LOOP_DESCRIPTORS;
assertEquals(8, plugin.getLoopDescriptors().length);
}
@Test
public void canConcatenateLoopDescriptors() {
plugin.loops = LOOP_DESCRIPTORS;
assertEquals(8, plugin.getLoopDescriptors().length);
LoopDescriptor[] more = new LoopDescriptor[]{
new LoopDescriptor("X", "x"),
new LoopDescriptor("Y", "y")
};
LoopDescriptor[] concatenated = plugin.concatenate(LOOP_DESCRIPTORS, more);
assertEquals(10, concatenated.length);
}
@Test
public void canCreateController() {
Tokenizer tokenizer = new EDITokenizer(new StringReader(""), null);
PluginControllerImpl controller = plugin.createController("SomeStandard", tokenizer);
assertNotNull(controller);
}
@Test
public void canGetDocumentVersionFromPluginName() {
assertNull(plugin.getDocumentVersion());
assertEquals("Four", new Plugin_Two_Three_Four().getDocumentVersion());
}
@Test
public void testQueries() {
plugin.loops = LOOP_DESCRIPTORS;
plugin.prepare();
plugin.debug(false);
response = plugin.query("seg1", null, -1, resultFlags);
assertNotNull(response);
assertEquals("A", response.getName());
assertEquals(1, response.getNestingLevel());
response = plugin.query("seg1", "A", 1, resultFlags);
assertNotNull(response);
assertEquals("A", response.getName());
assertEquals(1, response.getNestingLevel());
response = plugin.query("LX", null, 0, resultFlags);
assertNotNull(response);
assertEquals("LX", response.getName());
assertEquals(1, response.getNestingLevel());
response = plugin.query("N1", "LX", 1, resultFlags);
assertNotNull(response);
assertEquals("N1", response.getName());
assertEquals(2, response.getNestingLevel());
response = plugin.query("L1", "N1", 2, resultFlags);
assertNotNull(response);
assertEquals("L1", response.getName());
assertEquals(3, response.getNestingLevel());
response = plugin.query("L1", "L1", 3, resultFlags);
assertNotNull(response);
assertEquals("L1", response.getName());
assertEquals(3, response.getNestingLevel());
}
@Test
public void testLevelSensitive() {
plugin.loops = new LoopDescriptor[]{
new LoopDescriptor("A", "seg1", 1, ANY_CONTEXT),
new LoopDescriptor("B", "seg2", 2, "A"),
new LoopDescriptor("C", "seg3", 3, 2),
};
plugin.prepare();
plugin.debug(false);
response = plugin.query("seg1", null, 0, resultFlags);
assertNotNull(response);
assertEquals("A", response.getName());
assertEquals(1, response.getNestingLevel());
response = plugin.query("seg2", "A", 1, resultFlags);
assertNotNull(response);
assertEquals("B", response.getName());
assertEquals(2, response.getNestingLevel());
response = plugin.query("seg3", "B", 2, resultFlags);
assertNotNull(response);
assertEquals("C", response.getName());
assertEquals(3, response.getNestingLevel());
response = plugin.query("seg3", "C", 3, resultFlags);
assertNull(response);
}
@Test
public void testStackContextQuery() {
plugin.loops = new LoopDescriptor[]{
new LoopDescriptor("A", "seg1", 1),
new LoopDescriptor("B", "seg2", 2, "/A"),
new LoopDescriptor("C", "seg3", 3, "/A/B"),
};
plugin.prepare();
plugin.debug(false);
response = plugin.query("seg1", null, 0, resultFlags);
assertNotNull(response);
assertEquals("A", response.getName());
assertEquals(1, response.getNestingLevel());
response = plugin.query("seg2", "/A", 1, resultFlags);
assertNotNull(response);
assertEquals("B", response.getName());
assertEquals(2, response.getNestingLevel());
response = plugin.query("seg3", "/A/B", 2, resultFlags);
assertNotNull(response);
assertEquals("C", response.getName());
assertEquals(3, response.getNestingLevel());
response = plugin.query("seg3", "C", 3, resultFlags);
assertNull(response);
}
@Test
public void testNullLoopNameActsAsANotRule() {
// Baseline
plugin.loops = new LoopDescriptor[]{
new LoopDescriptor("*", "N1", 1, "N1"),
new LoopDescriptor("LX", "LX", 1, ANY_CONTEXT),
new LoopDescriptor("N1", "N1", 2, "LX")
};
plugin.prepare();
response = plugin.query("LX", null, 0, resultFlags);
assertNotNull(response);
assertEquals("LX", response.getName());
assertEquals(1, response.getNestingLevel());
response = plugin.query("N1", "LX", 1, resultFlags);
assertNotNull(response);
assertEquals("N1", response.getName());
assertEquals(2, response.getNestingLevel());
// Same as baseline, but with null loop name
plugin.loops = new LoopDescriptor[]{
new LoopDescriptor("*", "N1", 1, "N1"),
new LoopDescriptor("LX", "LX", 1, ANY_CONTEXT),
new LoopDescriptor(null, "N1", 2, "LX")
};
plugin.prepare();
response = plugin.query("LX", null, 0, resultFlags);
assertNotNull(response);
assertEquals("LX", response.getName());
assertEquals(1, response.getNestingLevel());
assertNull(plugin.query("N1", "LX", 1, resultFlags));
}
@Test
public void queryWithNullLoopsReturnsNull() {
plugin.prepare();
plugin.debug(false);
assertNull(plugin.query("seg1", null, -1, resultFlags));
}
@Test(expected = RuntimeException.class)
public void mustPrepareOptimizedForm() {
plugin.loops = LOOP_DESCRIPTORS;
plugin.query("seg1", null, -1, resultFlags);
}
@Test
public void comparePluginToItself() {
final CompositeAwarePlugin pluginA =
new CompositeAwarePlugin("210", "Motor Carrier Freight Details and Invoice") {
};
diff = pluginA.compare(pluginA);
assertTrue(diff.isMatch());
assertEquals("matches", diff.getReason());
}
@Test
public void comparePluginToNull() {
final CompositeAwarePlugin pluginA =
new CompositeAwarePlugin("210", "Motor Carrier Freight Details and Invoice") {
};
diff = pluginA.compare(null);
assertFalse(diff.isMatch());
assertEquals("second plugin is null", diff.getReason());
}
@Test
public void comparedTypesMustMatch() {
final CompositeAwarePlugin pluginA =
new CompositeAwarePlugin("210", "Motor Carrier Freight Details and Invoice") {
};
final CompositeAwarePlugin pluginB =
new CompositeAwarePlugin("211", "Motor Carrier Freight Details and Invoice") {
};
diff = pluginA.compare(pluginB);
assertFalse(diff.isMatch());
assertEquals("types differ", diff.getReason());
}
@Test
public void comparedNamesMustMatch() {
final CompositeAwarePlugin pluginA =
new CompositeAwarePlugin("210", "Motor Carrier Freight Details and Invoice") {
};
final CompositeAwarePlugin pluginB =
new CompositeAwarePlugin("210", "Motor Carrier Freight Details & Invoice") {
};
diff = pluginA.compare(pluginB);
assertFalse(diff.isMatch());
assertEquals("names differ", diff.getReason());
}
@Test
public void comparedDescriptorCountMustMatch() {
diff = new PluginA1().compare(new PluginA2());
assertFalse(diff.isMatch());
assertEquals("second plugin has a different number of loops than this plugin", diff.getReason());
}
private static class MockPlugin extends Plugin {
public MockPlugin() {
super("dt", "dn");
}
}
private static class Plugin_Two_Three_Four extends Plugin {
public Plugin_Two_Three_Four() {
super("dt", "dn");
}
public void setDescriptors(LoopDescriptor[] loops) {
this.loops = loops;
}
}
static class PluginA1 extends CompositeAwarePlugin {
public PluginA1() {
super("type", "name");
loops = new LoopDescriptor[]{
new LoopDescriptor(CURRENT, "B3", 0, ANY_CONTEXT),
};
}
}
static class PluginA2 extends CompositeAwarePlugin {
public PluginA2() {
super("type", "name");
loops = new LoopDescriptor[]{
new LoopDescriptor(CURRENT, "B3", 0, ANY_CONTEXT),
new LoopDescriptor(CURRENT, "C2", 0, ANY_CONTEXT),
};
}
}
}