diff options
Diffstat (limited to 'org.eclipse.text.tests/src/org/eclipse/text/tests/TextEditTests.java')
-rw-r--r-- | org.eclipse.text.tests/src/org/eclipse/text/tests/TextEditTests.java | 1041 |
1 files changed, 1041 insertions, 0 deletions
diff --git a/org.eclipse.text.tests/src/org/eclipse/text/tests/TextEditTests.java b/org.eclipse.text.tests/src/org/eclipse/text/tests/TextEditTests.java new file mode 100644 index 00000000000..e1d4bd4435b --- /dev/null +++ b/org.eclipse.text.tests/src/org/eclipse/text/tests/TextEditTests.java @@ -0,0 +1,1041 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.text.tests; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.eclipse.text.edits.CopySourceEdit; +import org.eclipse.text.edits.CopyTargetEdit; +import org.eclipse.text.edits.DeleteEdit; +import org.eclipse.text.edits.InsertEdit; +import org.eclipse.text.edits.MalformedTreeException; +import org.eclipse.text.edits.MoveSourceEdit; +import org.eclipse.text.edits.MoveTargetEdit; +import org.eclipse.text.edits.MultiTextEdit; +import org.eclipse.text.edits.RangeMarker; +import org.eclipse.text.edits.ReplaceEdit; +import org.eclipse.text.edits.TextEdit; +import org.eclipse.text.edits.TextEditCopier; +import org.eclipse.text.edits.UndoEdit; + +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; + +public class TextEditTests extends TestCase { + + private static final Class THIS= TextEditTests.class; + + private IDocument fDocument; + private MultiTextEdit fRoot; + + public TextEditTests(String name) { + super(name); + } + + public static Test allTests() { + return new TestSuite(THIS); + } + + public static Test suite() { + TestSuite result= new TestSuite(THIS); + if (false) { // For hot code replace when debugging test cases + result.addTestSuite(THIS); + result.addTestSuite(THIS); + result.addTestSuite(THIS); + result.addTestSuite(THIS); + result.addTestSuite(THIS); + result.addTestSuite(THIS); + } + return result; + } + + protected void setUp() throws Exception { + fDocument= new Document("0123456789"); + fRoot= new MultiTextEdit(); + } + + protected void tearDown() throws Exception { + fRoot= null; + fRoot= null; + } + + public void testOverlap1() throws Exception { + // [ [ ] ] + fRoot.addChild(new ReplaceEdit(0, 2, "01")); + boolean exception= false; + try { + fRoot.addChild(new ReplaceEdit(1, 2, "12")); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap2() throws Exception { + // [[ ] ] + fRoot.addChild(new ReplaceEdit(0, 2, "01")); + boolean exception= false; + try { + fRoot.addChild(new ReplaceEdit(0, 1, "0")); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap3() throws Exception { + // [ [ ]] + fRoot.addChild(new ReplaceEdit(0, 2, "01")); + boolean exception= false; + try { + fRoot.addChild(new ReplaceEdit(1, 1, "1")); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap4() throws Exception { + // [ [ ] ] + fRoot.addChild(new ReplaceEdit(0, 3, "012")); + boolean exception= false; + try { + fRoot.addChild(new ReplaceEdit(1, 1, "1")); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap5() throws Exception { + // [ [] ] + fRoot.addChild(new ReplaceEdit(0, 3, "012")); + boolean exception= false; + try { + fRoot.addChild(new InsertEdit(1, "xx")); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap6() throws Exception { + // [ [] ] + fRoot.addChild(new ReplaceEdit(0, 3, "012")); + boolean exception= false; + try { + fRoot.addChild(new InsertEdit(2, "xx")); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap7() throws Exception { + MoveSourceEdit source= new MoveSourceEdit(2, 5); + MoveTargetEdit target= new MoveTargetEdit(3, source); + fRoot.addChild(source); + boolean exception= false; + try { + fRoot.addChild(target); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap8() throws Exception { + MoveSourceEdit source= new MoveSourceEdit(2, 5); + MoveTargetEdit target= new MoveTargetEdit(6, source); + fRoot.addChild(source); + boolean exception= false; + try { + fRoot.addChild(target); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testOverlap9() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(3, 1); + MoveTargetEdit t1= new MoveTargetEdit(7, s1); + MoveSourceEdit s2= new MoveSourceEdit(2, 3); + MoveTargetEdit t2= new MoveTargetEdit(8, s2); + fRoot.addChild(s1); + fRoot.addChild(t1); + boolean exception= false; + try { + fRoot.addChild(s2); + fRoot.addChild(t2); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testUnconnected1() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(3, 1); + boolean exception= false; + try { + fRoot.addChild(s1); + fRoot.apply(fDocument); + } catch (MalformedTreeException e) { + exception= true; + } + assertTrue(exception); + } + + public void testBufferLength() throws Exception { + MultiTextEdit edit= new MultiTextEdit(0, fDocument.getLength() + 1); + boolean exception= false; + try { + fRoot.addChild(edit); + fRoot.apply(fDocument); + } catch (MalformedTreeException e) { + exception= true; + assertTrue(exception); + } + } + + public void testCopy1() throws Exception { + MultiTextEdit root= new MultiTextEdit(); + TextEdit e1= new InsertEdit(2, "yy"); + TextEdit e2= new ReplaceEdit(2, 3, "3456"); + root.addChild(e1); + root.addChild(e2); + List org= flatten(root); + TextEditCopier copier= new TextEditCopier(root); + List copy= flatten(copier.perform()); + compare(copier, org, copy); + } + + public void testCopy2() throws Exception { + MultiTextEdit root= new MultiTextEdit(); + CopySourceEdit s1= new CopySourceEdit(5, 2); + CopyTargetEdit t1= new CopyTargetEdit(8, s1); + CopySourceEdit s2= new CopySourceEdit(5, 2); + CopyTargetEdit t2= new CopyTargetEdit(2, s2); + s1.addChild(s2); + root.addChild(s1); + root.addChild(t1); + root.addChild(t2); + List org= flatten(root); + TextEditCopier copier= new TextEditCopier(root); + List copy= flatten(copier.perform()); + compare(copier, org, copy); + } + + private List flatten(TextEdit edit) { + List result= new ArrayList(); + flatten(result, edit); + return result; + } + + private static void flatten(List result, TextEdit edit) { + result.add(edit); + TextEdit[] children= edit.getChildren(); + for (int i= 0; i < children.length; i++) { + flatten(result, children[i]); + } + } + + private static void compare(TextEditCopier copier, List org, List copy) { + assertTrue("Same length", org.size() == copy.size()); + for (Iterator iter= copy.iterator(); iter.hasNext();) { + TextEdit edit= (TextEdit)iter.next(); + assertTrue("Original is part of copy list", !org.contains(edit)); + if (edit instanceof MoveSourceEdit) { + MoveSourceEdit source= (MoveSourceEdit)edit; + assertTrue("Target edit isn't a copy", copy.contains(source.getTargetEdit())); + assertTrue("Traget edit is a original", !org.contains(source.getTargetEdit())); + } else if (edit instanceof MoveTargetEdit) { + MoveTargetEdit target= (MoveTargetEdit)edit; + assertTrue("Source edit isn't a copy", copy.contains(target.getSourceEdit())); + assertTrue("Source edit is a original", !org.contains(target.getSourceEdit())); + } else if (edit instanceof CopySourceEdit) { + CopySourceEdit source= (CopySourceEdit)edit; + assertTrue("Target edit isn't a copy", copy.contains(source.getTargetEdit())); + assertTrue("Traget edit is a original", !org.contains(source.getTargetEdit())); + } else if (edit instanceof CopyTargetEdit) { + CopyTargetEdit target= (CopyTargetEdit)edit; + assertTrue("Source edit isn't a copy", copy.contains(target.getSourceEdit())); + assertTrue("Source edit is a original", !org.contains(target.getSourceEdit())); + } + } + } + + public void testInsert1() throws Exception { + // [][ ] + TextEdit e1= new InsertEdit(2, "yy"); + TextEdit e2= new ReplaceEdit(2, 3, "3456"); + fRoot.addChild(e1); + fRoot.addChild(e2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(fRoot, 2, 6); + assertEquals(e1, 2, 2); + assertEquals(e2, 4, 4); + assertEquals("Buffer content", "01yy345656789", fDocument.get()); + doUndoRedo(undo, "01yy345656789"); + } + + public void testInsert2() throws Exception { + // [][] + TextEdit e1= new InsertEdit(2, "yy"); + TextEdit e2= new InsertEdit(2, "xx"); + fRoot.addChild(e1); + fRoot.addChild(e2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(fRoot, 2, 4); + assertEquals(e1, 2, 2); + assertEquals(e2, 4, 2); + assertEquals("Buffer content", "01yyxx23456789", fDocument.get()); + doUndoRedo(undo, "01yyxx23456789"); + } + + public void testInsert3() throws Exception { + // [ ][][ ] + TextEdit e1= new ReplaceEdit(0, 2, "011"); + TextEdit e2= new InsertEdit(2, "xx"); + TextEdit e3= new ReplaceEdit(2, 2, "2"); + fRoot.addChild(e1); + fRoot.addChild(e2); + fRoot.addChild(e3); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(fRoot, 0, 6); + assertEquals(e1, 0, 3); + assertEquals(e2, 3, 2); + assertEquals(e3, 5, 1); + assertEquals("Buffer content", "011xx2456789", fDocument.get()); + doUndoRedo(undo, "011xx2456789"); + } + + public void testInsert4() throws Exception { + TextEdit e1= new InsertEdit(0, "xx"); + fRoot.addChild(e1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer length", 12, fDocument.getLength()); + assertEquals(fRoot, 0, 2); + assertEquals(e1, 0, 2); + assertEquals("Buffer content", "xx0123456789", fDocument.get()); + doUndoRedo(undo, "xx0123456789"); + } + + public void testInsert5() throws Exception { + TextEdit e1= new InsertEdit(10, "xx"); + fRoot.addChild(e1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer length", 12, fDocument.getLength()); + assertEquals(fRoot, 10, 2); + assertEquals(e1, 10, 2); + assertEquals("Buffer content", "0123456789xx", fDocument.get()); + doUndoRedo(undo, "0123456789xx"); + } + + public void testInsertReplace1() throws Exception { + TextEdit e1= new ReplaceEdit(2, 1, "y"); + TextEdit e2= new InsertEdit(2, "xx"); + fRoot.addChild(e1); + fRoot.addChild(e2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(fRoot, 2, 3); + assertEquals(e1, 4, 1); + assertEquals(e2, 2, 2); + assertEquals("Buffer content", "01xxy3456789", fDocument.get()); + doUndoRedo(undo, "01xxy3456789"); + } + + public void testDelete1() throws Exception { + TextEdit e1= new DeleteEdit(3, 1); + fRoot.addChild(e1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(fRoot, 3, 0); + assertEquals(e1, 3, 0); + assertEquals("Buffer content", "012456789", fDocument.get()); + doUndoRedo(undo, "012456789"); + } + + public void testDelete2() throws Exception { + TextEdit e1= new DeleteEdit(4, 1); + TextEdit e2= new DeleteEdit(3, 1); + TextEdit e3= new DeleteEdit(5, 1); + fRoot.addChild(e1); + fRoot.addChild(e2); + fRoot.addChild(e3); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(fRoot, 3, 0); + assertEquals(e1, 3, 0); + assertEquals(e2, 3, 0); + assertEquals(e3, 3, 0); + assertEquals("Buffer content", "0126789", fDocument.get()); + doUndoRedo(undo, "0126789"); + } + + public void testDelete3() throws Exception { + TextEdit e1= new InsertEdit(3, "x"); + TextEdit e2= new DeleteEdit(3, 1); + fRoot.addChild(e1); + fRoot.addChild(e2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(fRoot, 3, 1); + assertEquals(e1, 3, 1); + assertEquals(e2, 4, 0); + assertEquals("Buffer content", "012x456789", fDocument.get()); + doUndoRedo(undo, "012x456789"); + } + + public void testDeleteWithChildren() throws Exception { + TextEdit e1= new DeleteEdit(2, 6); + MultiTextEdit e2= new MultiTextEdit(3, 3); + e1.addChild(e2); + TextEdit e3= new ReplaceEdit(3, 1, "xx"); + TextEdit e4= new ReplaceEdit(5, 1, "yy"); + e2.addChild(e3); + e2.addChild(e4); + fRoot.addChild(e1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0189", fDocument.get()); + assertEquals(fRoot, 2, 0); + assertEquals(e1, 2, 0); + assertTrue(e2.isDeleted()); + assertTrue(e3.isDeleted()); + assertTrue(e4.isDeleted()); + doUndoRedo(undo, "0189"); + } + + public void testTreeUpdate1() throws Exception { + MultiTextEdit m1= new MultiTextEdit(); + TextEdit e1= new InsertEdit(2, "aa"); + TextEdit e2= new InsertEdit(4, "bb"); + m1.addChild(e1); + m1.addChild(e2); + MultiTextEdit m2= new MultiTextEdit(); + TextEdit e3= new InsertEdit(6, "cc"); + TextEdit e4= new InsertEdit(8, "dd"); + m2.addChild(e3); + m2.addChild(e4); + fRoot.addChild(m1); + fRoot.addChild(m2); + assertEquals(m1, 2, 2); + assertEquals(m2, 6, 2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "01aa23bb45cc67dd89", fDocument.get()); + assertEquals(e1, 2, 2); + assertEquals(e2, 6, 2); + assertEquals(e3, 10, 2); + assertEquals(e4, 14, 2); + assertEquals(m1, 2, 6); + assertEquals(m2, 10, 6); + assertEquals(fRoot, 2, 14); + doUndoRedo(undo, "01aa23bb45cc67dd89"); + } + + public void testMove1() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + MoveTargetEdit t1= new MoveTargetEdit(5, s1); + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0142356789", fDocument.get()); + assertEquals(s1, 2, 0); + assertEquals(t1, 3, 2); + doUndoRedo(undo, "0142356789"); + } + + public void testMove2() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(5, 2); + MoveTargetEdit t1= new MoveTargetEdit(2, s1); + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0156234789", fDocument.get()); + assertEquals(s1, 7, 0); + assertEquals(t1, 2, 2); + doUndoRedo(undo, "0156234789"); + } + + public void testMove3() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + MoveTargetEdit t1= new MoveTargetEdit(7, s1); + TextEdit e2= new ReplaceEdit(4, 1, "x"); + fRoot.addChild(s1); + fRoot.addChild(t1); + fRoot.addChild(e2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "01x5623789", fDocument.get()); + assertEquals(s1, 2, 0); + assertEquals(t1, 5, 2); + assertEquals(e2, 2, 1); + doUndoRedo(undo, "01x5623789"); + } + + public void testMove4() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(7, 2); + MoveTargetEdit t1= new MoveTargetEdit(2, s1); + TextEdit e2= new ReplaceEdit(5, 1, "x"); + fRoot.addChild(s1); + fRoot.addChild(t1); + fRoot.addChild(e2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0178234x69", fDocument.get()); + assertEquals(s1, 9, 0); + assertEquals(t1, 2, 2); + assertEquals(e2, 7, 1); + doUndoRedo(undo, "0178234x69"); + } + + public void testMove5() throws Exception { + // Move onto itself + MoveSourceEdit s1= new MoveSourceEdit(2, 1); + MoveTargetEdit t1= new MoveTargetEdit(3, s1); + TextEdit e2= new ReplaceEdit(2, 1, "x"); + s1.addChild(e2); + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 2, 0); + assertEquals(t1, 2, 1); + assertEquals(e2, 2, 1); + assertEquals("Buffer content", "01x3456789", fDocument.get()); + doUndoRedo(undo, "01x3456789"); + } + + public void testMove6() throws Exception { + // Move onto itself + MoveSourceEdit s1= new MoveSourceEdit(2, 1); + MoveTargetEdit t1= new MoveTargetEdit(2, s1); + TextEdit e2= new ReplaceEdit(2, 1, "x"); + s1.addChild(e2); + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 3, 0); + assertEquals(t1, 2, 1); + assertEquals(e2, 2, 1); + assertEquals("Buffer content", "01x3456789", fDocument.get()); + doUndoRedo(undo,"01x3456789"); + } + + public void testMove7() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 3); + MoveTargetEdit t1= new MoveTargetEdit(7, s1); + TextEdit e2= new ReplaceEdit(3, 1, "x"); + s1.addChild(e2); + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "01562x4789", fDocument.get()); + assertEquals(s1, 2, 0); + assertEquals(t1, 4, 3); + assertEquals(e2, 5, 1); + doUndoRedo(undo, "01562x4789"); + } + + public void testMove8() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(5, 3); + MoveTargetEdit t1= new MoveTargetEdit(1, s1); + TextEdit e2= new ReplaceEdit(6, 1, "x"); + s1.addChild(e2); + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "05x7123489", fDocument.get()); + assertEquals(s1, 8, 0); + assertEquals(t1, 1, 3); + assertEquals(e2, 2, 1); + doUndoRedo(undo, "05x7123489"); + } + + public void testMove9() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(1, 3); + MoveTargetEdit t1= new MoveTargetEdit(5, s1); + + MoveSourceEdit s2= new MoveSourceEdit(1, 1); + MoveTargetEdit t2= new MoveTargetEdit(3, s2); + s1.addChild(s2); + s1.addChild(t2); + + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 1, 0); + assertEquals(t1, 2, 3); + + assertEquals(s2, 2, 0); + assertEquals(t2, 3, 1); + assertEquals("Buffer content", "0421356789", fDocument.get()); + doUndoRedo(undo, "0421356789"); + } + + public void testMove10() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + MoveTargetEdit t1= new MoveTargetEdit(8, s1); + MoveSourceEdit s2= new MoveSourceEdit(5, 2); + MoveTargetEdit t2= new MoveTargetEdit(1, s2); + + fRoot.addChild(s1); + fRoot.addChild(t1); + fRoot.addChild(s2); + fRoot.addChild(t2); + + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 4, 0); + assertEquals(t1, 6, 2); + assertEquals(s2, 5, 0); + assertEquals(t2, 1, 2); + assertEquals("Buffer content", "0561472389", fDocument.get()); + doUndoRedo(undo, "0561472389"); + } + + public void testMoveWithRangeMarker() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + MoveTargetEdit t1= new MoveTargetEdit(5, s1); + + RangeMarker marker= new RangeMarker(2, 2); + s1.addChild(marker); + + fRoot.addChild(s1); + fRoot.addChild(t1); + + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0142356789", fDocument.get()); + assertEquals(s1, 2, 0); + assertEquals(t1, 3, 2); + assertEquals(marker, 3, 2); + doUndoRedo(undo, "0142356789"); + } + + public void testMoveWithTargetDelete() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 3); + MoveTargetEdit t1= new MoveTargetEdit(7, s1); + TextEdit e2= new DeleteEdit(6, 2); + e2.addChild(t1); + fRoot.addChild(s1); + fRoot.addChild(e2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "01589", fDocument.get()); + assertEquals(s1, 2, 0); + assertTrue(t1.isDeleted()); + assertEquals(e2, 3, 0); + doUndoRedo(undo, "01589"); + } + + public void testMoveUpWithSourceDelete() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(5, 2); + MoveTargetEdit t1= new MoveTargetEdit(2, s1); + + TextEdit d1= new DeleteEdit(5, 2); + d1.addChild(s1); + + RangeMarker marker= new RangeMarker(5, 2); + s1.addChild(marker); + + fRoot.addChild(d1); + fRoot.addChild(t1); + + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0156234789", fDocument.get()); + assertEquals(t1, 2, 2); + assertEquals(marker, 2, 2); + assertTrue(s1.isDeleted()); + assertEquals(d1, 7, 0); + doUndoRedo(undo, "0156234789"); + } + + public void testMoveDown() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + TextEdit i1= new InsertEdit(5, "x"); + MoveTargetEdit t1= new MoveTargetEdit(7, s1); + TextEdit d1= new DeleteEdit(9, 1); + + RangeMarker m1= new RangeMarker(2, 2); + s1.addChild(m1); + + fRoot.addChild(s1); + fRoot.addChild(i1); + fRoot.addChild(t1); + fRoot.addChild(d1); + + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "014x562378", fDocument.get()); + assertEquals(s1, 2, 0); + assertEquals(i1, 3, 1); + assertEquals(t1, 6, 2); + assertEquals(m1, 6, 2); + assertEquals(d1, 10, 0); + doUndoRedo(undo, "014x562378"); + } + + public void testMoveUp() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(7, 2); + MoveTargetEdit t1= new MoveTargetEdit(2, s1); + TextEdit i1= new InsertEdit(5, "x"); + TextEdit d1= new DeleteEdit(9, 1); + + RangeMarker m1= new RangeMarker(7, 2); + s1.addChild(m1); + + fRoot.addChild(s1); + fRoot.addChild(i1); + fRoot.addChild(t1); + fRoot.addChild(d1); + + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0178234x56", fDocument.get()); + assertEquals(s1, 10, 0); + assertEquals(i1, 7, 1); + assertEquals(t1, 2, 2); + assertEquals(m1, 2, 2); + assertEquals(d1, 10, 0); + doUndoRedo(undo, "0178234x56"); + } + + public void testMoveDownWithSourceDelete() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + MoveTargetEdit t1= new MoveTargetEdit(7, s1); + + TextEdit d1= new DeleteEdit(2, 2); + d1.addChild(s1); + + RangeMarker m1= new RangeMarker(2, 2); + s1.addChild(m1); + + fRoot.addChild(t1); + fRoot.addChild(d1); + + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0145623789", fDocument.get()); + assertEquals(d1, 2, 0); + assertTrue(s1.isDeleted()); + assertEquals(t1, 5, 2); + assertEquals(m1, 5, 2); + doUndoRedo(undo, "0145623789"); + } + + public void testMoveUpWithInnerMark() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(7, 2); + MoveTargetEdit t1= new MoveTargetEdit(2, s1); + TextEdit m= new ReplaceEdit(4, 1, "yy"); + fRoot.addChild(t1); + fRoot.addChild(m); + fRoot.addChild(s1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "017823yy569", fDocument.get()); + assertEquals(s1, 10, 0); + assertEquals(t1, 2, 2); + assertEquals(m, 6, 2); + doUndoRedo(undo, "017823yy569"); + } + + public void testMoveDownWithInnerMark() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + MoveTargetEdit t1= new MoveTargetEdit(7, s1); + TextEdit m= new ReplaceEdit(4, 1, "yy"); + fRoot.addChild(t1); + fRoot.addChild(m); + fRoot.addChild(s1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "01yy5623789", fDocument.get()); + assertEquals(s1, 2, 0); + assertEquals(t1, 6, 2); + assertEquals(m, 2, 2); + doUndoRedo(undo, "01yy5623789"); + } + + public void testMoveUpWithParentMark() throws Exception { + RangeMarker m= new RangeMarker(2, 6); + MoveSourceEdit s1= new MoveSourceEdit(4, 2); + MoveTargetEdit t1= new MoveTargetEdit(3, s1); + m.addChild(s1); + m.addChild(t1); + fRoot.addChild(m); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0124536789", fDocument.get()); + assertEquals(m, 2, 6); + assertEquals(t1, 3, 2); + assertEquals(s1, 6, 0); + doUndoRedo(undo, "0124536789"); + } + + public void testMoveDownWithParentMark() throws Exception { + RangeMarker m= new RangeMarker(2, 6); + MoveSourceEdit s1= new MoveSourceEdit(2, 2); + MoveTargetEdit t1= new MoveTargetEdit(5, s1); + m.addChild(s1); + m.addChild(t1); + fRoot.addChild(m); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals("Buffer content", "0142356789", fDocument.get()); + assertEquals(m, 2, 6); + assertEquals(t1, 3, 2); + assertEquals(s1, 2, 0); + doUndoRedo(undo, "0142356789"); + } + + public void testNestedMoveSource() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(1, 5); + MoveSourceEdit s2= new MoveSourceEdit(2, 3); + MoveSourceEdit s3= new MoveSourceEdit(3, 1); + s1.addChild(s2); + s2.addChild(s3); + MoveTargetEdit t1= new MoveTargetEdit(9, s1); + MoveTargetEdit t2= new MoveTargetEdit(8, s2); + MoveTargetEdit t3= new MoveTargetEdit(7, s3); + fRoot.addChild(s1); + fRoot.addChild(t1); + fRoot.addChild(t2); + fRoot.addChild(t3); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 1, 0); + assertEquals(s2, 8, 0); + assertEquals(s3, 5, 0); + assertEquals(t1, 7, 2); + assertEquals(t2, 4, 2); + assertEquals(t3, 2, 1); + String result= "0637248159"; + assertEquals("Buffer content", result, fDocument.get()); + doUndoRedo(undo, result); + } + + public void testNestedMoveTarget() throws Exception { + MoveSourceEdit s1= new MoveSourceEdit(1, 2); + MoveSourceEdit s2= new MoveSourceEdit(5, 3); + MoveTargetEdit t1= new MoveTargetEdit(6, s1); + MoveTargetEdit t2= new MoveTargetEdit(9, s2); + s2.addChild(t1); + fRoot.addChild(s1); + fRoot.addChild(s2); + fRoot.addChild(t2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 1, 0); + assertEquals(s2, 3, 0); + assertEquals(t1, 5, 2); + assertEquals(t2, 4, 5); + String result= "0348512679"; + assertEquals("Buffer content", result, fDocument.get()); + doUndoRedo(undo, result); + } + + public void testCopyDown() throws Exception { + CopySourceEdit s1= new CopySourceEdit(2, 3); + CopyTargetEdit t1= new CopyTargetEdit(8, s1); + + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 2, 3); + assertEquals(t1, 8, 3); + String result= "0123456723489"; + assertEquals("Buffer content", result, fDocument.get()); + doUndoRedo(undo, result); + } + + public void testCopyUp() throws Exception { + CopySourceEdit s1= new CopySourceEdit(7, 2); + CopyTargetEdit t1= new CopyTargetEdit(3, s1); + + fRoot.addChild(s1); + fRoot.addChild(t1); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 9, 2); + assertEquals(t1, 3, 2); + String result= "012783456789"; + assertEquals("Buffer content", result, fDocument.get()); + doUndoRedo(undo, result); + } + + public void testDoubleCopy() throws Exception { + CopySourceEdit s1= new CopySourceEdit(5, 2); + CopyTargetEdit t1= new CopyTargetEdit(8, s1); + CopySourceEdit s2= new CopySourceEdit(5, 2); + CopyTargetEdit t2= new CopyTargetEdit(2, s2); + s1.addChild(s2); + + fRoot.addChild(s1); + fRoot.addChild(t1); + fRoot.addChild(t2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 7, 2); + assertEquals(t1, 10, 2); + assertEquals(s2, 7, 2); + assertEquals(t2, 2, 2); + String result= "01562345675689"; + assertEquals("Buffer content", result, fDocument.get()); + doUndoRedo(undo, result); + } + + public void testNestedCopySource() throws Exception { + CopySourceEdit s1= new CopySourceEdit(1, 5); + CopySourceEdit s2= new CopySourceEdit(2, 3); + CopySourceEdit s3= new CopySourceEdit(3, 1); + s1.addChild(s2); + s2.addChild(s3); + CopyTargetEdit t1= new CopyTargetEdit(9, s1); + CopyTargetEdit t2= new CopyTargetEdit(8, s2); + CopyTargetEdit t3= new CopyTargetEdit(7, s3); + fRoot.addChild(s1); + fRoot.addChild(t1); + fRoot.addChild(t2); + fRoot.addChild(t3); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 1, 5); + assertEquals(s2, 2, 3); + assertEquals(s3, 3, 1); + assertEquals(t1, 13, 5); + assertEquals(t2, 9, 3); + assertEquals(t3, 7, 1); + String result= "0123456372348123459"; + assertEquals("Buffer content", result, fDocument.get()); + doUndoRedo(undo, result); + } + + public void testNestedCopyTarget() throws Exception { + CopySourceEdit s1= new CopySourceEdit(1, 2); + CopySourceEdit s2= new CopySourceEdit(5, 3); + CopyTargetEdit t1= new CopyTargetEdit(6, s1); + CopyTargetEdit t2= new CopyTargetEdit(9, s2); + s2.addChild(t1); + fRoot.addChild(s1); + fRoot.addChild(s2); + fRoot.addChild(t2); + UndoEdit undo= fRoot.apply(fDocument); + assertEquals(s1, 1, 2); + assertEquals(s2, 5, 5); + assertEquals(t1, 6, 2); + assertEquals(t2, 11, 5); + String result= "01234512678512679"; + assertEquals("Buffer content", result, fDocument.get()); + doUndoRedo(undo, result); + } + + public void testSwap1() throws Exception { + IDocument document= new Document("foo(1, 2), 3"); + + MultiTextEdit root= new MultiTextEdit(); + { + CopySourceEdit innerRoot= new CopySourceEdit(0, 9); + + TextEdit e1= new ReplaceEdit(0, 9, ""); + e1.addChild(innerRoot); + CopyTargetEdit t1= new CopyTargetEdit(11, innerRoot); + + TextEdit e2= new ReplaceEdit(11, 1, ""); + CopySourceEdit s2= new CopySourceEdit(11, 1); + e2.addChild(s2); + CopyTargetEdit t2= new CopyTargetEdit(0, s2); + + root.addChild(e1); + root.addChild(t2); + root.addChild(e2); + root.addChild(t1); + } + + root.apply(document); + + String result= "3, foo(1, 2)"; + assertEquals("Buffer content", result, document.get()); + } + + public void testSwap2() throws Exception { + IDocument document= new Document("foo(1, 2), 3"); + + MultiTextEdit root= new MultiTextEdit(); + { + TextEdit e1= new ReplaceEdit(4, 1, ""); + CopySourceEdit s1= new CopySourceEdit(4, 1); + e1.addChild(s1); + CopyTargetEdit t1= new CopyTargetEdit(7, s1); + + TextEdit e2= new ReplaceEdit(7, 1, ""); + CopySourceEdit s2= new CopySourceEdit(7, 1); + e2.addChild(s2); + CopyTargetEdit t2= new CopyTargetEdit(4, s2); + + root.addChild(e1); + root.addChild(t2); + root.addChild(e2); + root.addChild(t1); + } + + root.apply(document); + + String result= "foo(2, 1), 3"; + assertEquals("Buffer content", result, document.get()); + } + + public void testSwap2InSwap1() throws Exception { + IDocument document= new Document("foo(1, 2), 3"); + + CopySourceEdit innerRoot= new CopySourceEdit(0, 9); + { + TextEdit e1= new ReplaceEdit(4, 1, ""); + CopySourceEdit s1= new CopySourceEdit(4, 1); + e1.addChild(s1); + CopyTargetEdit t1= new CopyTargetEdit(7, s1); + + TextEdit e2= new ReplaceEdit(7, 1, ""); + CopySourceEdit s2= new CopySourceEdit(7, 1); + e2.addChild(s2); + CopyTargetEdit t2= new CopyTargetEdit(4, s2); + + innerRoot.addChild(e1); + innerRoot.addChild(t2); + innerRoot.addChild(e2); + innerRoot.addChild(t1); + } + MultiTextEdit root= new MultiTextEdit(); + { + TextEdit e1= new ReplaceEdit(0, 9, ""); + e1.addChild(innerRoot); + CopyTargetEdit t1= new CopyTargetEdit(11, innerRoot); + + TextEdit e2= new ReplaceEdit(11, 1, ""); + CopySourceEdit s2= new CopySourceEdit(11, 1); + e2.addChild(s2); + CopyTargetEdit t2= new CopyTargetEdit(0, s2); + + root.addChild(e1); + root.addChild(t2); + root.addChild(e2); + root.addChild(t1); + } + + root.apply(document); + + String result= "3, foo(2, 1)"; + assertEquals("Buffer content", result, document.get()); + } + + private void doUndoRedo(UndoEdit undo, String redoResult) throws Exception { + UndoEdit redo= undo.apply(fDocument); + assertBufferContent(); + undo= redo.apply(fDocument); + assertEquals("Buffer content redo", redoResult, fDocument.get()); + undo.apply(fDocument); + assertBufferContent(); + } + + private void assertEquals(TextEdit edit, int offset, int length) { + assertEquals("Offset", offset, edit.getOffset()); + assertEquals("Length", length, edit.getLength()); + } + + private void assertBufferContent() { + assertEquals("Buffer content restored", "0123456789", fDocument.get()); + } +} + |