blob: 2faac7ca2eb240cbe23a0a4f86738d42721c1ee6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Matthew Hall - bug 226216
******************************************************************************/
package org.eclipse.core.tests.databinding.observable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.list.ListDiff;
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
/**
* @since 1.1
*/
public class Diffs_ListDiffTests extends TestCase {
public void testListDiffEntryToStringDoesNotThrowNPEForNullListDiffEntry() {
ListDiffEntry entry = new ListDiffEntry() {
public Object getElement() {
return null;
}
public int getPosition() {
return 0;
}
public boolean isAddition() {
return false;
}
};
try {
entry.toString();
assertTrue(true);
} catch (NullPointerException e) {
fail("NPE was thrown.");
}
}
public void testListDiffToStringDoesNotThrowNPEForNullListDiff() {
ListDiff diff = new ListDiff() {
public ListDiffEntry[] getDifferences() {
return null;
}
};
try {
diff.toString();
assertTrue(true);
} catch (NullPointerException e) {
fail("NPE was thrown.");
}
}
public void testListDiffToStringDoesNotThrowNPEForNullListDiffEntry() {
ListDiff diff = new ListDiff() {
public ListDiffEntry[] getDifferences() {
return new ListDiffEntry[1];
}
};
try {
diff.toString();
assertTrue(true);
} catch (NullPointerException e) {
fail("NPE was thrown.");
}
}
public void testDiffScenario1() throws Exception {
ListDiff diff = diff(null, null);
assertEquals(0, diff.getDifferences().length);
}
private ListDiff diff(String[] oldArray, String[] newArray) {
List a = Arrays.asList((oldArray != null) ? oldArray : new String[] {});
List b = Arrays.asList((newArray != null) ? newArray : new String[] {});
return Diffs.computeListDiff(a, b);
}
public void testDiffScenario2() throws Exception {
ListDiff diff = diff(new String[] {"a"}, null);
assertEquals(1, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], false, 0, "a");
}
public void testDiffScenario3() throws Exception {
ListDiff diff = diff(null, new String[] {"a"});
assertEquals(1, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 0, "a");
}
public void testDiffScenario4() throws Exception {
ListDiff diff = diff(new String[] {"a"}, new String[] {"a"});
assertEquals(0, diff.getDifferences().length);
}
public void testDiffScenario5() throws Exception {
ListDiff diff = diff(new String[] {"a"}, new String[] {"b"});
assertEquals(2, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 0, "b");
assertEntry(diff.getDifferences()[1], false, 1, "a");
}
public void testDiffScenario6() throws Exception {
ListDiff diff = diff(new String[] { "a" }, new String[] { "a", "b" });
assertEquals(1, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 1, "b");
}
public void testDiffScenario7() throws Exception {
ListDiff diff = diff(new String[] { "a" }, new String[] { "b", "a" });
assertEquals(1, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 0, "b");
}
public void testDiffScenario8() throws Exception {
ListDiff diff = diff(new String[] { "a" }, new String[] { "b", "b" });
assertEquals(3, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 0, "b");
assertEntry(diff.getDifferences()[1], true, 1, "b");
assertEntry(diff.getDifferences()[2], false, 2, "a");
}
public void testDiffScenario9() throws Exception {
ListDiff diff = diff(new String[] { "a" }, new String[] { "a", "b", "c" });
assertEquals(2, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 1, "b");
assertEntry(diff.getDifferences()[1], true, 2, "c");
}
public void testDiffScenario10() throws Exception {
ListDiff diff = diff(new String[] { "b" }, new String[] { "a", "b", "c" });
assertEquals(2, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 0, "a");
assertEntry(diff.getDifferences()[1], true, 2, "c");
}
public void testDiffScenario11() throws Exception {
ListDiff diff = diff(new String[] { "c" }, new String[] { "a", "b", "c" });
assertEquals(2, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], true, 0, "a");
assertEntry(diff.getDifferences()[1], true, 1, "b");
}
public void testDiffScenario12() throws Exception {
ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "b", "c" });
assertEquals(0, diff.getDifferences().length);
}
public void testDiffScenario13() throws Exception {
ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "b", "c" });
assertEquals(1, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], false, 0, "a");
}
public void testDiffScenarios14() throws Exception {
ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "c" });
assertEquals(1, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], false, 1, "b");
}
public void testDiffScenarios15() throws Exception {
ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "b" });
assertEquals(1, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], false, 2, "c");
}
public void testDiffScenarios16() throws Exception {
ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "c", "b", "a" });
assertEquals(4, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], false, 2, "c");
assertEntry(diff.getDifferences()[1], true, 0, "c");
assertEntry(diff.getDifferences()[2], false, 2, "b");
assertEntry(diff.getDifferences()[3], true, 1, "b");
}
public void testDiffScenarios17() throws Exception {
ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "c", "b" });
assertEquals(3, diff.getDifferences().length);
assertEntry(diff.getDifferences()[0], false, 0, "a");
assertEntry(diff.getDifferences()[1], false, 1, "c");
assertEntry(diff.getDifferences()[2], true, 0, "c");
}
private static void assertEntry(ListDiffEntry entry, boolean addition, int position, String element) {
assertEquals("addition", addition, entry.isAddition());
assertEquals("position", position, entry.getPosition());
assertEquals("element", element, entry.getElement());
}
public void testComputeListDiff_SingleInsert() {
checkComputedListDiff(Arrays.asList(new Object[] { "a", "c" }), Arrays
.asList(new Object[] { "a", "b", "c" }));
}
public void testComputeListDiff_SingleAppend() {
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
.asList(new Object[] { "a", "b", "c" }));
}
public void testComputeListDiff_SingleRemove() {
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
Arrays.asList(new Object[] { "a", "b" }));
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
Arrays.asList(new Object[] { "a", "c" }));
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
Arrays.asList(new Object[] { "b", "c" }));
}
public void testComputeListDiff_MoveDown1() {
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
.asList(new Object[] { "b", "a" }));
}
public void testComputeListDiff_MoveDown2() {
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
Arrays.asList(new Object[] { "b", "c", "a" }));
}
public void testComputeListDiff_MoveUp1() {
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
.asList(new Object[] { "b", "a" }));
}
public void testComputeListDiff_MoveUp2() {
checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
Arrays.asList(new Object[] { "c", "a", "b" }));
}
private static void checkComputedListDiff(List oldList, List newList) {
ListDiff diff = Diffs.computeListDiff(oldList, newList);
final List list = new ArrayList(oldList);
diff.accept(new ListDiffVisitor() {
public void handleAdd(int index, Object element) {
list.add(index, element);
}
public void handleRemove(int index, Object element) {
assertEquals(element, list.remove(index));
}
public void handleReplace(int index, Object oldElement,
Object newElement) {
assertEquals(oldElement, list.set(index, newElement));
}
});
assertEquals(
"Applying diff to old list should make it equal to new list",
newList, list);
}
}