package com.intellij.openapi.diff.impl.incrementalMerge; import com.intellij.idea.IdeaLogger; import com.intellij.openapi.diff.impl.highlighting.FragmentSide; import com.intellij.openapi.diff.impl.util.ContextLogger; import com.intellij.openapi.util.TextRange; import com.intellij.util.Assertion; import junit.framework.TestCase; import java.util.List; public class MergeBuilderTest extends TestCase { private final MergeBuilder myMergeBuilder = new MergeBuilder(new ContextLogger("TEST")); private final Assertion CHECK = new Assertion(); public void testEqual() { addLeft(new TextRange(0, 1), new TextRange(0, 1)); addRight(new TextRange(0, 1), new TextRange(0, 1)); CHECK.empty(finish(1, 1, 1)); } public void testWholeConflict() { CHECK.singleElement(finish(1, 2, 3), fragment(new TextRange(0, 1), new TextRange(0, 2), new TextRange(0, 3))); } public void testTailInsert() { TextRange range = new TextRange(0, 1); addLeft(range, range); addRight(range, range); CHECK.singleElement(finish(1, 1, 2), fragment(null, new TextRange(1, 1), new TextRange(1, 2))); } public void testSameInsertsConflicts1() { TextRange base = new TextRange(0, 1); TextRange version = new TextRange(1, 2); addLeft(base, version); addRight(base, version); CHECK.singleElement(finish(2, 1, 2), fragment(new TextRange(0, 1), TextRange.EMPTY_RANGE, new TextRange(0, 1))); } public void testSameInsertsConflicts2() { TextRange base = new TextRange(1, 2); TextRange version = new TextRange(0, 1); addLeft(base, version); addRight(base, version); CHECK.compareAll(new MergeFragment[]{ fragment(new TextRange(0, 0), new TextRange(0, 1), new TextRange(0, 0)), fragment(new TextRange(1, 2), new TextRange(2, 2), new TextRange(1, 2)) }, finish(2, 2, 2)); } private MergeFragment fragment(TextRange left, TextRange base, TextRange right) { return new MergeFragment(left, base, right); } public void testHeadInsert() { TextRange range = new TextRange(0, 1); addRight(range, new TextRange(1, 2)); addLeft(range, range); CHECK.singleElement(finish(1, 1, 2), fragment(null, TextRange.EMPTY_RANGE, new TextRange(0, 1))); } public void testOneSideChange() { addLeft(new TextRange(1, 2), new TextRange(2, 3)); addRight(new TextRange(0, 2), new TextRange(0, 2)); CHECK.singleElement(finish(3, 2, 2), fragment(new TextRange(0, 2), new TextRange(0, 1), null)); } public void testNotAllignedConflict() { addLeft(new TextRange(1, 3), new TextRange(0, 2)); addRight(new TextRange(2, 4), new TextRange(1, 3)); CHECK.compareAll(new MergeFragment[]{ fragment(new TextRange(0, 1), new TextRange(0, 2), new TextRange(0, 1)), fragment(new TextRange(2, 3), new TextRange(3, 4), null) }, finish(3, 4, 3)); } public void testMultiChanges() { addLeft(new TextRange(1, 8), new TextRange(1, 8)); addRight(new TextRange(1, 2), new TextRange(0, 1)); addRight(new TextRange(3, 4), new TextRange(1, 2)); addRight(new TextRange(4, 5), new TextRange(3, 4)); addRight(new TextRange(6, 7), new TextRange(5, 6)); addLeft(new TextRange(9, 10), new TextRange(9, 10)); CHECK.compareAll(new MergeFragment[]{ fragment(new TextRange(0, 1), new TextRange(0, 1), TextRange.EMPTY_RANGE), fragment(null, new TextRange(2, 3), new TextRange(1, 1)), fragment(null, new TextRange(4, 4), new TextRange(2, 3)), fragment(null, new TextRange(5, 6), new TextRange(4, 5)), fragment(new TextRange(7, 10), new TextRange(7, 10), new TextRange(6, 7)) }, finish(10, 10, 7)); } public void testNoIntersection() { addLeft(new TextRange(0, 1), new TextRange(0, 1)); addRight(new TextRange(0, 2), new TextRange(0, 2)); addLeft(new TextRange(3, 5), new TextRange(1, 3)); addRight(new TextRange(4, 5), new TextRange(2, 3)); CHECK.compareAll(new MergeFragment[]{ fragment(new TextRange(1, 2), new TextRange(1, 4), new TextRange(1, 2)) }, finish(3, 5, 3)); } private void addRight(TextRange base, TextRange right) { myMergeBuilder.add(base, right, FragmentSide.SIDE2); } private void addLeft(TextRange base, TextRange left) { myMergeBuilder.add(base, left, FragmentSide.SIDE1); } private List<MergeFragment> finish(int left, int base, int right) { return myMergeBuilder.finish(left, base, right); } @Override protected void runTest() throws Throwable { try { super.runTest(); } finally { if (IdeaLogger.ourErrorsOccurred != null) throw IdeaLogger.ourErrorsOccurred; } } @Override protected void setUp() throws Exception { super.setUp(); IdeaLogger.ourErrorsOccurred = null; } }