package com.sap.furcas.runtime.parser.textblocks.observer; import static org.junit.Assert.assertEquals; import org.junit.Test; import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock; import com.sap.furcas.runtime.textblocks.testbase.TextBlockTest; public class TestTokenRelocationUtilRelocateAfterRemoval extends TextBlockTest { @Test public void testUpdateLocationNoSubNodes() throws Exception { TextBlock root = modelFactory.createTextBlock(); root.setOffset(32); root.setOffsetRelative(false); root.setLength(23); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); // no change nor exception expected assertEquals(32, root.getOffset()); assertEquals(23, root.getLength()); assertEquals(false, root.isOffsetRelative()); } @Test (expected = NullPointerException.class) public void testUpdateLocationNull() throws Exception { // just testing the method does nothing weird TokenRelocationUtil.updateTextBlockLocationAfterRemoval(null); } @Test public void testUpdateLocationRemoveFirstAbsolute() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); root.getSubNodes().remove(first); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(30, root.getOffset()); assertEquals(40, root.getLength()); } @Test public void testUpdateLocationRemoveFirstLastAbsolute() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); root.getSubNodes().remove(first); root.getSubNodes().remove(last); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(30, root.getOffset()); assertEquals(20, root.getLength()); } @Test public void testUpdateLocationRemoveMiddleAbsolute() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); root.getSubNodes().remove(middle); // inconsistent case, but not relevant to method TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(10, root.getOffset()); assertEquals(60, root.getLength()); } @Test public void testUpdateLocationRemoveFirstTwoAbsolute() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); root.getSubNodes().remove(first); root.getSubNodes().remove(middle); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(50, root.getOffset()); assertEquals(20, root.getLength()); } @Test public void testUpdateLocationRemoveLastTwoAbsolute() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); root.getSubNodes().remove(middle); root.getSubNodes().remove(last); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(10, root.getOffset()); assertEquals(20, root.getLength()); } @Test public void testUpdateLocationRemoveLastAbsolute() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); root.getSubNodes().remove(last); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(10, root.getOffset()); assertEquals(40, root.getLength()); } /* relative offset tests */ @Test public void testUpdateLocationRemoveLastRootRelative() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); TextBlock rootroot = modelFactory.createTextBlock(); root.setParent(rootroot); rootroot.setOffsetRelative(false); rootroot.setOffset(5); root.setOffsetRelative(true); root.setOffset(5); // root offset must be same as first subnode absolute offset root.getSubNodes().remove(last); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(5, root.getOffset()); assertEquals(40, root.getLength()); assertEquals(false, root.isOffsetRelative()); } @Test public void testUpdateLocationRemoveFirstRootRelative() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); TextBlock rootroot = modelFactory.createTextBlock(); root.setParent(rootroot); rootroot.setOffsetRelative(false); rootroot.setOffset(5); root.setOffsetRelative(true); root.setOffset(5); // root offset must be same as first subnode absolute offset root.getSubNodes().remove(first); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(30, root.getOffset()); // new absolute offset == middle.absoluteOffSet assertEquals(40, root.getLength()); assertEquals(false, root.isOffsetRelative()); } @Test (expected = IllegalStateException.class) public void testUpdateLocationRemoveLastRootRelativeInconsistent() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); TextBlock rootroot = modelFactory.createTextBlock(); root.setParent(rootroot); rootroot.setOffsetRelative(false); rootroot.setOffset(5); root.setOffsetRelative(true); root.getSubNodes().remove(last); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); } @Test public void testUpdateLocationRemoveLastSubRelative() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); first.setOffsetRelative(true); first.setOffset(0); root.getSubNodes().remove(last); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(10, root.getOffset()); assertEquals(40, root.getLength()); } @Test public void testUpdateLocationAllSubRelative() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); first.setOffsetRelative(true); // absoluteOffset of first = 20 middle.setOffsetRelative(true); // absoluteOffset of middle = 40 last.setOffset(60); // keep last one absolute for fun // this is as if a virtual first node of length 10 had been removed previously TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); // root offset was 10 absolute, first relativeOffset is 10, so root offset should increase by 10 absolute assertEquals(20, root.getOffset()); assertEquals(60, root.getLength()); // all relative offsets shift by -20 assertEquals(0, first.getOffset()); assertEquals(20, middle.getOffset()); assertEquals(60, last.getOffset()); // absolute offset immune } @Test public void testUpdateLocationRemoveFirstLastRelative() throws Exception { TextBlock root = modelFactory.createTextBlock(); TextBlock first = modelFactory.createTextBlock(); TextBlock middle = modelFactory.createTextBlock(); TextBlock last = modelFactory.createTextBlock(); setupFourNodeFixtureAbsolute(root, first, middle, last); last.setOffsetRelative(true); last.setOffset(40); root.getSubNodes().remove(first); TokenRelocationUtil.updateTextBlockLocationAfterRemoval(root); assertEquals(30, root.getOffset()); assertEquals(40, root.getLength()); assertEquals(20, last.getOffset()); // relative offset must have changed since textblock offset changed } /** * util fixture * @param root * @param first * @param middle * @param last */ private void setupFourNodeFixtureAbsolute(TextBlock root, TextBlock first, TextBlock middle, TextBlock last) { root.setOffset(10); // random value to be overwritten root.setLength(60); // random value to be overwritten root.setOffsetRelative(false); first.setParent(root); first.setOffset(10); first.setLength(20); first.setOffsetRelative(false); middle.setParent(root); middle.setOffset(30); middle.setLength(20); middle.setOffsetRelative(false); last.setParent(root); last.setOffset(50); last.setLength(20); last.setOffsetRelative(false); } }