package com.sap.furcas.runtime.parser.textblocks.observer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import java.util.ArrayList; import java.util.Collection; import org.junit.Test; import com.sap.furcas.metamodel.FURCAS.textblocks.AbstractToken; import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock; import com.sap.furcas.runtime.parser.textblocks.TextBlockFactory; import com.sap.furcas.runtime.textblocks.testbase.TextBlockTest; public class TestTextBlockComparer extends TextBlockTest { @SuppressWarnings("unused") @Test (expected = IllegalArgumentException.class) public void testNewNullTraverser() throws Exception { new TextBlockComparer(null, null); } @SuppressWarnings("unused") @Test (expected = IllegalArgumentException.class) public void testNewTraverserNullRoot() throws Exception { TextBlockFactory factory = getFactory(); new TextBlockComparer(null, factory); } @SuppressWarnings("unused") @Test (expected = IllegalArgumentException.class) public void testNewTraverserNullFact() throws Exception { new TextBlockComparer(modelFactory.createTextBlock(), null); } @Test public void testNewTraverser() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); assertEquals(block, traverser.getCurrent()); assertEquals(0, traverser.getTokensToBeRelocated().size()); } @Test (expected = IllegalStateException.class) public void testLeaveNewTraverser() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); traverser.leaveChild(); // throws exception, we cannot leave root } @Test public void testEnterTraverser() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); traverser.enterNextChild(); assertNotNull(traverser.getCurrent()); assertNotSame(block, traverser.getCurrent()); assertEquals(0, traverser.getTokensToBeRelocated().size()); } @Test public void testEnterLeaveTraverser() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); traverser.enterNextChild(); traverser.leaveChild(); assertNotNull(traverser.getCurrent()); assertEquals(block, traverser.getCurrent()); assertEquals(0, traverser.getTokensToBeRelocated().size()); } @Test (expected = IllegalStateException.class) public void testEnterLeaveLeaveNewTraverser() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); traverser.enterNextChild(); traverser.leaveChild(); traverser.leaveChild(); // throws exception, we cannot leave root } @Test (expected = IllegalArgumentException.class) public void testTraverserSetterNull() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); traverser.addTokenToBeRelocated(null); } @Test public void testTraverserSetter() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); AbstractToken tok = modelFactory.createLexedToken(); traverser.addTokenToBeRelocated(tok); traverser.enterNextChild(); assertEquals(0, traverser.getTokensToBeRelocated().size()); traverser.leaveChild(); assertEquals(1, traverser.getTokensToBeRelocated().size()); assertEquals(tok, traverser.getTokensToBeRelocated().get(0)); } @Test public void testTraverserSetter2() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); AbstractToken tok = modelFactory.createLexedToken(); traverser.addTokenToBeRelocated(tok); traverser.enterNextChild(); assertEquals(0, traverser.getTokensToBeRelocated().size()); AbstractToken tok2 = modelFactory.createLexedToken(); traverser.addTokenToBeRelocated(tok2); AbstractToken tok3 = modelFactory.createLexedToken(); traverser.addTokenToBeRelocated(tok3); assertEquals(2, traverser.getTokensToBeRelocated().size()); assertEquals(tok2, traverser.getTokensToBeRelocated().get(0)); assertEquals(tok3, traverser.getTokensToBeRelocated().get(1)); traverser.leaveChild(); assertEquals(1, traverser.getTokensToBeRelocated().size()); assertEquals(tok, traverser.getTokensToBeRelocated().get(0)); } @Test public void testTraverserSetterMany() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlockComparer traverser = new TextBlockComparer(block, factory); AbstractToken tok = modelFactory.createLexedToken(); AbstractToken tok2 = modelFactory.createLexedToken(); Collection<AbstractToken> tokList = new ArrayList<AbstractToken>(); tokList.add(tok); tokList.add(tok2); traverser.addTokensToBeRelocated(tokList); assertEquals(2, traverser.getTokensToBeRelocated().size()); assertEquals(tok, traverser.getTokensToBeRelocated().get(0)); assertEquals(tok2, traverser.getTokensToBeRelocated().get(1)); } @Test public void testEnterTraverserWithSubtokens() throws Exception { TextBlockFactory factory = getFactory(); TextBlock block = modelFactory.createTextBlock(); TextBlock subblock = modelFactory.createTextBlock(); TextBlock subblock2 = modelFactory.createTextBlock(); TextBlock subsubblock = modelFactory.createTextBlock(); subblock.setParent(block); subblock2.setParent(block); subsubblock.setParent(subblock); TextBlockComparer traverser = new TextBlockComparer(block, factory); traverser.enterNextChild(); // in subblock assertEquals(subblock, traverser.getCurrent()); traverser.enterNextChild(); // in subsubblock assertEquals(subsubblock, traverser.getCurrent()); traverser.enterNextChild(); // below subsubblock assertNotSame(subsubblock, traverser.getCurrent()); traverser.leaveChild(); // in subsubblock assertEquals(subsubblock, traverser.getCurrent()); traverser.leaveChild(); // in subblock assertEquals(subblock, traverser.getCurrent()); traverser.enterNextChild(); // below subblock, not in subsubblock assertNotSame(subblock, traverser.getCurrent()); assertNotSame(subsubblock, traverser.getCurrent()); traverser.leaveChild(); // in subblock assertEquals(subblock, traverser.getCurrent()); traverser.leaveChild(); // in block assertEquals(block, traverser.getCurrent()); traverser.enterNextChild(); // in subblock2 assertEquals(subblock2, traverser.getCurrent()); traverser.leaveChild(); // in block assertEquals(block, traverser.getCurrent()); } /** * util method to create a factory * * @return */ private TextBlockFactory getFactory() { return new TextBlockFactory() { @Override public TextBlock createBlock() { return modelFactory.createTextBlock(); } @Override public TextBlock createNewTextBlock(TextBlockProxy proxy, TextBlock parent) { return modelFactory.createTextBlock(); } }; } /* ************* tests for context bean *****/ @Test (expected = IllegalArgumentException.class) public void testNewNullContext() throws Exception { new TextBlockTraversationContext(null, true); } @Test public void testNewContext() throws Exception { TextBlock block = modelFactory.createTextBlock(); TextBlockTraversationContext context = new TextBlockTraversationContext(block, true); assertEquals(block, context.getContextBlock()); assertEquals(-1, context.getLastVisitedChildIndex()); assertEquals(0, context.getTokensToBeRelocated().size()); assertEquals(true, context.isNewBlock()); // test boolean parameter false context = new TextBlockTraversationContext(block, false); assertEquals(block, context.getContextBlock()); assertEquals(-1, context.getLastVisitedChildIndex()); assertEquals(0, context.getTokensToBeRelocated().size()); assertEquals(false, context.isNewBlock()); } @Test public void testSetters() throws Exception { TextBlock block = modelFactory.createTextBlock(); TextBlockTraversationContext context = new TextBlockTraversationContext(block, true); context.setLastVisitedChildIndex(42); assertEquals(42, context.getLastVisitedChildIndex()); AbstractToken tok = modelFactory.createLexedToken(); context.addTokenToBeRelocated(tok); assertEquals(1, context.getTokensToBeRelocated().size()); assertEquals(tok, context.getTokensToBeRelocated().get(0)); AbstractToken tok2 = modelFactory.createLexedToken(); AbstractToken tok3 = modelFactory.createLexedToken(); Collection<AbstractToken> tokList = new ArrayList<AbstractToken>(); tokList.add(tok2); tokList.add(tok3); context.addTokensToBeRelocated(tokList); assertEquals(3, context.getTokensToBeRelocated().size()); assertEquals(tok, context.getTokensToBeRelocated().get(0)); assertEquals(tok2, context.getTokensToBeRelocated().get(1)); assertEquals(tok3, context.getTokensToBeRelocated().get(2)); } }