package com.sap.furcas.runtime.textblocks.model; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; 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.testbase.FixtureWithGapsProvidingTextBlockTest; import com.sap.furcas.runtime.textblocks.testbase.TextblocksTestHelper; public class TestTextBlocksModelWithGaps extends FixtureWithGapsProvidingTextBlockTest { 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 testGetCharOffsetTooLarge() { tbModel.get(completeFixtureText.length() + 1); } @Test(expected = IllegalArgumentException.class) public void testGetCharOffsetNegative() { 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 { String result; for (int length = 0; length <= completeFixtureText.length(); length++) { for (int offset = 0; offset <= completeFixtureText.length() - length; offset++) { result = tbModel.get(offset, length); assertEquals("region at offset " + offset + " of length " + length, completeFixtureText.substring(offset, offset + length), result); } } } @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(null, tbModel.getFloorTokenInRoot(0)); assertEquals(null, tbModel.getFloorTokenInRoot(1)); assertEquals(null, tbModel.getFloorTokenInRoot(2)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(3)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(4)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(5)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(6)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(7)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(8)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(9)); assertEquals(lexed1, tbModel.getFloorTokenInRoot(10)); assertEquals(lexed2, tbModel.getFloorTokenInRoot(11)); assertEquals(lexed2, tbModel.getFloorTokenInRoot(12)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(13)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(14)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(15)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(16)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(17)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(18)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(19)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(20)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(21)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(22)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(23)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(24)); assertEquals(lexed3, tbModel.getFloorTokenInRoot(25)); assertEquals(subToken, tbModel.getFloorTokenInRoot(26)); assertEquals(subToken, tbModel.getFloorTokenInRoot(27)); assertEquals(subToken, tbModel.getFloorTokenInRoot(28)); assertEquals(subToken, tbModel.getFloorTokenInRoot(29)); assertEquals(subToken, tbModel.getFloorTokenInRoot(30)); assertEquals(subToken, tbModel.getFloorTokenInRoot(31)); assertEquals(lexed4, tbModel.getFloorTokenInRoot(32)); assertEquals(lexed4, tbModel.getFloorTokenInRoot(40)); 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(40, main.getLength()); assertEquals(40, 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(40, main.getLength()); assertEquals(40, eos.getOffset()); assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); // 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(), "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(1, main.getLength()); assertEquals(1, eos.getOffset()); // should not change assertEquals(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); 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(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(false, TextblocksTestHelper.isDeleted(left)); assertEquals(false, TextblocksTestHelper.isDeleted(leftLeft)); assertEquals(false, TextblocksTestHelper.isDeleted(lexed1)); assertEquals(40, main.getLength()); assertEquals(40, 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(), "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(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(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(40, main.getLength()); assertEquals(40, 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(21, 14, ""); assertReplace(21, 14, ""); // 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(26, main.getLength()); assertEquals(26, 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(40, main.getLength()); assertEquals(40, 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(18, 17, "x"); assertReplace(18, 17, "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(24, main.getLength()); assertEquals(24, 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 { boolean useCache = tbModel.isUsecache(); tbModel.setUsecache(true); 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())); tbModel.setUsecache(useCache); } @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(40, main.getLength()); assertEquals(40, 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()); tbModel.replace(4, 28, "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); assertReplace(4, 28, "xxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx"); // should change assertEquals("axxxxxyyyyxxxxyyyyxxxxyyyyxxxxyyyyxxxx", 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(49, main.getLength()); assertEquals(49, 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(false, main.isChildrenChanged()); assertEquals(false, right.isChildrenChanged()); assertEquals(40, main.getLength()); assertEquals(40, eos.getOffset()); // should not change assertEquals("ddddd", lexed4.getValue()); 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(true, main.isChildrenChanged()); assertEquals(true, right.isChildrenChanged()); assertEquals(45, main.getLength()); assertEquals(45, eos.getOffset()); // should not change assertEquals("ddddd xxxxx", lexed4.getValue()); 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())); } /** * 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())); } }