/* * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.openapi.diff.impl.highlighting; import com.intellij.openapi.diff.ex.DiffFragment; import com.intellij.openapi.diff.impl.MultiCheck; 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()); } }