/** * */ package com.sap.furcas.runtime.textblocks.modification; import static org.junit.Assert.assertEquals; import org.junit.Ignore; 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.FixtureWithGapsProvidingTextBlockTest; /** * */ public class TestTbChangeUtilWithGaps extends FixtureWithGapsProvidingTextBlockTest { @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(32, right.getOffset()); assertEquals(40, eos.getOffset()); // should not change assertEquals(1, subToken.getOffset()); assertEquals(1, subBlock4.getOffset()); assertEquals(1, subBlock3.getOffset()); assertEquals(1, subBlock2.getOffset()); assertEquals(9, subBlock1.getOffset()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(3, left.getOffset()); TbChangeUtil.updateOffsets(subToken, 25); // should change assertEquals(57, right.getOffset()); assertEquals(65, eos.getOffset()); // should not change assertEquals(1, subToken.getOffset()); assertEquals(1, subBlock4.getOffset()); assertEquals(1, subBlock3.getOffset()); assertEquals(1, subBlock2.getOffset()); assertEquals(9, subBlock1.getOffset()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(3, left.getOffset()); TbChangeUtil.updateOffsets(subToken, -3); // should change assertEquals(54, right.getOffset()); assertEquals(62, eos.getOffset()); // should not change assertEquals(1, subToken.getOffset()); assertEquals(1, subBlock4.getOffset()); assertEquals(1, subBlock3.getOffset()); assertEquals(1, subBlock2.getOffset()); assertEquals(9, subBlock1.getOffset()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(3, left.getOffset()); } @Test public void updateLengthAscending() { // should change assertEquals(1, subToken.getLength()); assertEquals(3, subBlock4.getLength()); assertEquals(5, subBlock3.getLength()); assertEquals(7, subBlock2.getLength()); assertEquals(9, subBlock1.getLength()); assertEquals(19, middle.getLength()); assertEquals(40, 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(22, subBlock4.getLength()); assertEquals(24, subBlock3.getLength()); assertEquals(26, subBlock2.getLength()); assertEquals(28, subBlock1.getLength()); assertEquals(38, middle.getLength()); assertEquals(59, 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(12, subBlock4.getLength()); assertEquals(14, subBlock3.getLength()); assertEquals(16, subBlock2.getLength()); assertEquals(18, subBlock1.getLength()); assertEquals(28, middle.getLength()); assertEquals(49, 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(19, middle.getLength()); assertEquals(40, main.getLength()); assertEquals(9, subBlock1.getOffset()); assertEquals(32, right.getOffset()); assertEquals(40, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(8, right.getLength()); assertEquals(8, left.getLength()); assertEquals(9, subBlock1.getLength()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(3, left.getOffset()); TbChangeUtil.replaceTokenContentsAndUpdateParents(lexed3, "aaaadddd", 4, 4, new ShortPrettyPrinter(null)); // should change assertEquals("bbbbaaaadddd", lexed3.getValue()); assertEquals(12, lexed3.getLength()); assertEquals(23, middle.getLength()); assertEquals(44, main.getLength()); assertEquals(13, subBlock1.getOffset()); assertEquals(36, right.getOffset()); assertEquals(44, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(8, right.getLength()); assertEquals(8, left.getLength()); assertEquals(9, subBlock1.getLength()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(3, left.getOffset()); } @Test public void testreplaceTokenContentsAndUpdateParentsMakeEmpty() { // should change assertEquals("bbbbcccc", lexed3.getValue()); assertEquals(8, lexed3.getLength()); assertEquals(19, middle.getLength()); assertEquals(40, main.getLength()); assertEquals(9, subBlock1.getOffset()); assertEquals(32, right.getOffset()); assertEquals(40, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(8, right.getLength()); assertEquals(8, left.getLength()); assertEquals(9, subBlock1.getLength()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(3, left.getOffset()); TbChangeUtil.replaceTokenContentsAndUpdateParents(lexed3, "", 0, 8, new ShortPrettyPrinter(null)); // should change assertEquals("", lexed3.getValue()); assertEquals(0, lexed3.getLength()); assertEquals(11, middle.getLength()); assertEquals(32, main.getLength()); assertEquals(1, subBlock1.getOffset()); assertEquals(24, right.getOffset()); assertEquals(32, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(8, right.getLength()); assertEquals(8, left.getLength()); assertEquals(9, subBlock1.getLength()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(3, left.getOffset()); } @Test public void testreplaceTokenContentsAndUpdateParentsNoValue() { LexedToken newToken = modelFactory.createLexedToken(); newToken.setOffset(2); newToken.setOffsetRelative(true); subBlock4.getSubNodes().add(newToken); // should change assertEquals(null, newToken.getValue()); assertEquals(0, newToken.getLength()); assertEquals(3, subBlock4.getLength()); assertEquals(5, subBlock3.getLength()); assertEquals(7, subBlock2.getLength()); assertEquals(9, subBlock1.getLength()); assertEquals(19, middle.getLength()); assertEquals(40, main.getLength()); assertEquals(32, right.getOffset()); assertEquals(40, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(8, right.getLength()); assertEquals(8, left.getLength()); assertEquals(1, subToken.getOffset()); assertEquals(1, subBlock4.getOffset()); assertEquals(1, subBlock3.getOffset()); assertEquals(1, subBlock2.getOffset()); assertEquals(9, subBlock1.getOffset()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(3, left.getOffset()); TbChangeUtil.replaceTokenContentsAndUpdateParents(newToken, "abcde", 0, 0, new ShortPrettyPrinter(null)); // should change assertEquals("abcde", newToken.getValue()); assertEquals(5, newToken.getLength()); assertEquals(8, subBlock4.getLength()); assertEquals(10, subBlock3.getLength()); assertEquals(12, subBlock2.getLength()); assertEquals(14, subBlock1.getLength()); assertEquals(24, middle.getLength()); assertEquals(45, main.getLength()); assertEquals(37, right.getOffset()); assertEquals(45, eos.getOffset()); // should not change assertEquals(5, lexed4.getLength()); assertEquals(8, right.getLength()); assertEquals(8, left.getLength()); assertEquals(1, subToken.getOffset()); assertEquals(1, subBlock4.getOffset()); assertEquals(1, subBlock3.getOffset()); assertEquals(1, subBlock2.getOffset()); assertEquals(9, subBlock1.getOffset()); assertEquals(13, middle.getOffset()); assertEquals(0, main.getOffset()); assertEquals(0, lexed4.getOffset()); assertEquals(0, bos.getOffset()); assertEquals(0, lexed1.getOffset()); assertEquals(11, lexed2.getOffset()); assertEquals(0, lexed3.getOffset()); assertEquals(3, left.getOffset()); } @Test @Ignore // implementation TbUtil.replaceTokenContents to be changed not to support // gaps anyways. public void testReplaceTokenContentIntoGap() { // should change assertEquals(3, left.getOffset()); // should not change assertEquals(13, middle.getOffset()); assertEquals(0, leftLeft.getOffset()); // Moves the lexed token into gap before left TbChangeUtil.replaceTokenContentsAndUpdateParents(lexed1, "aaaaa", -1, 5, new ShortPrettyPrinter(null)); // should change assertEquals(2, left.getOffset()); assertEquals(0, leftLeft.getOffset()); // should not change assertEquals(13, middle.getOffset()); } @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)); } }