blob: 1d19fb92ee44bcbbecd23945a24a7a088ed2a62c [file] [log] [blame]
package com.intellij.openapi.diff.impl.highlighting;
import com.intellij.openapi.diff.ex.DiffFragment;
import com.intellij.openapi.diff.impl.MultiCheck;
import com.intellij.openapi.diff.impl.string.DiffString;
import com.intellij.util.Assertion;
import com.intellij.util.diff.Diff;
import com.intellij.util.diff.FilesTooBigForDiffException;
import junit.framework.TestCase;
public class UtilTest extends TestCase {
private final Assertion CHECK = new Assertion();
public void testSplitByWord() {
CHECK.singleElement(Util.splitByWord("abc"), "abc");
CHECK.compareAll(new String[]{"abc", " ", "123"}, Util.splitByWord("abc 123"));
CHECK.compareAll(new String[]{"abc", " \n", "\t ", "123"}, Util.splitByWord("abc \n\t 123"));
CHECK.compareAll(new String[]{"a_b", "(", "c"}, Util.splitByWord("a_b(c"));
CHECK.compareAll(new String[]{"ab", " ", "+","(", " ", "c"}, Util.splitByWord("ab +( c"));
CHECK.compareAll(new String[]{"a", " ", "b", "\n"}, Util.splitByWord("a b\n"));
}
public void testIsSpaceOnly() {
assertTrue(Util.isSpaceOnly(new DiffFragment(null, " ")));
assertTrue(Util.isSpaceOnly(new DiffFragment(" ", null)));
}
public void testUnit() {
DiffFragment fragment = Util.unite(new DiffFragment("1", "2"), new DiffFragment("a", "b"));
assertEquals("1a", fragment.getText1());
assertEquals("2b", fragment.getText2());
assertTrue(fragment.isModified());
fragment = Util.unite(new DiffFragment("1", "1"), DiffFragment.unchanged(" ", ""));
assertEquals("1 ", fragment.getText1());
assertEquals("1", fragment.getText2());
assertTrue(fragment.isEqual());
fragment = Util.unite(new DiffFragment("1", null), new DiffFragment("2", null));
assertEquals("12", fragment.getText1());
assertNull(fragment.getText2());
}
private void prepareForFragments() {
CHECK.setStringConvertion(new FragmentStringConvertion());
CHECK.setEquality(new FragmentEquality());
}
public void testSplitByUnchagedNewLine() {
prepareForFragments();
DiffFragment a_b = new DiffFragment("a", "b");
DiffFragment x_x = new DiffFragment("x", "x");
DiffFragment cl_dl = new DiffFragment("c\n", "d\n");
DiffFragment yl_yl = new DiffFragment("y\n", "y\n");
DiffFragment zl_z = new DiffFragment("z\n", "z");
DiffFragment z_zl = new DiffFragment("z", "z\n");
DiffFragment al_ = new DiffFragment("a\n", null);
DiffFragment _al = new DiffFragment(null, "a\n");
DiffFragment[] originalFragments = new DiffFragment[]{a_b, x_x, cl_dl, a_b, yl_yl,
x_x, zl_z, z_zl, yl_yl,
new DiffFragment("y\nx", "y\nx"),
a_b, al_, _al};
CHECK.compareAll(new DiffFragment[][]{
new DiffFragment[]{a_b, x_x, cl_dl, a_b, yl_yl},
new DiffFragment[]{x_x, zl_z, z_zl, yl_yl},
new DiffFragment[]{yl_yl},
new DiffFragment[]{x_x, a_b, al_, _al}
}, Util.splitByUnchangedLines(originalFragments));
CHECK.compareAll(new DiffFragment[][]{new DiffFragment[]{new DiffFragment("abc\n", "abc\n")},
new DiffFragment[]{DiffFragment.unchanged("123\n", "123")}},
Util.splitByUnchangedLines(new DiffFragment[]{DiffFragment.unchanged("abc\n123\n", "abc\n123")}));
CHECK.compareAll(new DiffFragment[][]{new DiffFragment[]{DiffFragment.unchanged("a\n ", "a")}},
Util.splitByUnchangedLines(new DiffFragment[]{DiffFragment.unchanged("a\n ", "a")}));
}
public void testSplitByUnchangedLinesIgnoringSpaces() {
DiffFragment[][] diffFragments = Util.splitByUnchangedLines(new DiffFragment[]{DiffFragment.unchanged("f(a, b)\n", "f(a,\nb)\n")});
assertEquals(1, diffFragments.length);
DiffFragment[] line = diffFragments[0];
assertEquals(1, line.length);
assertTrue(line[0].isEqual());
}
public void testConcatEquals() throws FilesTooBigForDiffException {
Object[] left = new String[]{"a", "x", "a", "b"};
Object[] right = new String[]{"a", "b"};
Diff.Change change = Diff.buildChanges(left, right);
Diff.Change newChange = Util.concatEquals(change, left, right);
MultiCheck multiCheck = new MultiCheck();
multiCheck.assertEquals(0, newChange.line0);
multiCheck.assertEquals(0, newChange.line1);
multiCheck.assertEquals(2, newChange.deleted);
multiCheck.assertEquals(0, newChange.inserted);
multiCheck.assertNull(newChange.link);
multiCheck.flush();
change = Diff.buildChanges(right, left);
newChange = Util.concatEquals(change, right, left);
multiCheck = new MultiCheck();
multiCheck.assertEquals(0, newChange.line0);
multiCheck.assertEquals(0, newChange.line1);
multiCheck.assertEquals(0, newChange.deleted);
multiCheck.assertEquals(2, newChange.inserted);
multiCheck.assertNull(newChange.link);
multiCheck.flush();
left = new String[]{"a", "x", "a", "1", "b"};
right = new String[]{"a", "b"};
change = Diff.buildChanges(left, right);
newChange = Util.concatEquals(change, left, right);
multiCheck = new MultiCheck();
multiCheck.assertEquals(1, newChange.line0);
multiCheck.assertEquals(1, newChange.line1);
multiCheck.assertEquals(3, newChange.deleted);
multiCheck.assertEquals(0, newChange.inserted);
multiCheck.assertNull(newChange.link);
multiCheck.flush();
left = new String[]{"y", "y", "y", "a", "2", "a", "b"};
right = new String[]{"x", "a", "b"};
change = Diff.buildChanges(left, right);
newChange = Util.concatEquals(change, left, right);
multiCheck = new MultiCheck();
multiCheck.assertEquals(0, newChange.line0);
multiCheck.assertEquals(0, newChange.line1);
multiCheck.assertEquals(5, newChange.deleted);
multiCheck.assertEquals(1, newChange.inserted);
multiCheck.flush();
left = new String[]{"y", "y", "y", "a", "2", "a", "b", "*"};
right = new String[]{"x", "a", "b", "@"};
change = Diff.buildChanges(left, right);
newChange = Util.concatEquals(change, left, right);
multiCheck = new MultiCheck();
multiCheck.assertEquals(0, newChange.line0);
multiCheck.assertEquals(0, newChange.line1);
multiCheck.assertEquals(3, newChange.deleted);
multiCheck.assertEquals(1, newChange.inserted);
newChange = newChange.link;
multiCheck.assertEquals(3, newChange.line0);
multiCheck.assertEquals(1, newChange.line1);
multiCheck.assertEquals(2, newChange.deleted);
multiCheck.assertEquals(0, newChange.inserted);
newChange = newChange.link;
multiCheck.assertEquals(7, newChange.line0);
multiCheck.assertEquals(3, newChange.line1);
multiCheck.assertEquals(1, newChange.deleted);
multiCheck.assertEquals(1, newChange.inserted);
multiCheck.assertNull(newChange.link);
multiCheck.flush();
}
public void testConcatEqualsConcatenatesChanged() throws FilesTooBigForDiffException {
String[] left = new String[]{"i1", "a", "i2", "a", "b"};
String[] right = new String[]{"a", "b"};
Diff.Change change = Diff.buildChanges(left, right);
MultiCheck multiCheck = new MultiCheck();
multiCheck.assertEquals(0, change.line0);
multiCheck.assertEquals(0, change.line1);
multiCheck.assertEquals(3, change.deleted);
multiCheck.assertEquals(0, change.inserted);
multiCheck.assertNull(change.link);
multiCheck.flush();
left = new String[]{"i1", "a", "i2", "a", "b", "*"};
right = new String[]{"a", "b", "$"};
change = Diff.buildChanges(left, right);
assertNotNull(change.link);
assertEquals(2, change.link.deleted);
assertEquals(2, change.link.line0);
Diff.Change newChange = Util.concatEquals(change, left, right);
multiCheck.assertEquals(0, newChange.line0);
multiCheck.assertEquals(0, newChange.line1);
multiCheck.assertEquals(3, newChange.deleted);
multiCheck.assertEquals(0, newChange.inserted);
assertNotNull(newChange.link);
newChange = newChange.link;
multiCheck.assertEquals(5, newChange.line0);
multiCheck.assertEquals(2, newChange.line1);
multiCheck.assertEquals(1, newChange.deleted);
multiCheck.assertEquals(1, newChange.inserted);
multiCheck.assertNull(newChange.link);
multiCheck.flush();
}
public void testCalcShift() {
assertEquals(-1, Util.calcShift(new String[]{"1", "a", "x", "a"}, 1, 2, 2));
assertEquals(0, Util.calcShift(new String[]{"1", "a", "x", "b"}, 1, 2, 2));
assertEquals(0, Util.calcShift(new String[]{"1", "a", "x", "a"}, 0, 2, 2));
assertEquals(-2, Util.calcShift(new String[]{"1", "a", "b", "x", "a", "b"}, 1, 3, 3));
}
public void testSplitByLines() {
Util.splitByLines(new DiffFragment("false;", "false;"));
}
public void testUniteFormattingOnly() {
prepareForFragments();
DiffFragment[] first = new DiffFragment[]{DiffFragment.unchanged("123", "abc")};
DiffFragment[] last = new DiffFragment[]{new DiffFragment("qqq", "qqq")};
DiffFragment inline1 = new DiffFragment(" ", " ");
DiffFragment inline2 = DiffFragment.unchanged("xyz", "cba");
DiffFragment inline3 = new DiffFragment(" ", " ");
DiffFragment inline4 = DiffFragment.unchanged("098", "890");
DiffFragment[][] lines = new DiffFragment[][]{
first,
new DiffFragment[]{inline1, inline2},
new DiffFragment[]{inline3, inline4},
last};
lines = Util.uniteFormattingOnly(lines);
CHECK.compareAll(new DiffFragment[][]{
first,
new DiffFragment[]{inline1, inline2, inline3, inline4},
last},
lines
);
}
public void testConcatenateEquals() {
prepareForFragments();
DiffFragment fragments = Util.concatenate(new DiffFragment[]{
new DiffFragment("a", "a"),
DiffFragment.unchanged("1", "XY"),
DiffFragment.unchanged("2\n3", "Q\nW\nE")});
assertTrue(fragments.isEqual());
assertFalse(fragments.isOneSide());
assertEquals("a12\n3", fragments.getText1());
assertEquals("aXYQ\nW\nE", fragments.getText2());
}
public void testConcatenateModified() {
DiffFragment fragment = Util.concatenate(new DiffFragment[]{new DiffFragment("a", "b"),
DiffFragment.unchanged("1", "1")});
assertTrue(fragment.isModified());
}
public void testConcatenateWithOneSide() {
DiffFragment fragment = Util.concatenate(new DiffFragment[]{new DiffFragment("1", "1"),
new DiffFragment("a", null)});
assertTrue(fragment.isModified());
assertFalse(fragment.isOneSide());
}
public void testCutFirst() {
prepareForFragments();
CHECK.singleElement(Util.cutFirst(new DiffFragment[]{
DiffFragment.unchanged("ab", "ac")
}),
DiffFragment.unchanged("b", "c")
);
CHECK.compareAll(new DiffFragment[]{
new DiffFragment(null, "c")
},
Util.cutFirst(new DiffFragment[]{
new DiffFragment(null, "b"),
new DiffFragment(null, "c"),
new DiffFragment("a", null)})
);
CHECK.compareAll(new DiffFragment[]{
new DiffFragment(null, "b"),
new DiffFragment(null, "d")
},
Util.cutFirst(new DiffFragment[]{
new DiffFragment(null, "ab"),
new DiffFragment("c", "d")
})
);
}
public void testCutFirst2() {
prepareForFragments();
CHECK.compareAll(new DiffFragment[] {
new DiffFragment(null, ")"),
new DiffFragment(" {", " {")
},
Util.cutFirst(new DiffFragment[] {
new DiffFragment(null, ")"),
new DiffFragment(") {", ") {" )
}));
}
public void testCutFirst3() {
prepareForFragments();
CHECK.compareAll(new DiffFragment[] {
new DiffFragment(null, ", ?"),
new DiffFragment(")\");", ")\");")
},
Util.cutFirst(new DiffFragment[] {
new DiffFragment(null, "?, "),
new DiffFragment("?)\");", "?)\");")
}));
}
public static void assertEquals(CharSequence obj1, CharSequence obj2) {
assertEquals(obj1.toString(), obj2.toString());
}
}