package com.sap.furcas.runtime.textblocks.model; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; import com.sap.furcas.metamodel.FURCAS.textblocks.Bostoken; import com.sap.furcas.metamodel.FURCAS.textblocks.DocumentNode; 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.TbUtil; import com.sap.furcas.runtime.textblocks.modifcation.TbReplacingHelper; import com.sap.furcas.runtime.textblocks.modifcation.TbVersionUtil; import com.sap.furcas.runtime.textblocks.shortprettyprint.ShortPrettyPrinter; import com.sap.furcas.runtime.textblocks.testbase.TextBlockTest; public class TestReplacingInTBModel extends TextBlockTest { private LexedToken createTokenWithWorkingCopy(String value) { TextBlock parentBlock = modelFactory.createTextBlock(); parentBlock.setVersion(Version.REFERENCE); LexedToken testToken = modelFactory.createToken(value); testToken.setParent(parentBlock); TbUtil.createNewCopy(TbVersionUtil.getOtherVersion(parentBlock, Version.REFERENCE), Version.PREVIOUS, false, null); return testToken; } private TextBlock createEmptyTree(boolean withEmptyToken) { TextBlock parentBlock = modelFactory.createTextBlock(); parentBlock.setVersion(Version.REFERENCE); Bostoken bos = modelFactory.createBostoken(); bos.setVersion(Version.REFERENCE); bos.setParent(parentBlock); if (withEmptyToken) { LexedToken testToken = modelFactory.createToken(""); testToken.setVersion(Version.REFERENCE); testToken.setParent(parentBlock); testToken.setOffset(0); } Eostoken eos = modelFactory.createEostoken(); eos.setVersion(Version.REFERENCE); eos.setParent(parentBlock); eos.setOffset(0); parentBlock.setLength(0); parentBlock.setCachedString(""); TbUtil.createNewCopy(TbVersionUtil.getOtherVersion(parentBlock, Version.REFERENCE), Version.PREVIOUS, false, null); return parentBlock; } private TextBlock createSimpleTree(String... values) { TextBlock parentBlock = modelFactory.createTextBlock(); parentBlock.setVersion(Version.REFERENCE); Bostoken bos = modelFactory.createBostoken(); bos.setVersion(Version.REFERENCE); parentBlock.getSubNodes().add(bos); String fullString = ""; int totalLength = 0; for (int i = 0; i < values.length; i++) { String value = values[i]; LexedToken testToken = modelFactory.createToken(value); testToken.setVersion(Version.REFERENCE); testToken.setOffset(totalLength); parentBlock.getSubNodes().add(testToken); totalLength += value.length(); fullString += value; } Eostoken eos = modelFactory.createEostoken(); eos.setVersion(Version.REFERENCE); eos.setParent(parentBlock); eos.setOffset(totalLength); parentBlock.setLength(totalLength); parentBlock.setCachedString(fullString); TbUtil.createNewCopy(TbVersionUtil.getOtherVersion(parentBlock, Version.REFERENCE), Version.PREVIOUS, false, null); return parentBlock; } private TextBlock createSimpleTreeWithGaps(String value) { TextBlock parentBlock = modelFactory.createTextBlock(); parentBlock.setVersion(Version.REFERENCE); Bostoken bos = modelFactory.createBostoken(); bos.setVersion(Version.REFERENCE); bos.setParent(parentBlock); LexedToken testToken = modelFactory.createToken(value); testToken.setVersion(Version.REFERENCE); testToken.setParent(parentBlock); Eostoken eos = modelFactory.createEostoken(); eos.setVersion(Version.REFERENCE); eos.setParent(parentBlock); // create gaps of 5 at start and end testToken.setOffset(5); parentBlock.setLength(value.length() + 10); parentBlock.setCachedString(" " + value + " "); eos.setOffset(value.length() + 10); TbUtil.createNewCopy(TbVersionUtil.getOtherVersion(parentBlock, Version.REFERENCE), Version.PREVIOUS, false, null); return parentBlock; } /** * @param string * @return */ private TextBlock createDeepTreeWithGaps(String... values) { TextBlock rootBlock = modelFactory.createTextBlock(); rootBlock.setVersion(Version.REFERENCE); Bostoken bos = modelFactory.createBostoken(); bos.setVersion(Version.REFERENCE); bos.setParent(rootBlock); String fullString = ""; // create gaps of 5 at start and end int lastIndex = 0; for (int i = 0; i < values.length; i++) { String value = values[i]; TextBlock parentBlock = modelFactory.createTextBlock(); parentBlock.setVersion(Version.REFERENCE); parentBlock.setParent(rootBlock); parentBlock.setLength(value.length() + 6); // gap of 3 before and // after contents parentBlock.setOffset(lastIndex + 2); // gap of 2 before start LexedToken testToken = modelFactory.createToken(value); testToken.setVersion(Version.REFERENCE); testToken.setParent(parentBlock); testToken.setOffset(3); // absolute offset differs testToken.setOffsetRelative(true); fullString += " " + value + " "; lastIndex += value.length() + 10; } rootBlock.setLength(lastIndex); rootBlock.setCachedString(fullString); Eostoken eos = modelFactory.createEostoken(); eos.setVersion(Version.REFERENCE); rootBlock.getSubNodes().add(eos); eos.setOffset(lastIndex); TbUtil.createNewCopy(TbVersionUtil.getOtherVersion(rootBlock, Version.REFERENCE), Version.PREVIOUS, false, null); return rootBlock; } /** * creates a tree root(parentBlock(subBlock(value1)), * parentBlock(subBlock(value2))...) with plenty of gaps of 2 * * @param string * @return */ private TextBlock createVeryDeepTreeWithGaps(String... values) { TextBlock rootBlock = modelFactory.createTextBlock(); rootBlock.setVersion(Version.REFERENCE); Bostoken bos = modelFactory.createBostoken(); bos.setVersion(Version.REFERENCE); bos.setParent(rootBlock); // create gaps of 6 at start and end int lastIndex = 0; String fullString = ""; for (int i = 0; i < values.length; i++) { String value = values[i]; TextBlock parentBlock = modelFactory.createTextBlock(); parentBlock.setVersion(Version.REFERENCE); parentBlock.setParent(rootBlock); parentBlock.setLength(value.length() + 8); // gap of 4 before and // after contents parentBlock.setOffset(lastIndex + 2); // gap of 2 before start and // after end parentBlock.setOffsetRelative(true); TextBlock subParentBlock = modelFactory.createTextBlock(); subParentBlock.setVersion(Version.REFERENCE); subParentBlock.setParent(parentBlock); subParentBlock.setLength(value.length() + 4); // gap of 2 before and // after contents subParentBlock.setOffset(2); // gap of 2 before start and after end subParentBlock.setOffsetRelative(true); LexedToken testToken = modelFactory.createToken(value); testToken.setVersion(Version.REFERENCE); testToken.setParent(subParentBlock); testToken.setOffset(2); // absolute offset differs testToken.setOffsetRelative(true); fullString += " " + value + " "; lastIndex += value.length() + 12; } rootBlock.setCachedString(fullString); rootBlock.setLength(lastIndex); Eostoken eos = modelFactory.createEostoken(); eos.setVersion(Version.REFERENCE); eos.setParent(rootBlock); eos.setOffset(lastIndex); TbUtil.createNewCopy(TbVersionUtil.getOtherVersion(rootBlock, Version.REFERENCE), Version.PREVIOUS, false, null); return rootBlock; } private static <Type extends DocumentNode> Type getWorkingCopy(Type node) { return TbVersionUtil.getOtherVersion(node, Version.PREVIOUS); } @Test public void testModifyTokenOnOverlap() throws Exception { LexedToken testToken = createTokenWithWorkingCopy("012345"); TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 0, 0, "test", new ShortPrettyPrinter(null)); assertEquals("test012345", getWorkingCopy(testToken).getValue()); testToken = createTokenWithWorkingCopy("012345"); TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 5, 0, "test", new ShortPrettyPrinter(null)); assertEquals("01234test5", getWorkingCopy(testToken).getValue()); testToken = createTokenWithWorkingCopy("012345"); TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 6, 0, "test", new ShortPrettyPrinter(null)); assertEquals("012345", getWorkingCopy(testToken).getValue()); testToken = createTokenWithWorkingCopy("012345"); TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 2, 3, "test", new ShortPrettyPrinter(null)); assertEquals("01test5", getWorkingCopy(testToken).getValue()); testToken = createTokenWithWorkingCopy("012345"); TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 0, 6, "test", new ShortPrettyPrinter(null)); assertEquals("test", getWorkingCopy(testToken).getValue()); // larger region testToken = createTokenWithWorkingCopy("012345"); TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 0, 8, "test", new ShortPrettyPrinter(null)); assertEquals("test", getWorkingCopy(testToken).getValue()); testToken = createTokenWithWorkingCopy("012345"); TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 4, 6, "test", new ShortPrettyPrinter(null)); assertEquals("0123test", getWorkingCopy(testToken).getValue()); } @Test public void testModifyTokenToDelete() throws Exception { LexedToken testToken = createTokenWithWorkingCopy("012345"); testToken.setOffset(10); boolean toDeleteFlag = TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 9, 7, "test", new ShortPrettyPrinter(null)); assertTrue(toDeleteFlag); toDeleteFlag = TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 0, 9, "test", new ShortPrettyPrinter(null)); assertFalse(toDeleteFlag); toDeleteFlag = TbReplacingHelper.modifyTokenOnOverlap(testToken, 0, 16, 10, "test", new ShortPrettyPrinter(null)); assertFalse(toDeleteFlag); } @Test public void testModifyInSimpleTree() throws Exception { TextBlock root = createSimpleTree("012345"); TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 0, "test"); assertEquals(10, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test012345", getWorkingCopy(root).getTokens().get(1).getValue()); root = createSimpleTree("012345"); model.replace(root, 6, 0, "test"); assertEquals(10, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("012345test", getWorkingCopy(root).getTokens().get(1).getValue()); } @Test public void testModifyInSimpleTreeMultiTokens() throws Exception { TextBlock root = createSimpleTree("012", "345"); TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 0, "test"); assertEquals(10, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(3) instanceof Eostoken); assertEquals("test012", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals("345", getWorkingCopy(root).getTokens().get(2).getValue()); assertEquals(7, getWorkingCopy(root).getTokens().get(2).getOffset()); assertEquals(10, getWorkingCopy(root).getTokens().get(3).getOffset()); root = createSimpleTree("012", "345"); model.replace(root, 3, 0, "test"); assertEquals(10, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(3) instanceof Eostoken); assertEquals("012", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals("test345", getWorkingCopy(root).getTokens().get(2).getValue()); assertEquals(3, getWorkingCopy(root).getTokens().get(2).getOffset()); assertEquals(10, getWorkingCopy(root).getTokens().get(3).getOffset()); root = createSimpleTree("012", "345"); model.replace(root, 6, 0, "test"); assertEquals(10, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(3) instanceof Eostoken); assertEquals("012", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals("345test", getWorkingCopy(root).getTokens().get(2).getValue()); root = createSimpleTree("012", "345"); model.replace(root, 0, 3, "test"); assertEquals(7, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(3) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals("345", getWorkingCopy(root).getTokens().get(2).getValue()); assertEquals(4, getWorkingCopy(root).getTokens().get(2).getOffset()); assertEquals(7, getWorkingCopy(root).getTokens().get(3).getOffset()); root = createSimpleTree("012", "345"); model.replace(root, 0, 4, "test"); assertEquals(6, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(3) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals("45", getWorkingCopy(root).getTokens().get(2).getValue()); assertEquals(4, getWorkingCopy(root).getTokens().get(2).getOffset()); assertEquals(6, getWorkingCopy(root).getTokens().get(3).getOffset()); root = createSimpleTree("012", "345"); model.replace(root, 0, 6, "test"); assertEquals(4, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals(4, getWorkingCopy(root).getTokens().get(2).getOffset()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert1() throws Exception { // inserts before subblocks TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 0, "test"); // should create a new token at // beginning of text assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(0, parent1.getOffset()); // was 2 assertEquals(1, parent1.getSubNodes().size()); assertEquals("test 012", parent1.getTokens().get(0).getValue()); assertEquals(0, parent1.getTokens().get(0).getOffset()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(19, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert2() throws Exception { // inserts between subblocks TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 13, 0, "test"); // should create a new token in // middle of text assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012 test", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(19, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert3() throws Exception { // inserts after blocks TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 26, 0, "test"); // should create a new token in // middle of text assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(15, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345 test", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert4() throws Exception { // inserts within subBlock TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 4, 0, "test"); // should create a new token within // first subblock assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); // oldtoken assertEquals(2, parent1.getTokens().get(0).getOffset()); assertEquals(true, parent1.getTokens().get(0).isOffsetRelative()); assertEquals("test 012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(19, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert5a() throws Exception { // inserts within token TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 5, 0, "test"); // should extend existing token at // start assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); // newtoken, oldtoken assertEquals("test012", parent1.getTokens().get(0).getValue()); assertEquals(3, parent1.getTokens().get(0).getOffset()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(19, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert5b() throws Exception { // inserts within token at end TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 8, 0, "test"); // should extend existing token at // start assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals("012test", parent1.getTokens().get(0).getValue()); assertEquals(3, parent1.getTokens().get(0).getOffset()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(19, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert6() throws Exception { // inserts at End TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 26, 0, "test"); // should create a new token at // beginning of text assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(15, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345 test", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepInsert7() throws Exception { // inserts at End of second block TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 24, 0, "test"); // should create a new token at // beginning of text assertEquals(30, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(15, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("345 test", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace1() throws Exception { // replaces first token TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 5, 3, "test"); // should replace complete first // token assertEquals(27, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("test", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(16, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace2() throws Exception { // replaces second token TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 18, 3, "test");// should replace complete second // token assertEquals(27, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(15, parent2.getOffset()); assertEquals(1, parent2.getSubNodes().size()); assertEquals("test", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace3() throws Exception { // replaces gap to first token, reducing text length TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 5, "test");// should replace complete second // token assertEquals(25, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(0, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("test012", parent1.getTokens().get(0).getValue()); assertEquals(0, parent1.getTokens().get(0).getOffset()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(14, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace4() throws Exception { // replaces gap after second token, reducing text length TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 21, 5, "test");// should add to second token assertEquals(25, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(15, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345test", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace5() throws Exception { // replaces whole first textblock TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 13, "test");// should replace first textBlock assertEquals(17, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(0, parent1.getOffset()); // was 15 assertEquals(1, parent1.getSubNodes().size()); assertEquals("test", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(6, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace6() throws Exception { // replaces whole second textblock TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 13, 13, "test");// should replace first textBlock assertEquals(17, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent2.getOffset()); // was 2 assertEquals(1, parent2.getSubNodes().size()); assertEquals("012 test", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace7() throws Exception { // replaces within gap between tokens TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 9, 8, "test");// should create new token in first // subBlock assertEquals(22, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012 test", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(13, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); assertEquals(1, parent2.getTokens().get(0).getOffset()); // was 3 } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace8() throws Exception { // replaces from one token to the next TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 6, 14, "test");// should create new token in first // subBlock assertEquals(16, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("0test", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(10, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("5", parent2.getTokens().get(0).getValue()); assertEquals(0, parent2.getTokens().get(0).getOffset()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace9() throws Exception { // replaces all gap between tokens TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 8, 10, "test");// should create new token in first // subBlock assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012test", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(12, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); assertEquals(0, parent2.getTokens().get(0).getOffset()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace10() throws Exception { // replaces all TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 0, 26, "test");// should create new token in first // subBlock assertEquals(4, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, // newtoken, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(0, parent1.getOffset()); assertEquals(4, parent1.getLength()); assertEquals("test", parent1.getTokens().get(0).getValue()); assertEquals(0, parent1.getTokens().get(0).getOffset()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace11() throws Exception { // replaces all with empty String TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 0, 26, "");// should create new token in first // subBlock assertEquals(0, getWorkingCopy(root).getLength()); assertEquals(2, getWorkingCopy(root).getSubNodes().size()); // BOS, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace12() throws Exception { // replaces whole second half with empty TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 13, 13, "");// should replace first textBlock assertEquals(13, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb2, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent2.getOffset()); // was 2 assertEquals(1, parent2.getSubNodes().size()); assertEquals("012", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace13() throws Exception { // replaces whole second TB with empty TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 15, 9, "");// should replace first textBlock assertEquals(17, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb2, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent2.getOffset()); // was 2 assertEquals(1, parent2.getSubNodes().size()); assertEquals("012", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepReplace14() throws Exception { // replaces whole token with empty TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 18, 3, "");// should replace first textBlock assertEquals(23, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb2, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent2.getOffset()); // was 2 assertEquals(1, parent2.getSubNodes().size()); assertEquals("012", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeWithGaps() throws Exception { TextBlock root = createSimpleTreeWithGaps("012345"); // creates tree // with length 16: // " 012345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 5, 0, "test"); assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test012345", getWorkingCopy(root).getTokens().get(1).getValue()); root = createSimpleTreeWithGaps("012345"); model.replace(root, 11, 0, "test"); assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("012345test", getWorkingCopy(root).getTokens().get(1).getValue()); root = createSimpleTreeWithGaps("012345"); model.replace(root, 0, 16, "test"); assertEquals(4, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getTokens().get(1).getValue()); root = createSimpleTreeWithGaps("012345"); model.replace(root, 4, 7, "test"); assertEquals(13, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getTokens().get(1).getValue()); root = createSimpleTreeWithGaps("012345"); model.replace(root, 0, 0, "test"); assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test 012345", getWorkingCopy(root).getTokens().get(1).getValue()); } @Test public void testModifyInDeepTreeWithGaps() throws Exception { TextBlock root = createDeepTreeWithGaps("012345");// creates tree with // inner textBlock // with length 16: // " 012345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 5, 0, "test"); assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(1, parent.getSubNodes().size()); assertEquals("test012345", parent.getTokens().get(0).getValue()); root = createDeepTreeWithGaps("012345"); model.replace(root, 11, 0, "test"); assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(1, parent.getTokens().size()); assertEquals("012345test", parent.getTokens().get(0).getValue()); root = createDeepTreeWithGaps("012345"); model.replace(root, 0, 16, "test"); assertEquals(4, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getSubBlocks().get(0).getTokens().get(0).getValue()); root = createDeepTreeWithGaps("012345"); model.replace(root, 4, 7, "test"); assertEquals(13, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals("test", parent.getTokens().get(0).getValue()); root = createDeepTreeWithGaps("012345"); model.replace(root, 0, 0, "test"); assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertEquals(2, getWorkingCopy(root).getTokens().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals("test 012345", parent.getTokens().get(0).getValue()); } @Test public void testModifyInVeryDeepTreeWithGaps() throws Exception { // special cases tree with textblocks with relative offsets as childs of // childs of root (only there do relative offsets start to be special) TextBlock root = createVeryDeepTreeWithGaps("012345"); // creates tree // of length 18 // " 012345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 0, "test"); assertEquals(22, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertEquals(2, getWorkingCopy(root).getTokens().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(1, parent.getSubNodes().size()); assertEquals(0, parent.getOffset()); TextBlock subparent = parent.getSubBlocks().get(0); assertEquals(1, subparent.getSubNodes().size()); assertEquals("test 012345", subparent.getTokens().get(0).getValue()); assertEquals(0, subparent.getOffset()); // next testcase root = createVeryDeepTreeWithGaps("012345"); // creates tree of length // 18 " 012345 " model.replace(root, 0, 2, "test"); assertEquals(20, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(1, parent.getSubNodes().size()); assertEquals(0, parent.getOffset()); subparent = parent.getSubBlocks().get(0); assertEquals(1, subparent.getSubNodes().size()); assertEquals("test 012345", subparent.getTokens().get(0).getValue()); assertEquals(0, subparent.getOffset()); // next testcase root = createVeryDeepTreeWithGaps("012345"); // creates tree of length // 18 " 012345 " model.replace(root, 0, 4, "test"); assertEquals(18, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(1, parent.getSubNodes().size()); assertEquals(0, parent.getOffset()); subparent = parent.getSubBlocks().get(0); assertEquals(1, subparent.getSubNodes().size()); assertEquals("test 012345", subparent.getTokens().get(0).getValue()); assertEquals(0, subparent.getOffset()); // next testcase root = createVeryDeepTreeWithGaps("012345"); // creates tree of length // 18 " 012345 " model.replace(root, 0, 6, "test"); assertEquals(16, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); parent = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(1, parent.getSubNodes().size()); assertEquals(0, parent.getOffset()); subparent = parent.getSubBlocks().get(0); assertEquals(1, subparent.getSubNodes().size()); assertEquals("test012345", subparent.getTokens().get(0).getValue()); assertEquals(0, subparent.getOffset()); } @Test public void testAddInEmptyTree1() throws Exception { TextBlock root = createEmptyTree(false); TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 0, "test"); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb2, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals(0, getWorkingCopy(root).getTokens().get(1).getOffset()); assertEquals(4, getWorkingCopy(root).getTokens().get(2).getOffset()); assertEquals(4, getWorkingCopy(root).getLength()); } @Test public void testAddInEmptyTree2() throws Exception { TextBlock root = createEmptyTree(true); // creates an empty tree with an // existing empty token inside TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 0, "test"); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb2, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(2) instanceof Eostoken); assertEquals("test", getWorkingCopy(root).getTokens().get(1).getValue()); assertEquals(0, getWorkingCopy(root).getTokens().get(1).getOffset()); assertEquals(4, getWorkingCopy(root).getTokens().get(2).getOffset()); assertEquals(4, getWorkingCopy(root).getLength()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove1() throws Exception { // replaces first token TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 5, 3, ""); // should replace complete first token assertEquals(23, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb2, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(12, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove2() throws Exception { // replaces second token TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 18, 3, "");// should replace complete second token assertEquals(23, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove3() throws Exception { // replaces gap to first token, reducing text length TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 5, "");// should replace complete second token assertEquals(21, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(0, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); assertEquals(0, parent1.getTokens().get(0).getOffset()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(10, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove4() throws Exception { // replaces gap after second token, reducing text length TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 21, 5, "");// should add to second token assertEquals(21, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(15, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove5() throws Exception { // replaces whole first textblock TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.replace(root, 0, 13, "");// should replace first textBlock assertEquals(13, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove6() throws Exception { // replaces whole second textblock TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " 012 345 " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 13, 13, "");// should replace first textBlock assertEquals(13, getWorkingCopy(root).getLength()); assertEquals(3, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent2.getOffset()); // was 2 assertEquals(1, parent2.getSubNodes().size()); assertEquals("012", parent2.getTokens().get(0).getValue()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove7() throws Exception { // replaces within gap between tokens TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " // expect " ___012_|_345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 9, 8, "");// should create new token in first // subBlock assertEquals(18, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(9, parent2.getOffset()); // was 15 (-8, +2 for cut off gap // in tb2) assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); assertEquals(1, parent2.getTokens().get(0).getOffset()); // was 3 } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove8() throws Exception { // replaces from one token to the next TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 6, 14, "");// should create new token in first // subBlock assertEquals(12, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("0", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(6, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("5", parent2.getTokens().get(0).getValue()); assertEquals(0, parent2.getTokens().get(0).getOffset()); } @Test public void testModifyInSimpleTreeMultiTokensDeepRemove9() throws Exception { // replaces all gap between tokens TextBlock root = createDeepTreeWithGaps("012", "345"); // creates tree // of length 26: // " ___012___ ___345___ " TextBlocksModel model = new TextBlocksModel(root); model.setUsecache(true); // so that get(.) can work on gaps. model.replace(root, 8, 10, "");// should create new token in first // subBlock assertEquals(16, getWorkingCopy(root).getLength()); assertEquals(4, getWorkingCopy(root).getSubNodes().size()); // BOS, tb1, // tb2, eos assertTrue(getWorkingCopy(root).getTokens().get(0) instanceof Bostoken); assertTrue(getWorkingCopy(root).getTokens().get(1) instanceof Eostoken); TextBlock parent1 = getWorkingCopy(root).getSubBlocks().get(0); assertEquals(2, parent1.getOffset()); assertEquals(1, parent1.getSubNodes().size()); assertEquals("012", parent1.getTokens().get(0).getValue()); TextBlock parent2 = getWorkingCopy(root).getSubBlocks().get(1); assertEquals(8, parent2.getOffset()); // was 15 assertEquals(1, parent2.getSubNodes().size()); assertEquals("345", parent2.getTokens().get(0).getValue()); assertEquals(0, parent2.getTokens().get(0).getOffset()); } }