/*******************************************************************************
* Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.test.utility.diff;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.persistence.tools.workbench.test.utility.TestTools;
import org.eclipse.persistence.tools.workbench.utility.diff.Diff;
import org.eclipse.persistence.tools.workbench.utility.diff.Differentiator;
import org.eclipse.persistence.tools.workbench.utility.diff.OrderedContainerDiff;
import org.eclipse.persistence.tools.workbench.utility.diff.OrderedContainerDifferentiator;
import org.eclipse.persistence.tools.workbench.utility.diff.OrderedContainerElementDiff;
import org.eclipse.persistence.tools.workbench.utility.diff.SimpleDiff;
public class ListDiffTests extends TestCase {
private Differentiator differentiator;
private List list1;
private List list2;
public static Test suite() {
return new TestSuite(ListDiffTests.class);
}
public ListDiffTests(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
this.differentiator = OrderedContainerDifferentiator.forLists();
this.list1 = this.buildList();
this.list2 = this.buildList();
}
private List buildList() {
List result = new ArrayList();
result.add("zero");
result.add("one");
result.add("two");
result.add("three");
result.add("four");
return result;
}
protected void tearDown() throws Exception {
TestTools.clear(this);
super.tearDown();
}
public void testSameObject() {
this.list2 = this.list1;
Diff diff = this.differentiator.diff(this.list1, this.list2);
this.verifyDiffMatch(diff, this.list1, this.list2);
}
public void testDifferentObjects() {
Diff diff = this.differentiator.diff(this.list1, this.list2);
this.verifyDiffMatch(diff, this.list1, this.list2);
}
public void testUnequalObjects() {
this.list2.set(0, "xxx-" + this.list2.get(0) + "-xxx");
this.list2.set(4, "xxx-" + this.list2.get(4) + "-xxx");
OrderedContainerDiff diff = (OrderedContainerDiff) this.differentiator.diff(this.list1, this.list2);
this.verifyDiffMatchMismatch(diff, this.list1, this.list2);
Diff[] diffs = diff.getDiffs();
assertEquals(this.list1.size(), diffs.length);
OrderedContainerElementDiff oced;
oced = (OrderedContainerElementDiff) diffs[0];
assertTrue(oced.different());
SimpleDiff ed;
ed = (SimpleDiff) oced.getDiff();
assertTrue(ed.getObject1().equals("zero"));
assertTrue(ed.getObject2().equals("xxx-zero-xxx"));
oced = (OrderedContainerElementDiff) diffs[1];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[2];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[3];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[4];
assertTrue(oced.different());
ed = (SimpleDiff) oced.getDiff();
assertTrue(ed.getObject1().equals("four"));
assertTrue(ed.getObject2().equals("xxx-four-xxx"));
}
public void testOneNull() {
Object list3 = null;
Diff diff = this.differentiator.diff(this.list1, list3);
this.verifyDiffMatchMismatch(diff, this.list1, list3);
}
public void testNullElements() {
this.list2.set(0, null);
this.list2.set(4, null);
OrderedContainerDiff diff = (OrderedContainerDiff) this.differentiator.diff(this.list1, this.list2);
this.verifyDiffMatchMismatch(diff, this.list1, this.list2);
Diff[] diffs = diff.getDiffs();
assertEquals(this.list1.size(), diffs.length);
OrderedContainerElementDiff oced;
oced = (OrderedContainerElementDiff) diffs[0];
assertTrue(oced.different());
SimpleDiff ed;
ed = (SimpleDiff) oced.getDiff();
assertTrue(ed.getObject1().equals("zero"));
assertNull(ed.getObject2());
oced = (OrderedContainerElementDiff) diffs[1];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[2];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[3];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[4];
assertTrue(oced.different());
ed = (SimpleDiff) oced.getDiff();
assertTrue(ed.getObject1().equals("four"));
assertNull(ed.getObject2());
}
public void testMissingElements() {
this.list2.remove(4);
OrderedContainerDiff diff = (OrderedContainerDiff) this.differentiator.diff(this.list1, this.list2);
this.verifyDiffMatchMismatch(diff, this.list1, this.list2);
Diff[] diffs = diff.getDiffs();
assertEquals(this.list1.size(), diffs.length);
OrderedContainerElementDiff oced;
oced = (OrderedContainerElementDiff) diffs[0];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[1];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[2];
assertTrue(oced.identical());
oced = (OrderedContainerElementDiff) diffs[3];
assertTrue(oced.identical());
Diff moced = diffs[4];
assertTrue(moced.different());
assertTrue(moced.getObject1().equals("four"));
assertTrue(moced.getObject2().toString().equals("<undefined>"));
}
private void verifyDiffMatchMismatch(Diff diff, Object object1, Object object2) {
assertEquals(object1, diff.getObject1());
assertEquals(object2, diff.getObject2());
assertFalse(diff.identical());
assertTrue(diff.different());
assertTrue(diff.getDescription().length() > 0);
}
private void verifyDiffMatch(Diff diff, Object object1, Object object2) {
assertEquals(object1, diff.getObject1());
assertEquals(object2, diff.getObject2());
assertTrue(diff.identical());
assertFalse(diff.different());
assertEquals(0, diff.getDescription().length());
}
}