diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java index 6f3d21e55..598e6d2b6 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/EditTest.java @@ -61,6 +61,8 @@ public void testCreateEmpty() { assertEquals(1, e.getEndA()); assertEquals(3, e.getBeginB()); assertEquals(3, e.getEndB()); + assertTrue("is empty", e.isEmpty()); + assertSame(Edit.Type.EMPTY, e.getType()); } public void testSwap() { @@ -75,21 +77,34 @@ public void testSwap() { public void testType_Insert() { final Edit e = new Edit(1, 1, 1, 2); assertSame(Edit.Type.INSERT, e.getType()); + assertFalse("not empty", e.isEmpty()); + assertEquals(0, e.getLengthA()); + assertEquals(1, e.getLengthB()); } public void testType_Delete() { final Edit e = new Edit(1, 2, 1, 1); assertSame(Edit.Type.DELETE, e.getType()); + assertFalse("not empty", e.isEmpty()); + assertEquals(1, e.getLengthA()); + assertEquals(0, e.getLengthB()); } public void testType_Replace() { final Edit e = new Edit(1, 2, 1, 4); assertSame(Edit.Type.REPLACE, e.getType()); + assertFalse("not empty", e.isEmpty()); + assertEquals(1, e.getLengthA()); + assertEquals(3, e.getLengthB()); } public void testType_Empty() { - assertSame(Edit.Type.EMPTY, new Edit(1, 1, 2, 2).getType()); + final Edit e = new Edit(1, 1, 2, 2); + assertSame(Edit.Type.EMPTY, e.getType()); assertSame(Edit.Type.EMPTY, new Edit(1, 2).getType()); + assertTrue("is empty", e.isEmpty()); + assertEquals(0, e.getLengthA()); + assertEquals(0, e.getLengthB()); } public void testToString() { @@ -143,4 +158,12 @@ public void testExtendB() { e.extendB(); assertEquals(new Edit(1, 2, 1, 3), e); } + + public void testBeforeAfterCuts() { + final Edit whole = new Edit(1, 8, 2, 9); + final Edit mid = new Edit(4, 5, 3, 6); + + assertEquals(new Edit(1, 4, 2, 3), whole.before(mid)); + assertEquals(new Edit(5, 8, 6, 9), whole.after(mid)); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java index 109c049cc..4a5de57b0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/Edit.java @@ -130,6 +130,11 @@ public final Type getType() { return Type.REPLACE; } + /** @return true if the edit is empty (lengths of both a and b is zero). */ + public final boolean isEmpty() { + return beginA == endA && beginB == endB; + } + /** @return start point in sequence A. */ public final int getBeginA() { return beginA; @@ -150,6 +155,42 @@ public final int getEndB() { return endB; } + /** @return length of the region in A. */ + public final int getLengthA() { + return endA - beginA; + } + + /** @return length of the region in B. */ + public final int getLengthB() { + return endB - beginB; + } + + /** + * Construct a new edit representing the region before cut. + * + * @param cut + * the cut point. The beginning A and B points are used as the + * end points of the returned edit. + * @return an edit representing the slice of {@code this} edit that occurs + * before {@code cut} starts. + */ + public final Edit before(Edit cut) { + return new Edit(beginA, cut.beginA, beginB, cut.beginB); + } + + /** + * Construct a new edit representing the region after cut. + * + * @param cut + * the cut point. The ending A and B points are used as the + * starting points of the returned edit. + * @return an edit representing the slice of {@code this} edit that occurs + * after {@code cut} ends. + */ + public final Edit after(Edit cut) { + return new Edit(cut.endA, endA, cut.endB, endB); + } + /** Increase {@link #getEndA()} by 1. */ public void extendA() { endA++;