package hu.sztaki.ilab.longneck.process.kernel; import hu.sztaki.ilab.longneck.Field; import hu.sztaki.ilab.longneck.Record; import hu.sztaki.ilab.longneck.RecordImpl; import hu.sztaki.ilab.longneck.process.FailException; import hu.sztaki.ilab.longneck.process.FilterException; import hu.sztaki.ilab.longneck.process.FrameAddressResolver; import hu.sztaki.ilab.longneck.process.SourceInfo; import hu.sztaki.ilab.longneck.process.block.Block; import hu.sztaki.ilab.longneck.process.block.BlockReference; import hu.sztaki.ilab.longneck.process.block.Case; import hu.sztaki.ilab.longneck.process.block.Check; import hu.sztaki.ilab.longneck.process.block.CloneRecord; import hu.sztaki.ilab.longneck.process.block.Copy; import hu.sztaki.ilab.longneck.process.block.Filter; import hu.sztaki.ilab.longneck.process.block.GenericBlock; import hu.sztaki.ilab.longneck.process.block.If; import hu.sztaki.ilab.longneck.process.block.MatchExtract; import hu.sztaki.ilab.longneck.process.block.Sequence; import hu.sztaki.ilab.longneck.process.block.Set; import hu.sztaki.ilab.longneck.process.block.Switch; import hu.sztaki.ilab.longneck.process.block.SwitchStrict; import hu.sztaki.ilab.longneck.process.block.TryAll; import hu.sztaki.ilab.longneck.process.constraint.Constraint; import hu.sztaki.ilab.longneck.process.constraint.EqualsConstraint; import hu.sztaki.ilab.longneck.process.mapping.Map; import hu.sztaki.ilab.longneck.process.mapping.MappedRecord; import hu.sztaki.ilab.longneck.process.mapping.Mapping; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.junit.Assert.*; import org.junit.Test; /** * * @author Lukacs Gabor <lukacsg@sztaki.mta.hu> */ public class KernelTest { public static Sequence createIfSequence(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); If ifBlock = new If(); seq.setBlocks(Arrays.asList(new Block[] { ifBlock })); EqualsConstraint equals = new EqualsConstraint(); equals.setApplyTo("a"); equals.setValue("aaa"); ifBlock.setConstraints(Arrays.asList(new Constraint[] { equals })); Sequence thenBranch = new Sequence(); thenBranch.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(thenBranch); Set setbThen = new Set(); setbThen.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 3, 3, 0)); setbThen.setApplyTo("b"); setbThen.setValue("then"); thenBranch.setBlocks(Arrays.asList(new Block[] { setbThen })); ifBlock.setThenBranch(thenBranch); Sequence elseBranch = new Sequence(); elseBranch.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 4, 4, 0)); far.put(elseBranch); Set setbElse = new Set(); setbElse.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 5, 5, 0)); setbElse.setApplyTo("b"); setbElse.setValue("else"); elseBranch.setBlocks(Arrays.asList(new Block[] { setbElse })); ifBlock.setElseBranch(elseBranch); return seq; } @Test public void testIfThen() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); // Create an if sequence Sequence seq = createIfSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "aaa")); Kernel kernel = new Kernel(seq, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("then", rec.get("b").getValue()); } @Test public void testIfElse() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); // Create an if sequence Sequence seq = createIfSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "bbb")); Kernel kernel = new Kernel(seq, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("else", rec.get("b").getValue()); } public static Sequence createSwitchStrictSequence(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); SwitchStrict ss = new SwitchStrict(); ss.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(ss); // Case 1 Case c1 = new Case(); c1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 3, 3, 0)); far.put(c1); // Case 1 check Check c1check = new Check(); c1check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 4, 4, 0)); far.put(c1check); EqualsConstraint c1equals = new EqualsConstraint(); c1equals.setApplyTo("a"); c1equals.setValue("aaa"); c1check.setConstraints(Arrays.asList(new Constraint[] { c1equals })); // Case 1 block Set c1set = new Set(); c1set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 5, 5, 0)); far.put(c1set); c1set.setApplyTo("b"); c1set.setValue("case1"); Set c1set2 = new Set(); c1set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 6, 6, 0)); far.put(c1set2); c1set2.setApplyTo("c1"); c1set2.setValue("case1"); c1.setBlocks(Arrays.asList(new Block[] { c1check, c1set, c1set2 })); // Case 2 Case c2 = new Case(); c2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 7, 7, 0)); far.put(c2); // Case 2 check Check c2check = new Check(); c2check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 8, 8, 0)); far.put(c2check); EqualsConstraint c2equals = new EqualsConstraint(); c2equals.setApplyTo("a"); c2equals.setValue("bbb"); c2check.setConstraints(Arrays.asList(new Constraint[] { c2equals })); // Case 2 block Set c2set = new Set(); c2set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 9, 9, 0)); far.put(c2set); c2set.setApplyTo("b"); c2set.setValue("case2"); Set c2set2 = new Set(); c2set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 10, 10, 0)); far.put(c2set2); c2set2.setApplyTo("c2"); c2set2.setValue("case2"); c2.setBlocks(Arrays.asList(new Block[] { c2check, c2set, c2set2 })); // Case 3 Case c3 = new Case(); c3.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 11, 11, 0)); far.put(c1); // Case 3 check Check c3check = new Check(); c3check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 12, 12, 0)); far.put(c3check); EqualsConstraint c3equals = new EqualsConstraint(); c3equals.setApplyTo("a"); c3equals.setValue("ccc"); c3check.setConstraints(Arrays.asList(new Constraint[] { c3equals })); // Case 3 block Set c3set = new Set(); c3set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 13, 13, 0)); far.put(c3set); c3set.setApplyTo("b"); c3set.setValue("case3"); Set c3set2 = new Set(); c3set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 14, 14, 0)); far.put(c3set2); c3set2.setApplyTo("c3"); c3set2.setValue("case3"); c3.setBlocks(Arrays.asList(new Block[] { c3check, c3set, c3set2 })); Set afterSet = new Set(); afterSet.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 15, 15, 0)); far.put(afterSet); afterSet.setApplyTo("after"); afterSet.setValue("true"); // Add cases to switch ss.setCases(Arrays.asList(new Case[] { c1, c2, c3 })); // Add blocks to top-level sequence seq.setBlocks(Arrays.asList(new Block[] { ss, afterSet })); return seq; } @Test public void testSwitchStrictCase1() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchStrictSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "aaa")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case1", rec.get("b").getValue()); // Only case 1 was run assertTrue(rec.has("c1")); assertEquals("case1", rec.get("c1").getValue()); assertFalse(rec.has("c2")); assertFalse(rec.has("c3")); // After set was run assertTrue(rec.has("after")); } @Test public void testSwitchStrictCase2() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchStrictSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "bbb")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case2", rec.get("b").getValue()); // Only case 2 was run assertTrue(rec.has("c2")); assertEquals("case2", rec.get("c2").getValue()); assertFalse(rec.has("c1")); assertFalse(rec.has("c3")); // After set was run assertTrue(rec.has("after")); } @Test public void testSwitchStrictCase3() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchStrictSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "ccc")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case3", rec.get("b").getValue()); // Only case 3 was run assertTrue(rec.has("c3")); assertEquals("case3", rec.get("c3").getValue()); assertFalse(rec.has("c1")); assertFalse(rec.has("c2")); // After set was run assertTrue(rec.has("after")); } @Test public void testSwitchStrictAllCasesFail() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchStrictSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "ddd")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertFalse(rec.has("after")); } public static Sequence createSwitchSequence(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); Switch sw = new Switch(); sw.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(sw); // Case 1 Case c1 = new Case(); c1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 3, 3, 0)); far.put(c1); // Case 1 check Check c1check = new Check(); c1check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 4, 4, 0)); far.put(c1check); EqualsConstraint c1equals = new EqualsConstraint(); c1equals.setApplyTo("a"); c1equals.setValue("aaa"); c1check.setConstraints(Arrays.asList(new Constraint[] { c1equals })); // Case 1 block Set c1set = new Set(); c1set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 5, 5, 0)); far.put(c1set); c1set.setApplyTo("b"); c1set.setValue("case1"); Set c1set2 = new Set(); c1set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 6, 6, 0)); far.put(c1set2); c1set2.setApplyTo("c1"); c1set2.setValue("case1"); c1.setBlocks(Arrays.asList(new Block[] { c1check, c1set, c1set2 })); // Case 2 Case c2 = new Case(); c2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 7, 7, 0)); far.put(c2); // Case 2 check Check c2check = new Check(); c2check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 8, 8, 0)); far.put(c2check); EqualsConstraint c2equals = new EqualsConstraint(); c2equals.setApplyTo("a"); c2equals.setValue("bbb"); c2check.setConstraints(Arrays.asList(new Constraint[] { c2equals })); // Case 2 block Set c2set = new Set(); c2set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 9, 9, 0)); far.put(c2set); c2set.setApplyTo("b"); c2set.setValue("case2"); Set c2set2 = new Set(); c2set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 10, 10, 0)); far.put(c2set2); c2set2.setApplyTo("c2"); c2set2.setValue("case2"); c2.setBlocks(Arrays.asList(new Block[] { c2check, c2set, c2set2 })); // Case 3 Case c3 = new Case(); c3.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 11, 11, 0)); far.put(c1); // Case 3 check Check c3check = new Check(); c3check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 12, 12, 0)); far.put(c3check); EqualsConstraint c3equals = new EqualsConstraint(); c3equals.setApplyTo("a"); c3equals.setValue("ccc"); c3check.setConstraints(Arrays.asList(new Constraint[] { c3equals })); // Case 3 block Set c3set = new Set(); c3set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 13, 13, 0)); far.put(c3set); c3set.setApplyTo("b"); c3set.setValue("case3"); Set c3set2 = new Set(); c3set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 14, 14, 0)); far.put(c3set2); c3set2.setApplyTo("c3"); c3set2.setValue("case3"); c3.setBlocks(Arrays.asList(new Block[] { c3check, c3set, c3set2 })); Set afterSet = new Set(); afterSet.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 15, 15, 0)); far.put(afterSet); afterSet.setApplyTo("after"); afterSet.setValue("true"); // Add cases to switch sw.setCases(Arrays.asList(new Case[] { c1, c2, c3 })); // Add blocks to top-level sequence seq.setBlocks(Arrays.asList(new Block[] { sw, afterSet })); return seq; } @Test public void testSwitchCase1() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "aaa")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case1", rec.get("b").getValue()); // Only case 1 was run assertTrue(rec.has("c1")); assertEquals("case1", rec.get("c1").getValue()); assertFalse(rec.has("c2")); assertFalse(rec.has("c3")); // After set was run assertTrue(rec.has("after")); } @Test public void testSwitchCase2() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "bbb")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case2", rec.get("b").getValue()); // Only case 2 was run assertTrue(rec.has("c2")); assertEquals("case2", rec.get("c2").getValue()); assertFalse(rec.has("c1")); assertFalse(rec.has("c3")); // After set was run assertTrue(rec.has("after")); } @Test public void testSwitchCase3() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "ccc")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case3", rec.get("b").getValue()); // Only case 3 was run assertTrue(rec.has("c3")); assertEquals("case3", rec.get("c3").getValue()); assertFalse(rec.has("c1")); assertFalse(rec.has("c2")); // After set was run assertTrue(rec.has("after")); } @Test public void testSwitchAllCasesFail() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createSwitchSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "ddd")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("after")); } public static Sequence createTryAllSequence(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); TryAll ta = new TryAll(); ta.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(ta); // Case 1 Case c1 = new Case(); c1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 3, 3, 0)); far.put(c1); // Case 1 check Check c1check = new Check(); c1check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 4, 4, 0)); far.put(c1check); EqualsConstraint c1equals = new EqualsConstraint(); c1equals.setApplyTo("a"); c1equals.setValue("aaa"); c1check.setConstraints(Arrays.asList(new Constraint[] { c1equals })); // Case 1 block Set c1set = new Set(); c1set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 5, 5, 0)); far.put(c1set); c1set.setApplyTo("b"); c1set.setValue("case1"); Set c1set2 = new Set(); c1set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 6, 6, 0)); far.put(c1set2); c1set2.setApplyTo("c1"); c1set2.setValue("case1"); c1.setBlocks(Arrays.asList(new Block[] { c1check, c1set, c1set2 })); // Case 2 Case c2 = new Case(); c2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 7, 7, 0)); far.put(c2); // Case 2 check Check c2check = new Check(); c2check.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 8, 8, 0)); far.put(c2check); EqualsConstraint c2equals = new EqualsConstraint(); c2equals.setApplyTo("a"); c2equals.setValue("bbb"); c2check.setConstraints(Arrays.asList(new Constraint[] { c2equals })); // Case 2 block Set c2set = new Set(); c2set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 9, 9, 0)); far.put(c2set); c2set.setApplyTo("b"); c2set.setValue("case2"); Set c2set2 = new Set(); c2set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 10, 10, 0)); far.put(c2set2); c2set2.setApplyTo("c2"); c2set2.setValue("case2"); c2.setBlocks(Arrays.asList(new Block[] { c2check, c2set, c2set2 })); // Case 3 Case c3 = new Case(); c3.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 11, 11, 0)); far.put(c1); // Case 3 block Set c3set = new Set(); c3set.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 13, 13, 0)); far.put(c3set); c3set.setApplyTo("b"); c3set.setValue("case3"); Set c3set2 = new Set(); c3set2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 14, 14, 0)); far.put(c3set2); c3set2.setApplyTo("c3"); c3set2.setValue("case3"); c3.setBlocks(Arrays.asList(new Block[] { c3set, c3set2 })); Set afterSet = new Set(); afterSet.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 15, 15, 0)); far.put(afterSet); afterSet.setApplyTo("after"); afterSet.setValue("true"); // Add cases to switch ta.setCases(Arrays.asList(new Case[] { c1, c2, c3 })); // Add blocks to top-level sequence seq.setBlocks(Arrays.asList(new Block[] { ta, afterSet })); return seq; } @Test public void testTryAllCase13() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createTryAllSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "aaa")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case3", rec.get("b").getValue()); // Case 1 and case 3 was run assertTrue(rec.has("c1")); assertEquals("case1", rec.get("c1").getValue()); assertFalse(rec.has("c2")); assertTrue(rec.has("c3")); assertEquals("case3", rec.get("c3").getValue()); // After set was run assertTrue(rec.has("after")); } @Test public void testTryAllCase23() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createTryAllSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "bbb")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case3", rec.get("b").getValue()); // Only case 2 was run assertTrue(rec.has("c2")); assertEquals("case2", rec.get("c2").getValue()); assertFalse(rec.has("c1")); assertTrue(rec.has("c3")); assertEquals("case3", rec.get("c3").getValue()); // After set was run assertTrue(rec.has("after")); } @Test public void testTryAllCase3() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createTryAllSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "ccc")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("case3", rec.get("b").getValue()); // Only case 3 was run assertTrue(rec.has("c3")); assertEquals("case3", rec.get("c3").getValue()); assertFalse(rec.has("c1")); assertFalse(rec.has("c2")); // After set was run assertTrue(rec.has("after")); } public static Sequence createBlockRefSequence1(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); // Block 1 GenericBlock b1 = new GenericBlock(); b1.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 1, 1, 0)); b1.setId("b1"); b1.setVersion("1"); Set b1set = new Set(); b1set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 2, 2, 0)); far.put(b1set); b1set.setApplyTo("b"); b1set.setValue("b1"); BlockReference br2 = new BlockReference(); br2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 3, 3, 0)); far.put(br2); br2.setId("pkg1:b2"); br2.setVersion("1"); Set b1set2 = new Set(); b1set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 4, 4, 0)); far.put(b1set2); b1set2.setApplyTo("c"); b1set2.setValue("b1"); b1.setBlocks(Arrays.asList(new Block[] { b1set, br2, b1set2 })); // Block 2 GenericBlock b2 = new GenericBlock(); b2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 5, 5, 0)); b2.setId("b2"); b2.setVersion("1"); Set b2set = new Set(); b2set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 6, 6, 0)); far.put(b2set); b2set.setApplyTo("b"); b2set.setValue("b2"); Set b2set2 = new Set(); b2set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 7, 7, 0)); far.put(b2set2); b2set2.setApplyTo("d"); b2set2.setValue("b2"); b2.setBlocks(Arrays.asList(new Block[] { b2set, b2set2 })); br2.setReferredBlock(b2); BlockReference br1 = new BlockReference(); br1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(br1); br1.setId("pkg1:b1"); br1.setVersion("1"); br1.setReferredBlock(b1); seq.setBlocks(Arrays.asList(new Block[] { br1 })); return seq; } @Test public void testBlockReference1() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createBlockRefSequence1(far); Record rec = new RecordImpl(); rec.add(new Field("a", "bbb")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue(rec.has("b")); assertEquals("b2", rec.get("b").getValue()); assertTrue(rec.has("c")); assertEquals("b1", rec.get("c").getValue()); assertTrue(rec.has("d")); assertEquals("b2", rec.get("d").getValue()); } public static Sequence createBlockRefSuppressErrorSequence(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); // Block 1 GenericBlock b1 = new GenericBlock(); b1.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 1, 1, 0)); b1.setId("b1"); b1.setVersion("1"); Set b1set = new Set(); b1set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 2, 2, 0)); far.put(b1set); b1set.setApplyTo("b"); b1set.setValue("b1"); BlockReference br2 = new BlockReference(); br2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 3, 3, 0)); far.put(br2); br2.setId("pkg1:b2"); br2.setVersion("1"); Set b1set2 = new Set(); b1set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 4, 4, 0)); far.put(b1set2); b1set2.setApplyTo("c"); b1set2.setValue("b1"); b1.setBlocks(Arrays.asList(new Block[] { b1set, br2, b1set2 })); // Block 2 GenericBlock b2 = new GenericBlock(); b2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 5, 5, 0)); b2.setId("b2"); b2.setVersion("1"); Check b2check = new Check(); b2check.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 6, 6, 0)); far.put(b2check); EqualsConstraint equals = new EqualsConstraint(); equals.setApplyTo("a"); equals.setValue("xxx"); b2check.setConstraints(Arrays.asList(new Constraint[] { equals })); Set b2set = new Set(); b2set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 6, 6, 0)); far.put(b2set); b2set.setApplyTo("b"); b2set.setValue("b2"); Set b2set2 = new Set(); b2set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 7, 7, 0)); far.put(b2set2); b2set2.setApplyTo("d"); b2set2.setValue("b2"); b2.setBlocks(Arrays.asList(new Block[] { b2check, b2set, b2set2 })); br2.setReferredBlock(b2); BlockReference br1 = new BlockReference(); br1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(br1); br1.setId("pkg1:b1"); br1.setVersion("1"); br1.setReferredBlock(b1); seq.setBlocks(Arrays.asList(new Block[] { br1 })); return seq; } @Test public void testBlockReferenceSupressError() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createBlockRefSuppressErrorSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "bbb")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue("Check fields set by b1", rec.has("b")); assertEquals("Check fields set by b1", "b1", rec.get("b").getValue()); assertTrue("Check fields set by b1", rec.has("c")); assertEquals("Check fields set by b1", "b1", rec.get("c").getValue()); assertFalse("Check that b2 did not set fields", rec.has("d")); } public static Sequence createBlockRefPropagateErrorSequence(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); // Block 1 GenericBlock b1 = new GenericBlock(); b1.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 1, 1, 0)); b1.setId("b1"); b1.setVersion("1"); Set b1set = new Set(); b1set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 2, 2, 0)); far.put(b1set); b1set.setApplyTo("b"); b1set.setValue("b1"); BlockReference br2 = new BlockReference(); br2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 3, 3, 0)); far.put(br2); br2.setId("pkg1:b2"); br2.setVersion("1"); br2.setPropagateFailure(true); Set b1set2 = new Set(); b1set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 4, 4, 0)); far.put(b1set2); b1set2.setApplyTo("c"); b1set2.setValue("b1"); b1.setBlocks(Arrays.asList(new Block[] { b1set, br2, b1set2 })); // Block 2 GenericBlock b2 = new GenericBlock(); b2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 5, 5, 0)); b2.setId("b2"); b2.setVersion("1"); Check b2check = new Check(); b2check.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 6, 6, 0)); far.put(b2check); EqualsConstraint equals = new EqualsConstraint(); equals.setApplyTo("a"); equals.setValue("xxx"); b2check.setConstraints(Arrays.asList(new Constraint[] { equals })); Set b2set = new Set(); b2set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 7, 7, 0)); far.put(b2set); b2set.setApplyTo("b"); b2set.setValue("b2"); Set b2set2 = new Set(); b2set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 8, 8, 0)); far.put(b2set2); b2set2.setApplyTo("d"); b2set2.setValue("b2"); b2.setBlocks(Arrays.asList(new Block[] { b2check, b2set, b2set2 })); br2.setReferredBlock(b2); BlockReference br1 = new BlockReference(); br1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(br1); br1.setId("pkg1:b1"); br1.setVersion("1"); br1.setReferredBlock(b1); seq.setBlocks(Arrays.asList(new Block[] { br1 })); return seq; } @Test public void createBlockRefPropagateErrorSequence() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createBlockRefPropagateErrorSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "bbb")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); // Check fields set by b1 before reference assertTrue("Check fields set by b1 before reference", rec.has("b")); assertEquals("Check fields set by b1 before reference", "b1", rec.get("b").getValue()); // Check that field after reference was not set assertFalse("Check that field after reference was not set", rec.has("c")); // Check that b2 did not set fields assertFalse("Check that b2 did not set fields", rec.has("d")); } public static Sequence createMatchExtractSequence(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); MatchExtract me = new MatchExtract(); me.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(me); me.setApplyTo("a"); me.setRegexp("^(.)(.)(.)$"); Copy copy1 = new Copy(); copy1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 3, 3, 0)); far.put(copy1); copy1.setApplyTo("var1"); copy1.setFrom("$1"); Copy copy2 = new Copy(); copy2.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 4, 4, 0)); far.put(copy1); copy2.setApplyTo("var2"); copy2.setFrom("$2"); Copy copy3 = new Copy(); copy3.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 5, 5, 0)); far.put(copy1); copy3.setApplyTo("var3"); copy3.setFrom("$3"); me.setBlocks(Arrays.asList(new Block[]{copy1, copy2, copy3})); seq.setBlocks(Arrays.asList(new Block[]{me})); return seq; } @Test public void testMatchExtract() throws FailException, FilterException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createMatchExtractSequence(far); Record rec = new RecordImpl(); rec.add(new Field("a", "abc")); Kernel kernel = new Kernel(tested, far, null); kernel.process(rec); assertTrue("First regexp group exists.", rec.has("var1")); assertEquals("First regexp group is correctly extracted", "a", rec.get("var1").getValue()); assertTrue("Second regexp group exists.", rec.has("var2")); assertEquals("Second regexp group is correctly extracted", "b", rec.get("var2").getValue()); assertTrue("Third regexp group exists.", rec.has("var3")); assertEquals("Third regexp group is correctly extracted", "c", rec.get("var3").getValue()); } @Test public void testFilter() throws FailException { FrameAddressResolver far = new FrameAddressResolver(); Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); Filter filter = new Filter(); filter.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(filter); seq.setBlocks(Arrays.asList(new Block[]{filter})); Record rec = new RecordImpl(); rec.add(new Field("a", "abc")); Kernel kernel = new Kernel(seq, far, null); try { kernel.process(rec); fail("Filter exception not raised!"); } catch (FilterException ex) { // OK } } @Test public void testMapping() throws FailException { FrameAddressResolver far = new FrameAddressResolver(); Sequence tested = createMappingTestSequence1(far); List<Record> localCloneQueue = new ArrayList<>(); Record record = new RecordImpl(); record.add(new Field("a", "a1")); Kernel kernel = new Kernel(tested, far, localCloneQueue); try { kernel.process(record); } catch (FailException | FilterException e) { fail(); } // record out test assertTrue("Check field exist: a", record.has("a")); assertEquals("Check field value: a", "b2", record.get("a").getValue()); assertTrue("Check field exist: c", record.has("c")); assertEquals("Check field value: c", "ok", record.get("c").getValue()); assertTrue("Check that another field isn't exist.", record.getFields().size() == 2); // test clone1: Record clone1 = localCloneQueue.get(1); assertTrue("Check field exist: b", clone1.has("b")); assertEquals("Check field value: b", "b3", clone1.get("b").getValue()); assertTrue("Check field exist: f", clone1.has("f")); assertEquals("Check field value: f", "ok", clone1.get("f").getValue()); assertTrue("Check field exist: a", clone1.has("a")); assertEquals("Check field value: a", "error", clone1.get("a").getValue()); assertTrue("Check that another field isn't exist.", clone1.getFields().size() == 3); // test clone1 parent Record parent1 = ((MappedRecord)clone1).getParent(); assertTrue("Check field exist: a", parent1.has("a")); assertEquals("Check field value: a", "a1", parent1.get("a").getValue()); assertTrue("Check that another field isn't exist.", parent1.getFields().size() == 1); // test clone2: Record clone2 = localCloneQueue.get(0); assertTrue("Check field exist: b", clone2.has("b")); assertEquals("Check field value: b", "error", clone2.get("b").getValue()); assertTrue("Check field exist: c", clone2.has("c")); assertEquals("Check field value: c", "ok", clone2.get("c").getValue()); assertTrue("Check field exist: a", clone2.has("a")); assertEquals("Check field value: a", "error", clone2.get("a").getValue()); assertTrue("Check field exist: d", clone2.has("d")); assertEquals("Check field value: d", "b2", clone2.get("d").getValue()); assertTrue("Check field exist: e", clone2.has("e")); assertEquals("Check field value: e", "b2", clone2.get("e").getValue()); assertTrue("Check that another field isn't exist.", clone2.getFields().size() == 5); // test clone2 parent Record parent2 = ((MappedRecord)clone2).getParent(); assertTrue("Check field exist: b", parent2.has("b")); assertEquals("Check field value: b", "b1", parent2.get("b").getValue()); assertTrue("Check that another field isn't exist.", parent2.getFields().size() == 1); // test clone2 parent's parent Record parent3 = ((MappedRecord)parent2).getParent(); assertTrue("Check field exist: a", parent3.has("a")); assertEquals("Check field value: a", "a1", parent3.get("a").getValue()); assertTrue("Check that another field isn't exist.", parent3.getFields().size() == 1); // test clone2 out try { kernel.process(clone2); // Beacause the cloned records if (clone2 instanceof MappedRecord) { record = ((MappedRecord) clone2).getAncestor(); } } catch (FailException | FilterException e) { fail(); } assertTrue("Check field exist: a", record.has("a")); assertEquals("Check field value: a", "b2", record.get("a").getValue()); assertTrue("Check field exist: c", record.has("c")); assertEquals("Check field value: c", "ok", record.get("c").getValue()); assertTrue("Check that another field isn't exist.", record.getFields().size() == 2); // test clone1 out try { kernel.process(clone1); // Beacause the cloned records if (clone1 instanceof MappedRecord) { record = ((MappedRecord) clone1).getAncestor(); } } catch (FailException | FilterException e) { fail(); } assertTrue("Check field exist: a", record.has("a")); assertEquals("Check field value: a", "b3", record.get("a").getValue()); assertTrue("Check field exist: c", record.has("c")); assertEquals("Check field value: c", "ok", record.get("c").getValue()); assertTrue("Check that another field isn't exist.", record.getFields().size() == 2); // test clone2 cloned record cloned by clone1 record out Record clone3 = localCloneQueue.get(2); try { kernel.process(clone3); // Beacause the cloned records if (clone3 instanceof MappedRecord) { record = ((MappedRecord) clone3).getAncestor(); } } catch (FailException | FilterException e) { fail(); } assertTrue("Check field exist: a", record.has("a")); assertEquals("Check field value: a", "b3", record.get("a").getValue()); assertTrue("Check field exist: c", record.has("c")); assertEquals("Check field value: c", "ok", record.get("c").getValue()); assertTrue("Check that another field isn't exist.", record.getFields().size() == 2); } public static Sequence createMappingTestSequence1(FrameAddressResolver far) { // Create an if sequence Sequence seq = new Sequence(); seq.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 1, 1, 0)); far.put(seq); // Block 1 GenericBlock b1 = new GenericBlock(); b1.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 1, 1, 0)); b1.setId("b1"); b1.setVersion("1"); Set b1set = new Set(); b1set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 2, 2, 0)); far.put(b1set); b1set.setApplyTo("b"); b1set.setValue("b1"); BlockReference br2 = new BlockReference(); br2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 3, 3, 0)); far.put(br2); br2.setId("pkg1:b2"); br2.setVersion("1"); Mapping mapping1 = new Mapping(); Map map1 = new Map(); map1.setTo("d"); map1.setFrom("b"); mapping1.addRule(map1); Map map11 = new Map(); map11.setTo("c"); map11.setFrom("f"); mapping1.addRule(map11); br2.setMapping(mapping1); Set b1set2 = new Set(); b1set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 4, 4, 0)); far.put(b1set2); b1set2.setApplyTo("a"); b1set2.setValue("error"); CloneRecord b1clone = new CloneRecord(); b1clone.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 5, 5, 0)); far.put(b1clone); b1clone.setFieldName("b"); b1clone.setFieldValue("b3"); b1.setBlocks(Arrays.asList(new Block[]{b1set, br2, b1set2, b1clone})); // Block 2 GenericBlock b2 = new GenericBlock(); b2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", null, 6, 6, 0)); b2.setId("b2"); b2.setVersion("1"); Set b2set = new Set(); b2set.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 7, 7, 0)); far.put(b2set); b2set.setApplyTo("e"); b2set.setValue("b2"); Copy b2copy = new Copy(); b2copy.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 8, 8, 0)); far.put(b2copy); b2copy.setApplyTo("d"); b2copy.setFrom("e"); Set b2set2 = new Set(); b2set2.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 9, 9, 0)); far.put(b2set2); b2set2.setApplyTo("b"); b2set2.setValue("error"); Set b2set3 = new Set(); b2set3.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 10, 10, 0)); far.put(b2set2); b2set3.setApplyTo("a"); b2set3.setValue("error"); Set b2set4 = new Set(); b2set4.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b2:1", 11, 11, 0)); far.put(b2set4); b2set4.setApplyTo("c"); b2set4.setValue("ok"); CloneRecord b2clone = new CloneRecord(); b2clone.setSourceInfo(new SourceInfo("file:///pkg1.blocks.xml", "b1:1", 12, 12, 0)); far.put(b2clone); b2.setBlocks(Arrays.asList(new Block[]{b2set, b2copy, b2set2, b2set3, b2set4, b2clone})); br2.setReferredBlock(b2); BlockReference br1 = new BlockReference(); br1.setSourceInfo(new SourceInfo("file:///dummy.xml", null, 2, 2, 0)); far.put(br1); br1.setId("pkg1:b1"); br1.setVersion("1"); Mapping mapping0 = new Mapping(); Map map0 = new Map(); map0.setTo("b"); map0.setFrom("a"); mapping0.addRule(map0); Map map01 = new Map(); map01.setTo("f"); map01.setFrom("c"); mapping0.addRule(map01); br1.setMapping(mapping0); br1.setReferredBlock(b1); seq.setBlocks(Arrays.asList(new Block[]{br1})); return seq; } }