/** * */ package com.sap.furcas.runtime.textblocks.modification; import static org.junit.Assert.assertEquals; import org.junit.Test; import com.sap.furcas.metamodel.FURCAS.textblocks.Bostoken; import com.sap.furcas.metamodel.FURCAS.textblocks.Eostoken; import com.sap.furcas.metamodel.FURCAS.textblocks.LexedToken; import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock; import com.sap.furcas.metamodel.FURCAS.textblocks.Version; import com.sap.furcas.runtime.textblocks.modifcation.TbChangeUtil; import com.sap.furcas.runtime.textblocks.shortprettyprint.ShortPrettyPrinter; import com.sap.furcas.runtime.textblocks.testbase.FixtureProvidingTextBlockTest; /** * */ public class TestTbChangeUtil extends FixtureProvidingTextBlockTest { @Test public void testCleanUp() { TextBlock mainCurrent = modelFactory.createTextBlock(); mainCurrent.setVersion(Version.CURRENT); mainCurrent.getOtherVersions().add(main); main.getOtherVersions().add(mainCurrent); TextBlock middleCurrent = modelFactory.createTextBlock(); middleCurrent.setVersion(Version.CURRENT); Bostoken bosCurrent = modelFactory.createBostoken(); bosCurrent.setVersion(Version.CURRENT); Eostoken eosCurrent = modelFactory.createEostoken(); eosCurrent.setVersion(Version.CURRENT); LexedToken lexedPrevious = modelFactory.createLexedToken(); lexedPrevious.setVersion(Version.CURRENT); mainCurrent.getSubNodes().add(middleCurrent); middleCurrent.getSubNodes().add(bosCurrent); middleCurrent.getSubNodes().add(lexedPrevious); middleCurrent.getSubNodes().add(eosCurrent); assertEquals(mainCurrent, TbChangeUtil.cleanUp(main)); assertEquals(Version.REFERENCE, mainCurrent.getVersion()); assertEquals(0, mainCurrent.getOtherVersions().size()); assertEquals(Version.REFERENCE, middleCurrent.getVersion()); assertEquals(Version.REFERENCE, bosCurrent.getVersion()); assertEquals(Version.REFERENCE, lexedPrevious.getVersion()); assertEquals(Version.REFERENCE, eosCurrent.getVersion()); } @Test public void testMakeReferenceVersion() { main.setVersion(Version.CURRENT); left.setVersion(Version.PREVIOUS); leftLeft.setVersion(Version.CURRENT); lexed1.setVersion(Version.PREVIOUS); middle.setVersion(Version.CURRENT); eos.setVersion(Version.PREVIOUS); main.setRelexingNeeded(true); left.setRelexingNeeded(true); leftLeft.setRelexingNeeded(true); lexed1.setRelexingNeeded(true); middle.setRelexingNeeded(true); eos.setRelexingNeeded(true); TbChangeUtil.makeReferenceVersion(main); assertEquals(Version.REFERENCE, main.getVersion()); assertEquals(Version.REFERENCE, left.getVersion()); assertEquals(Version.REFERENCE, leftLeft.getVersion()); assertEquals(Version.REFERENCE, lexed1.getVersion()); assertEquals(Version.REFERENCE, middle.getVersion()); assertEquals(Version.REFERENCE, eos.getVersion()); main.setRelexingNeeded(false); left.setRelexingNeeded(false); leftLeft.setRelexingNeeded(false); lexed1.setRelexingNeeded(false); middle.setRelexingNeeded(false); eos.setRelexingNeeded(false); } @Test public void testMakeVersion() { main.setVersion(Version.CURRENT); left.setVersion(Version.PREVIOUS); leftLeft.setVersion(Version.CURRENT); lexed1.setVersion(Version.PREVIOUS); middle.setVersion(Version.CURRENT); eos.setVersion(Version.PREVIOUS); TbChangeUtil.makeVersion(main, Version.REFERENCE); assertEquals(Version.REFERENCE, main.getVersion()); assertEquals(Version.REFERENCE, left.getVersion()); assertEquals(Version.REFERENCE, leftLeft.getVersion()); assertEquals(Version.REFERENCE, lexed1.getVersion()); assertEquals(Version.REFERENCE, middle.getVersion()); assertEquals(Version.REFERENCE, eos.getVersion()); TbChangeUtil.makeVersion(main, Version.CURRENT); assertEquals(Version.CURRENT, main.getVersion()); assertEquals(Version.CURRENT, left.getVersion()); assertEquals(Version.CURRENT, leftLeft.getVersion()); assertEquals(Version.CURRENT, lexed1.getVersion()); assertEquals(Version.CURRENT, middle.getVersion()); assertEquals(Version.CURRENT, eos.getVersion()); } @Test public void updateOffsets() { // should change assertEquals(15, right.getOffset()); assertEquals(20, eos.getOffset()); // should not change assertEquals(0, subToken.getOffset()); assertEquals(0, subBlock4.getOffset()); assertEquals(0, subBlock3.getOffset()); assertEquals(0, subBlock2.getOffset()); assertEquals(8, subBlock1.getOffset()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, left.getOffset()); TbChangeUtil.updateOffsets(subToken, 25); // should change assertEquals(40, right.getOffset()); assertEquals(45, eos.getOffset()); // should not change assertEquals(0, subToken.getOffset()); assertEquals(0, subBlock4.getOffset()); assertEquals(0, subBlock3.getOffset()); assertEquals(0, subBlock2.getOffset()); assertEquals(8, subBlock1.getOffset()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, left.getOffset()); TbChangeUtil.updateOffsets(subToken, -3); // should change assertEquals(37, right.getOffset()); assertEquals(42, eos.getOffset()); // should not change assertEquals(0, subToken.getOffset()); assertEquals(0, subBlock4.getOffset()); assertEquals(0, subBlock3.getOffset()); assertEquals(0, subBlock2.getOffset()); assertEquals(8, subBlock1.getOffset()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, left.getOffset()); } @Test(expected = NullPointerException.class) public void testUpdateOffsetsNull() { TbChangeUtil.updateOffsets(null, 1); } @Test public void updateLengthAscending() { // should change assertEquals(1, subToken.getLength()); assertEquals(1, subBlock4.getLength()); assertEquals(1, subBlock3.getLength()); assertEquals(1, subBlock2.getLength()); assertEquals(1, subBlock1.getLength()); assertEquals(9, middle.getLength()); assertEquals(20, main.getLength()); // should not change assertEquals(5, lexed1.getLength()); assertEquals(1, lexed2.getLength()); assertEquals(8, lexed3.getLength()); assertEquals(0, bos.getLength()); assertEquals(0, eos.getLength()); TbChangeUtil.updateLengthAscending(subToken, 19); // should change assertEquals(20, subToken.getLength()); assertEquals(20, subBlock4.getLength()); assertEquals(20, subBlock3.getLength()); assertEquals(20, subBlock2.getLength()); assertEquals(20, subBlock1.getLength()); assertEquals(28, middle.getLength()); assertEquals(39, main.getLength()); // should not change assertEquals(5, lexed1.getLength()); assertEquals(1, lexed2.getLength()); assertEquals(8, lexed3.getLength()); assertEquals(0, bos.getLength()); assertEquals(0, eos.getLength()); TbChangeUtil.updateLengthAscending(subToken, -10); // should change assertEquals(10, subToken.getLength()); assertEquals(10, subBlock4.getLength()); assertEquals(10, subBlock3.getLength()); assertEquals(10, subBlock2.getLength()); assertEquals(10, subBlock1.getLength()); assertEquals(18, middle.getLength()); assertEquals(29, main.getLength()); // should not change assertEquals(5, lexed1.getLength()); assertEquals(1, lexed2.getLength()); assertEquals(8, lexed3.getLength()); assertEquals(0, bos.getLength()); assertEquals(0, eos.getLength()); } @Test(expected = IllegalArgumentException.class) public void updateLenghtAscendingInvalid() { assertEquals(1, subToken.getLength()); TbChangeUtil.updateLengthAscending(subToken, -2); } @Test public void testreplaceTokenContentsAndUpdateParentsHasValue() { // should change assertEquals("bbbbcccc", lexed3.getValue()); assertEquals(8, lexed3.getLength()); assertEquals(9, middle.getLength()); assertEquals(20, main.getLength()); assertEquals(8, subBlock1.getOffset()); assertEquals(15, right.getOffset()); assertEquals(20, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(5, right.getLength()); assertEquals(5, left.getLength()); assertEquals(1, subBlock1.getLength()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, left.getOffset()); TbChangeUtil.replaceTokenContentsAndUpdateParents(lexed3, "aaaadddd", 4, 4, new ShortPrettyPrinter(null)); // should change assertEquals("bbbbaaaadddd", lexed3.getValue()); assertEquals(12, lexed3.getLength()); assertEquals(13, middle.getLength()); assertEquals(24, main.getLength()); assertEquals(12, subBlock1.getOffset()); assertEquals(19, right.getOffset()); assertEquals(24, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(5, right.getLength()); assertEquals(5, left.getLength()); assertEquals(1, subBlock1.getLength()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, left.getOffset()); } @Test public void testreplaceTokenContentsAndUpdateParentsMakeEmpty() { // should change assertEquals("bbbbcccc", lexed3.getValue()); assertEquals(8, lexed3.getLength()); assertEquals(9, middle.getLength()); assertEquals(20, main.getLength()); assertEquals(8, subBlock1.getOffset()); assertEquals(15, right.getOffset()); assertEquals(20, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(5, right.getLength()); assertEquals(5, left.getLength()); assertEquals(1, subBlock1.getLength()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, left.getOffset()); TbChangeUtil.replaceTokenContentsAndUpdateParents(lexed3, "", 0, 8, new ShortPrettyPrinter(null)); // should change assertEquals("", lexed3.getValue()); assertEquals(0, lexed3.getLength()); assertEquals(1, middle.getLength()); assertEquals(12, main.getLength()); assertEquals(0, subBlock1.getOffset()); assertEquals(7, right.getOffset()); assertEquals(12, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(5, right.getLength()); assertEquals(5, left.getLength()); assertEquals(1, subBlock1.getLength()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, left.getOffset()); } @Test public void testreplaceTokenContentsAndUpdateParentsNoValue() { LexedToken newToken = modelFactory.createLexedToken(); newToken.setOffset(1); newToken.setOffsetRelative(true); subBlock4.getSubNodes().add(newToken); // should change assertEquals(null, newToken.getValue()); assertEquals(0, newToken.getLength()); assertEquals(1, subBlock4.getLength()); assertEquals(1, subBlock3.getLength()); assertEquals(1, subBlock2.getLength()); assertEquals(1, subBlock1.getLength()); assertEquals(9, middle.getLength()); assertEquals(20, main.getLength()); assertEquals(15, right.getOffset()); assertEquals(20, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(5, right.getLength()); assertEquals(5, left.getLength()); assertEquals(8, subBlock1.getOffset()); assertEquals(0, subBlock2.getOffset()); assertEquals(0, subBlock3.getOffset()); assertEquals(0, subBlock4.getOffset()); assertEquals(0, subToken.getOffset()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, left.getOffset()); TbChangeUtil.replaceTokenContentsAndUpdateParents(newToken, "abcde", 0, 0, new ShortPrettyPrinter(null)); // should change assertEquals("abcde", newToken.getValue()); assertEquals(5, newToken.getLength()); assertEquals(6, subBlock4.getLength()); assertEquals(6, subBlock3.getLength()); assertEquals(6, subBlock2.getLength()); assertEquals(6, subBlock1.getLength()); assertEquals(14, middle.getLength()); assertEquals(25, main.getLength()); assertEquals(20, right.getOffset()); assertEquals(25, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(5, right.getLength()); assertEquals(5, left.getLength()); assertEquals(8, subBlock1.getOffset()); assertEquals(0, subBlock2.getOffset()); assertEquals(0, subBlock3.getOffset()); assertEquals(0, subBlock4.getOffset()); assertEquals(0, subToken.getOffset()); assertEquals(6, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(5, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, left.getOffset()); } @Test(expected = IllegalArgumentException.class) public void testreplaceTokenContentsAndUpdateParentsStartOffsetNegative() { TbChangeUtil.replaceTokenContentsAndUpdateParents(subToken, "abc", -1, 0, new ShortPrettyPrinter(null)); } @Test(expected = IllegalArgumentException.class) public void testreplaceTokenContentsAndUpdateParentsStartOffsetNegativeFirst() { TbChangeUtil.replaceTokenContentsAndUpdateParents(lexed1, "abc", -1, 0, new ShortPrettyPrinter(null)); } @Test(expected = IllegalArgumentException.class) public void testreplaceTokenContentsAndUpdateParentsReplacedRegionLengthNegative() { TbChangeUtil.replaceTokenContentsAndUpdateParents(subToken, "abc", 0, -1, new ShortPrettyPrinter(null)); } @Test(expected = IllegalArgumentException.class) public void testreplaceTokenContentsAndUpdateParentsHasValueButInvalidRegion() { subToken.setValue("c"); TbChangeUtil.replaceTokenContentsAndUpdateParents(subToken, "abc", 1, 1, new ShortPrettyPrinter(null)); } @Test(expected = IllegalArgumentException.class) public void testreplaceTokenContentsAndUpdateParentsNoValueButInvalidRegion() { TbChangeUtil.replaceTokenContentsAndUpdateParents(subToken, "abc", 1, 1, new ShortPrettyPrinter(null)); } }