package com.sap.furcas.runtime.textblocks.model; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import com.sap.furcas.metamodel.FURCAS.textblocks.DocumentNode; 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.TbNavigationUtil; import com.sap.furcas.runtime.textblocks.modifcation.TbChangeUtil; import com.sap.furcas.runtime.textblocks.shortprettyprint.ShortPrettyPrinter; import com.sap.furcas.runtime.textblocks.testbase.FixtureProvidingTextBlockTest; import com.sap.furcas.runtime.textblocks.testbase.TextblocksTestHelper; import com.sap.furcas.runtime.textblocks.validation.TbValidationUtil; public class TestTextBlocksModel extends FixtureProvidingTextBlockTest { private TextBlocksModel tbModel; private String completeFixtureText; @Before public void setupTbModel() { tbModel = new TextBlocksModel(main); // has to match the fixture model completeFixtureText = "aaaaa*bbbbcccc+ddddd"; } /** * Check that all offsets return the correct char. * */ @Test public void testGetChar() { for (int i = 0; i < completeFixtureText.length(); i++) { assertEquals("char at offset " + i, completeFixtureText.charAt(i), tbModel.get(i)); } } @Test(expected = IllegalArgumentException.class) public void testGetCharOffsetNegative() { tbModel.get(completeFixtureText.length() + 1); } @Test(expected = IllegalArgumentException.class) public void testGetCharOffsetTooLarge() { tbModel.get(-1); } /** * Check that all offsets and lengths return the correct region. * * Take each possible valid length between 0 and the length of the fixture * text and start at each possible offset. * * @throws Exception */ @Test public void testGetRegion() throws Exception { for (int length = 0; length <= completeFixtureText.length(); length++) { for (int offset = 0; offset <= completeFixtureText.length() - length; offset++) { assertEquals("region at offset " + offset + " of length " + length, completeFixtureText.substring(offset, offset + length), tbModel.get(offset, length)); } } } @Test(expected = IllegalArgumentException.class) public void testGetRegionLengthNegative() throws Exception { tbModel.get(0, -1); } @Test(expected = IllegalArgumentException.class) public void testGetRegionOffsetNegative() throws Exception { tbModel.get(-1, 1); } @Test(expected = IllegalArgumentException.class) public void testGetRegionOffsetTooLarge() throws Exception { tbModel.get(completeFixtureText.length() + 1, 1); } @Test(expected = IllegalArgumentException.class) public void testGetRegionLengthTooLarge() throws Exception { tbModel.get(completeFixtureText.length() - 1, 2); } @Test public void testGetFloorToken() { // completeFixtureText = "aaaaa*bbbbcccc+ddddd"; assertEquals(lexed1, tbModel.getFloorTokenInRoot(0)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(1)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(4)); assertEquals(lexed2, tbModel.getFloorTokenInRoot(5)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(6)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(8)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(13)); assertEquals(subToken, tbModel.getFloorTokenInRoot(14)); assertEquals(lexed4, tbModel.getFloorTokenInRoot(15)); assertEquals(lexed4, tbModel.getFloorTokenInRoot(16)); assertEquals(lexed4, tbModel.getFloorTokenInRoot(19)); assertEquals(lexed4, tbModel.getFloorTokenInRoot(20)); main.getSubNodes().clear(); main.getSubNodes().add(bos); main.getSubNodes().add(eos); assertEquals(null, tbModel.getFloorTokenInRoot(0)); } @Test public void testGetLength() { assertEquals(completeFixtureText.length(), tbModel.getLength()); } @Test public void testRemoveNode() { // TODO: check calls to locationMap by mocking // a // - b1 // - - c // - - - d // - - - - e // - b2 TextBlock a = modelFactory.createTextBlock(); TextBlock b1 = modelFactory.createTextBlock(); LexedToken b2 = modelFactory.createLexedToken(); TextBlock c = modelFactory.createTextBlock(); TextBlock d = modelFactory.createTextBlock(); LexedToken e = modelFactory.createLexedToken(); b2.setLength(12); b2.setOffset(20); e.setLength(20); resource.getContents().add(a); a.getSubNodes().add(b1); a.getSubNodes().add(b2); b1.getSubNodes().add(c); c.getSubNodes().add(d); d.getSubNodes().add(e); // should only remove b2 assertEquals(true, a.getTokens().contains(b2)); assertEquals(false, TextblocksTestHelper.isDeleted(b1)); assertEquals(false, TextblocksTestHelper.isDeleted(a)); TbChangeUtil.removeNode(b2); assertEquals(true, TextblocksTestHelper.isDeleted(b2)); assertEquals(false, TextblocksTestHelper.isDeleted(a)); // should now remove e, d, c, b1 and a (as b2 was already deleted) assertEquals(true, d.getTokens().contains(e)); assertEquals(true, c.getSubBlocks().contains(d)); assertEquals(true, b1.getSubBlocks().contains(c)); assertEquals(true, a.getSubBlocks().contains(b1)); assertEquals(false, TextblocksTestHelper.isDeleted(e)); assertEquals(false, TextblocksTestHelper.isDeleted(d)); assertEquals(false, TextblocksTestHelper.isDeleted(c)); assertEquals(false, TextblocksTestHelper.isDeleted(b1)); assertEquals(false, TextblocksTestHelper.isDeleted(a)); TbChangeUtil.removeNode(e); assertEquals(true, TextblocksTestHelper.isDeleted(e)); assertEquals(true, TextblocksTestHelper.isDeleted(d)); assertEquals(true, TextblocksTestHelper.isDeleted(c)); assertEquals(true, TextblocksTestHelper.isDeleted(b1)); assertEquals(true, TextblocksTestHelper.isDeleted(a)); // should not throw an exception TbChangeUtil.removeNode(null); } @Test public void removeTextBlockIfEmpty() { // TODO: check calls to locationMap by mocking // a // - b1 // - - c // - - - d (empty) // - b2 TextBlock a = modelFactory.createTextBlock(); TextBlock b1 = modelFactory.createTextBlock(); LexedToken b2 = modelFactory.createLexedToken(); TextBlock c = modelFactory.createTextBlock(); TextBlock d = modelFactory.createTextBlock(); b2.setLength(12); resource.getContents().add(a); a.getSubNodes().add(b1); a.getSubNodes().add(b2); b1.getSubNodes().add(c); c.getSubNodes().add(d); // should not remove b1 assertEquals(true, a.getSubBlocks().contains(b1)); assertEquals(false, TextblocksTestHelper.isDeleted(b1)); TbChangeUtil.removeTextBlockIfEmpty(b1); assertEquals(false, TextblocksTestHelper.isDeleted(b1)); assertEquals(true, a.getSubBlocks().contains(b1)); // should remove d, c and b1 assertEquals(true, c.getSubBlocks().contains(d)); assertEquals(true, b1.getSubBlocks().contains(c)); assertEquals(true, a.getSubBlocks().contains(b1)); assertEquals(false, TextblocksTestHelper.isDeleted(d)); assertEquals(false, TextblocksTestHelper.isDeleted(c)); assertEquals(false, TextblocksTestHelper.isDeleted(b1)); TbChangeUtil.removeTextBlockIfEmpty(d); assertEquals(true, TextblocksTestHelper.isDeleted(d)); assertEquals(true, TextblocksTestHelper.isDeleted(c)); assertEquals(true, TextblocksTestHelper.isDeleted(b1)); // should not throw an exception TbChangeUtil.removeTextBlockIfEmpty(null); } @Test public void testReplaceAllEmpty() throws Exception { tbModel.replace(0, completeFixtureText.length(), ""); assertReplace(0, completeFixtureText.length(), ""); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceFromEmptyTwice() throws Exception { tbModel.replace(0, completeFixtureText.length(), ""); assertReplace(0, completeFixtureText.length(), ""); // replace like typing keystrokes twice tbModel.replace(0, 0, "a"); tbModel.replace(1, 0, "b"); assertEquals("ab", tbModel.get(0, 2)); } @Test public void testReplaceAllEmptyPreviousVersion() throws Exception { // TODO: check calls to locationMap by mocking // make used fixture of version PREVIOUS to prevent getWorkingCopy // to create a different version and check deletions, values etc TbChangeUtil.makeVersion(main, Version.PREVIOUS); // should change assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, main.isChildrenChanged()); assertEquals(20, main.getLength()); assertEquals(20, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); tbModel.replace(0, completeFixtureText.length(), ""); assertReplace(0, completeFixtureText.length(), ""); // should change assertEquals(true, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(true, TextblocksTestHelper.isDeleted(subToken)); assertEquals(true, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(true, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(true, TextblocksTestHelper.isDeleted(middle)); assertEquals(true, TextblocksTestHelper.isDeleted(right)); assertEquals(true, main.isChildrenChanged()); assertEquals(0, main.getLength()); assertEquals(0, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); assertEquals(3, main.getTokens().size()); assertEquals(0, main.getSubBlocks().size()); assertEquals(completeFixtureText, main.getTokens().get(1).getValue()); assertEquals(bos, TbNavigationUtil.getSubNodeAt(main, 0)); assertEquals(eos, TbNavigationUtil.getSubNodeAt(main, 2)); } @Test public void testReplaceAllShortString() throws Exception { tbModel.replace(0, completeFixtureText.length(), "x"); assertReplace(0, completeFixtureText.length(), "x"); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceAllShortStringPreviousVersion() throws Exception { // make used fixture of version PREVIOUS to prevent getWorkingCopy // to create a different version and check deletions, values etc TbChangeUtil.makeVersion(main, Version.PREVIOUS); // should change assertEquals("aaaaa", lexed1.getValue()); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, main.isChildrenChanged()); assertEquals(false, left.isChildrenChanged()); assertEquals(false, leftLeft.isChildrenChanged()); assertEquals(20, main.getLength()); assertEquals(20, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); tbModel.replace(0, completeFixtureText.length(), "x"); assertReplace(0, completeFixtureText.length(), "x"); // should change assertEquals("x", lexed1.getValue()); assertEquals(true, TextblocksTestHelper.isDeleted(subToken)); assertEquals(true, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(true, TextblocksTestHelper.isDeleted(middle)); assertEquals(true, TextblocksTestHelper.isDeleted(right)); assertEquals(true, main.isChildrenChanged()); assertEquals(true, left.isChildrenChanged()); assertEquals(true, leftLeft.isChildrenChanged()); assertEquals(1, main.getLength()); assertEquals(1, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); assertEquals(bos, TbNavigationUtil.getSubNodeAt(main, 0)); assertEquals(eos, TbNavigationUtil.getSubNodeAt(main, 2)); } @Test public void testReplaceAllLongString() throws Exception { tbModel.replace(0, completeFixtureText.length(), "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); assertReplace(0, completeFixtureText.length(), "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceAllLongStringPreviousVersion() throws Exception { // make used fixture of version PREVIOUS to prevent getWorkingCopy // to create a different version and check deletions, values etc TbChangeUtil.makeVersion(main, Version.PREVIOUS); // should change assertEquals("aaaaa", lexed1.getValue()); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, main.isChildrenChanged()); assertEquals(false, left.isChildrenChanged()); assertEquals(false, leftLeft.isChildrenChanged()); assertEquals(20, main.getLength()); assertEquals(20, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); tbModel.replace(0, completeFixtureText.length(), "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); assertReplace(0, completeFixtureText.length(), "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); // should change assertEquals("xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx", lexed1.getValue()); assertEquals(true, TextblocksTestHelper.isDeleted(subToken)); assertEquals(true, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(true, TextblocksTestHelper.isDeleted(middle)); assertEquals(true, TextblocksTestHelper.isDeleted(right)); assertEquals(true, main.isChildrenChanged()); assertEquals(true, left.isChildrenChanged()); assertEquals(true, leftLeft.isChildrenChanged()); assertEquals(37, main.getLength()); assertEquals(37, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceMiddleEmpty() throws Exception { tbModel.replace(14, 4, ""); assertReplace(14, 4, ""); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceMiddleEmptyPreviousVersion() throws Exception { // make used fixture of version PREVIOUS to prevent getWorkingCopy // to create a different version and check deletions, values etc TbChangeUtil.makeVersion(main, Version.PREVIOUS); // should change assertEquals("+", subToken.getValue()); assertEquals("ddddd", lexed4.getValue()); assertEquals(false, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, main.isChildrenChanged()); assertEquals(false, middle.isChildrenChanged()); assertEquals(false, right.isChildrenChanged()); assertEquals(20, main.getLength()); assertEquals(20, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); tbModel.replace(14, 4, ""); assertReplace(14, 4, ""); // should change assertEquals("dd", lexed4.getValue()); assertEquals(true, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(true, TextblocksTestHelper.isDeleted(subToken)); assertEquals(true, main.isChildrenChanged()); assertEquals(true, middle.isChildrenChanged()); assertEquals(true, right.isChildrenChanged()); assertEquals(16, main.getLength()); assertEquals(16, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceMiddleShortString() throws Exception { tbModel.replace(11, 7, "x"); assertReplace(11, 7, "x"); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceMiddleShortStringPreviousVersion() throws Exception { // make used fixture of version PREVIOUS to prevent getWorkingCopy // to create a different version and check deletions, values etc TbChangeUtil.makeVersion(main, Version.PREVIOUS); // should change assertEquals("bbbbcccc", lexed3.getValue()); assertEquals("+", subToken.getValue()); assertEquals("ddddd", lexed4.getValue()); assertEquals(false, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, main.isChildrenChanged()); assertEquals(false, middle.isChildrenChanged()); assertEquals(false, right.isChildrenChanged()); assertEquals(20, main.getLength()); assertEquals(20, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); tbModel.replace(11, 7, "x"); assertReplace(11, 7, "x"); // should change assertEquals("bbbbcx", lexed3.getValue()); assertEquals("dd", lexed4.getValue()); assertEquals(true, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(true, TextblocksTestHelper.isDeleted(subToken)); assertEquals(true, main.isChildrenChanged()); assertEquals(true, middle.isChildrenChanged()); assertEquals(true, right.isChildrenChanged()); assertEquals(14, main.getLength()); assertEquals(14, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceMiddleLongString() throws Exception { tbModel.replace(4, 11, "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); assertReplace(4, 11, "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceMiddleLongStringPreviousVersion() throws Exception { // make used fixture of version PREVIOUS to prevent getWorkingCopy // to create a different version and check deletions, values etc TbChangeUtil.makeVersion(main, Version.PREVIOUS); // should change assertEquals("aaaaa", lexed1.getValue()); assertEquals("ddddd", lexed4.getValue()); assertEquals(false, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, main.isChildrenChanged()); assertEquals(false, left.isChildrenChanged()); assertEquals(false, leftLeft.isChildrenChanged()); assertEquals(false, right.isChildrenChanged()); assertEquals(20, main.getLength()); assertEquals(20, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); tbModel.replace(4, 11, "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); assertReplace(4, 11, "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); // should change assertEquals("aaaaxxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx", lexed1.getValue()); assertEquals("ddddd", lexed4.getValue()); assertEquals(true, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(true, TextblocksTestHelper.isDeleted(middle)); assertEquals(true, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(true, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(true, TextblocksTestHelper.isDeleted(subToken)); assertEquals(true, main.isChildrenChanged()); assertEquals(true, left.isChildrenChanged()); assertEquals(true, leftLeft.isChildrenChanged()); assertEquals(true, right.isChildrenChanged()); assertEquals(46, main.getLength()); assertEquals(46, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceAddToEnd() throws Exception { tbModel.replace(completeFixtureText.length(), 0, "xxxxx"); assertReplace(completeFixtureText.length(), 0, "xxxxx"); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testReplaceAddToEndPreviousVersion() throws Exception { // make used fixture of version PREVIOUS to prevent getWorkingCopy // to create a different version and check deletions, values etc TbChangeUtil.makeVersion(main, Version.PREVIOUS); // should change assertEquals("ddddd", lexed4.getValue()); assertEquals(false, main.isChildrenChanged()); assertEquals(false, right.isChildrenChanged()); assertEquals(20, main.getLength()); assertEquals(20, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, left.isChildrenChanged()); assertEquals(false, leftLeft.isChildrenChanged()); assertEquals(false, middle.isChildrenChanged()); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); tbModel.replace(completeFixtureText.length(), 0, "xxxxx"); assertReplace(completeFixtureText.length(), 0, "xxxxx"); // should change assertEquals("dddddxxxxx", lexed4.getValue()); assertEquals(true, main.isChildrenChanged()); assertEquals(true, right.isChildrenChanged()); assertEquals(25, main.getLength()); assertEquals(25, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(main)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed2)); assertEquals(false, TextblocksTestHelper.isDeleted(middle)); assertEquals(false, TextblocksTestHelper.isDeleted(subBlock1)); assertEquals(false, TextblocksTestHelper.isDeleted(subToken)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed3)); assertEquals(false, TextblocksTestHelper.isDeleted(right)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed4)); assertEquals(false, TextblocksTestHelper.isDeleted(bos)); assertEquals(false, TextblocksTestHelper.isDeleted(eos)); assertEquals(false, left.isChildrenChanged()); assertEquals(false, leftLeft.isChildrenChanged()); assertEquals(false, middle.isChildrenChanged()); assertEquals(false, bos.isChildrenChanged()); assertEquals(false, eos.isChildrenChanged()); // re-replace original string tbModel.replace(0, tbModel.getLength(), completeFixtureText); assertEquals(completeFixtureText, tbModel.get(0, tbModel.getLength())); } @Test public void testGetNodesBetweenAsRootSetSameBlock() { // add newLexed to middle, so that we have two tokens and the block in // between LexedToken newLexed = modelFactory.createLexedToken(); middle.getSubNodes().add(newLexed); newLexed.setOffset(9); newLexed.setOffsetRelative(true); TbChangeUtil.replaceTokenContentsAndUpdateParents(newLexed, "test", 0, 0, new ShortPrettyPrinter(null)); TbValidationUtil.assertTextBlockConsistency(middle); List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); expectedNodes.add(lexed3); // token starts at 6, length 8 expectedNodes.add(subBlock1); // length 1 expectedNodes.add(newLexed); List<DocumentNode> resultNodes = tbModel.getNodesBetweenAsRootSet(main, 6, 15); assertEquals(expectedNodes.size(), resultNodes.size()); assertEquals(expectedNodes, resultNodes); } @Test public void testGetNodesBetweenAsRootSetSameLevel() { // add newLexed to the end of right, to check if descend gathers all // left siblings of // the right floor token and its parents LexedToken newLexed = modelFactory.createLexedToken(); right.getSubNodes().add(newLexed); newLexed.setOffset(5); TbChangeUtil.replaceTokenContentsAndUpdateParents(newLexed, "test", 0, 0, new ShortPrettyPrinter(null)); List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); expectedNodes.add(lexed3); // token starts at 6, length 8 expectedNodes.add(subBlock1); // length 1 expectedNodes.add(lexed4); expectedNodes.add(newLexed); List<DocumentNode> resultNodes = tbModel.getNodesBetweenAsRootSet(main, 6, 20); assertEquals(expectedNodes.size(), resultNodes.size()); assertEquals(expectedNodes, resultNodes); } @Test public void testGetNodesBetweenAsRootSetLeftLowerLevel() { // add a level 1 token, so that lexed1 (level 3) have a level difference // of at least 2 LexedToken newLexed = modelFactory.createLexedToken(); main.getSubNodes().remove(eos); main.getSubNodes().add(newLexed); newLexed.setOffset(20); TbChangeUtil.replaceTokenContentsAndUpdateParents(newLexed, "test", 0, 0, new ShortPrettyPrinter(null)); main.getSubNodes().add(eos); eos.setOffset(24); List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); expectedNodes.add(lexed1); expectedNodes.add(lexed2); expectedNodes.add(middle); expectedNodes.add(right); expectedNodes.add(newLexed); List<DocumentNode> resultNodes = tbModel.getNodesBetweenAsRootSet(main, 0, 20); assertEquals(expectedNodes.size(), resultNodes.size()); assertEquals(expectedNodes, resultNodes); } @Test public void testGetNodesBetweenAsRootSetLeftHigherLevel() { // add some more nodes, as standard fixture is rather sparse // also, add more depth, so make the level difference of the floor // tokens // at least 2 TextBlock newBlock = modelFactory.createTextBlock(); LexedToken newLexed = modelFactory.createLexedToken(); newLexed.setOffsetRelative(true); LexedToken newLexed2 = modelFactory.createLexedToken(); right.getSubNodes().add(newBlock); newBlock.setOffset(5); newBlock.setOffsetRelative(true); newBlock.getSubNodes().add(newLexed); TbChangeUtil.replaceTokenContentsAndUpdateParents(newLexed, "test", 0, 0, new ShortPrettyPrinter(null)); newBlock.getSubNodes().add(newLexed2); newLexed2.setOffset(4); newLexed2.setOffsetRelative(true); TbChangeUtil.replaceTokenContentsAndUpdateParents(newLexed2, "other", 0, 0, new ShortPrettyPrinter(null)); List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); expectedNodes.add(lexed2); expectedNodes.add(middle); expectedNodes.add(lexed4); expectedNodes.add(newLexed); expectedNodes.add(newLexed2); List<DocumentNode> resultNodes = tbModel.getNodesBetweenAsRootSet(main, 5, 24); assertEquals(expectedNodes.size(), resultNodes.size()); assertEquals(expectedNodes, resultNodes); } @Test public void testGetNodesBetweenAsRootSetLeftMuchHigherLevel() { // test with a high level difference // add some more tokens, as the standard fixture is rather sparse TextBlock newBlock = modelFactory.createTextBlock(); LexedToken newLexed = modelFactory.createLexedToken(); newLexed.setOffsetRelative(true); LexedToken newLexed2 = modelFactory.createLexedToken(); subBlock4.getSubNodes().add(newBlock); newBlock.setOffset(1); newBlock.setOffsetRelative(true); newBlock.getSubNodes().add(newLexed); TbChangeUtil.replaceTokenContentsAndUpdateParents(newLexed, "test", 0, 0, new ShortPrettyPrinter(null)); newBlock.getSubNodes().add(newLexed2); newLexed2.setOffset(4); newLexed2.setOffsetRelative(true); TbChangeUtil.replaceTokenContentsAndUpdateParents(newLexed2, "other", 0, 0, new ShortPrettyPrinter(null)); List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); expectedNodes.add(lexed2); expectedNodes.add(lexed3); expectedNodes.add(subToken); expectedNodes.add(newLexed); expectedNodes.add(newLexed2); List<DocumentNode> resultNodes = tbModel.getNodesBetweenAsRootSet(main, 5, 19); assertEquals(expectedNodes.size(), resultNodes.size()); assertEquals(expectedNodes, resultNodes); } @Test public void testGetNodesBetweenAsRootSetSameToken() { List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); expectedNodes.add(lexed3); // token starts at 6, length 8 List<DocumentNode> resultNodes = tbModel.getNodesBetweenAsRootSet(main, 6, 13); assertEquals(expectedNodes.size(), resultNodes.size()); assertEquals(expectedNodes, resultNodes); } @Test public void testGetNodesBetweenAsRootSetSameOffset() { List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); expectedNodes.add(lexed3); // token starts at 6, length 8 List<DocumentNode> resultNodes = tbModel.getNodesBetweenAsRootSet(main, 6, 6); assertEquals(expectedNodes.size(), resultNodes.size()); assertEquals(expectedNodes, resultNodes); } @Test public void testAddRightSiblingsBeforeEndNode() { TextBlock top = modelFactory.createTextBlock(); LexedToken t1 = modelFactory.createLexedToken(); LexedToken t2 = modelFactory.createLexedToken(); TextBlock t3 = modelFactory.createTextBlock(); LexedToken t4 = modelFactory.createLexedToken(); LexedToken t5 = modelFactory.createLexedToken(); LexedToken x = modelFactory.createLexedToken(); top.getSubNodes().add(t1); top.getSubNodes().add(t2); top.getSubNodes().add(t3); top.getSubNodes().add(t4); top.getSubNodes().add(t5); t1.setOffset(0); t2.setOffset(2); t3.setOffset(3); t4.setOffset(8); t5.setOffset(10); List<DocumentNode> expectedNodes = new ArrayList<DocumentNode>(); List<DocumentNode> resultNodes = new ArrayList<DocumentNode>(); tbModel.addRightSiblingsBeforeEndNode(resultNodes, t1, t1); assertEquals(expectedNodes, resultNodes); resultNodes.clear(); tbModel.addRightSiblingsBeforeEndNode(resultNodes, t1, t2); assertEquals(expectedNodes, resultNodes); expectedNodes.add(t2); resultNodes.clear(); tbModel.addRightSiblingsBeforeEndNode(resultNodes, t1, t3); assertEquals(expectedNodes, resultNodes); expectedNodes.add(t3); resultNodes.clear(); tbModel.addRightSiblingsBeforeEndNode(resultNodes, t1, t4); assertEquals(expectedNodes, resultNodes); expectedNodes.add(t4); resultNodes.clear(); tbModel.addRightSiblingsBeforeEndNode(resultNodes, t1, t5); assertEquals(expectedNodes, resultNodes); expectedNodes.add(t5); resultNodes.clear(); tbModel.addRightSiblingsBeforeEndNode(resultNodes, t1, null); assertEquals(expectedNodes, resultNodes); resultNodes.clear(); tbModel.addRightSiblingsBeforeEndNode(resultNodes, t1, x); assertEquals(expectedNodes, resultNodes); } /** * Asserts, that the original value (assumed to be completeFixtureText) was * replaced correctly, by checking, if get returns the right string for the * whole document. * * @param offset * offset replacement starts * @param length * length of replacement * @param newText * new text * @throws Exception */ private void assertReplace(int offset, int length, String newText) throws Exception { String beforeReplace = completeFixtureText.substring(0, offset); String afterReplace = completeFixtureText.substring(offset + length, completeFixtureText.length()); String expectedCompleteText = beforeReplace + newText + afterReplace; assertEquals(expectedCompleteText, tbModel.get(0, tbModel.getLength())); } }