blob: 2a4c89d5b0daa939b686f13279131103efa36b32 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2014 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.provider;
import static com.google.common.collect.Iterables.filter;
import static org.eclipse.emf.compare.ConflictKind.PSEUDO;
import static org.eclipse.emf.compare.DifferenceKind.ADD;
import static org.eclipse.emf.compare.DifferenceKind.CHANGE;
import static org.eclipse.emf.compare.DifferenceKind.DELETE;
import static org.eclipse.emf.compare.DifferenceSource.LEFT;
import static org.eclipse.emf.compare.DifferenceSource.RIGHT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.compare.AttributeChange;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Conflict;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.DifferenceSource;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DefaultGroupProvider;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.provider.TreeNodeItemProviderSpec;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.DiffNode;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.MatchNode;
import org.eclipse.emf.compare.rcp.ui.tests.structuremergeviewer.groups.provider.data.ecore.a1.EcoreA1InputData;
import org.eclipse.emf.compare.utils.MatchUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.tree.TreeFactory;
import org.eclipse.emf.edit.tree.TreeNode;
import org.junit.Before;
import org.junit.Test;
/**
* @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
*/
@SuppressWarnings("restriction")
public class TestReferenceChangeTreeNodeItemProviderSpec extends AbstractTestTreeNodeItemProviderAdapter {
private static TreeNodeItemProviderSpec itemProvider;
@Override
@Before
public void before() throws IOException {
super.before();
itemProvider = (TreeNodeItemProviderSpec)treeItemProviderAdapterFactory.createTreeNodeAdapter();
}
static TreeNode getEcoreA1_EPackageMatch() throws IOException {
Comparison comparison = getComparison(new EcoreA1InputData());
TreeNode treeNode = TreeFactory.eINSTANCE.createTreeNode();
treeNode.setData(comparison);
treeNode.eAdapters().add(new DefaultGroupProvider());
Collection<?> children = itemProvider.getChildren(treeNode);
Iterable<?> matches = filter(children, matchTreeNode);
return (TreeNode)matches.iterator().next();
}
@Test
public void testGetChildren_AudioVisualItem() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode audioVisualItemNode = (MatchNode)ePackageMatch.getChildren().get(3);
checkMatch(audioVisualItemNode, RIGHT, "AudioVisualItem");
List<TreeNode> audioVisualChildren = audioVisualItemNode.getChildren();
assertEquals(3, audioVisualChildren.size());
TreeNode node = audioVisualChildren.get(0);
checkRefChange(node, RIGHT, ADD, "eSuperTypes");
checkNoChild(node);
node = audioVisualChildren.get(1);
assertTrue(node instanceof MatchNode);
assertEquals(2, node.getChildren().size());
TreeNode childNode = node.getChildren().get(0);
checkRefChange(childNode, RIGHT, DELETE, "eStructuralFeatures");
checkNoChild(childNode);
childNode = node.getChildren().get(1);
checkRefChange(childNode, RIGHT, CHANGE, "eType");
checkNoChild(childNode);
node = audioVisualChildren.get(2);
assertTrue(node instanceof MatchNode);
assertEquals(2, node.getChildren().size());
childNode = node.getChildren().get(0);
checkAttChange(childNode, LEFT, CHANGE, "name", "length");
checkNoChild(childNode);
childNode = node.getChildren().get(1);
checkAttChange(childNode, RIGHT, CHANGE, "name", "minutes");
checkNoChild(childNode);
}
@Test
public void testGetChildren_Book() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode bookNode = (MatchNode)ePackageMatch.getChildren().get(0);
checkMatch(bookNode, RIGHT, "Book");
List<TreeNode> bookChildren = bookNode.getChildren();
assertEquals(3, bookChildren.size());
TreeNode diffNode = bookChildren.get(0);
checkRefChange(diffNode, RIGHT, ADD, "eSuperTypes");
checkNoChild(diffNode);
MatchNode titleMatchNode = (MatchNode)bookChildren.get(1);
assertEquals(2, titleMatchNode.getChildren().size());
diffNode = titleMatchNode.getChildren().get(0);
checkRefChange(diffNode, RIGHT, DELETE, "eStructuralFeatures");
checkNoChild(diffNode);
diffNode = titleMatchNode.getChildren().get(1);
checkRefChange(diffNode, RIGHT, CHANGE, "eType");
checkNoChild(diffNode);
MatchNode subtitleMatchNode = (MatchNode)bookChildren.get(2);
assertEquals(2, subtitleMatchNode.getChildren().size());
diffNode = subtitleMatchNode.getChildren().get(0);
checkRefChange(diffNode, RIGHT, ADD, "eStructuralFeatures");
checkNoChild(diffNode);
diffNode = subtitleMatchNode.getChildren().get(1);
checkRefChange(diffNode, RIGHT, CHANGE, "eType");
checkNoChild(diffNode);
}
@Test
public void testGetChildren_Borrowable() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode borrowableNode = (MatchNode)ePackageMatch.getChildren().get(2);
checkMatch(borrowableNode, LEFT, "Borrowable");
checkMatch(borrowableNode, RIGHT, "Lendable");
assertEquals(1, borrowableNode.getChildren().size());
TreeNode node = borrowableNode.getChildren().get(0);
checkAttChange(node, LEFT, CHANGE, "name", "Borrowable");
}
@Test
public void testGetChildren_BookCategory() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode bookCategoryNode = (MatchNode)ePackageMatch.getChildren().get(1);
checkMatch(bookCategoryNode, RIGHT, "BookCategory");
List<TreeNode> bookCategoryChildren = bookCategoryNode.getChildren();
assertEquals(4, bookCategoryChildren.size());
MatchNode matchNode = (MatchNode)bookCategoryChildren.get(0);
assertEquals(1, matchNode.getChildren().size());
Match match = matchNode.getMatch();
assertEquals("Encyclopedia", safeEGet(match.getLeft(), "name"));
DiffNode diffNode = (DiffNode)matchNode.getChildren().get(0);
assertTrue(diffNode.getChildren().isEmpty());
ReferenceChange diff = (ReferenceChange)diffNode.getDiff();
assertEquals(DifferenceKind.ADD, diff.getKind());
assertEquals(DifferenceSource.LEFT, diff.getSource());
matchNode = (MatchNode)bookCategoryChildren.get(1);
assertEquals(1, matchNode.getChildren().size());
match = matchNode.getMatch();
assertEquals("Dictionary", safeEGet(match.getLeft(), "name"));
diffNode = (DiffNode)matchNode.getChildren().get(0);
assertTrue(diffNode.getChildren().isEmpty());
diff = (ReferenceChange)diffNode.getDiff();
assertEquals(DifferenceKind.ADD, diff.getKind());
assertEquals(DifferenceSource.LEFT, diff.getSource());
matchNode = (MatchNode)bookCategoryChildren.get(2);
assertEquals(1, matchNode.getChildren().size());
match = matchNode.getMatch();
assertEquals("Manga", safeEGet(match.getRight(), "name"));
diffNode = (DiffNode)matchNode.getChildren().get(0);
assertTrue(diffNode.getChildren().isEmpty());
diff = (ReferenceChange)diffNode.getDiff();
assertEquals(DifferenceKind.ADD, diff.getKind());
assertEquals(DifferenceSource.RIGHT, diff.getSource());
matchNode = (MatchNode)bookCategoryChildren.get(3);
assertEquals(1, matchNode.getChildren().size());
match = matchNode.getMatch();
assertEquals("Manhwa", safeEGet(match.getRight(), "name"));
diffNode = (DiffNode)matchNode.getChildren().get(0);
assertTrue(diffNode.getChildren().isEmpty());
diff = (ReferenceChange)diffNode.getDiff();
assertEquals(DifferenceKind.ADD, diff.getKind());
assertEquals(DifferenceSource.RIGHT, diff.getSource());
}
@Test
public void testGetChildren_Magazine1() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode magazine1Node = (MatchNode)ePackageMatch.getChildren().get(6);
checkMatch(magazine1Node, LEFT, "Magazine");
assertEquals(4, magazine1Node.getChildren().size());
DiffNode node = (DiffNode)magazine1Node.getChildren().get(0);
checkRefChange(node, LEFT, ADD, "eClassifiers");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
node = (DiffNode)magazine1Node.getChildren().get(1);
checkRefChange(node, LEFT, ADD, "eSuperTypes");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
MatchNode matchNode = (MatchNode)magazine1Node.getChildren().get(2);
assertEquals(2, matchNode.getChildren().size());
node = (DiffNode)matchNode.getChildren().get(0);
checkRefChange(node, LEFT, ADD, "eStructuralFeatures");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
node = (DiffNode)matchNode.getChildren().get(1);
checkRefChange(node, LEFT, CHANGE, "eType");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
matchNode = (MatchNode)magazine1Node.getChildren().get(3);
assertEquals(2, matchNode.getChildren().size());
node = (DiffNode)matchNode.getChildren().get(0);
checkRefChange(node, LEFT, ADD, "eStructuralFeatures");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
node = (DiffNode)matchNode.getChildren().get(1);
checkRefChange(node, LEFT, CHANGE, "eType");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
}
@Test
public void testGetChildren_Magazine2() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode magazine2Node = (MatchNode)ePackageMatch.getChildren().get(8);
checkMatch(magazine2Node, RIGHT, "Magazine");
assertEquals(2, magazine2Node.getChildren().size());
DiffNode node = (DiffNode)magazine2Node.getChildren().get(0);
checkRefChange(node, RIGHT, ADD, "eClassifiers");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
node = (DiffNode)magazine2Node.getChildren().get(1);
checkRefChange(node, RIGHT, ADD, "eSuperTypes");
checkNoChild(node);
assertNotNull(node.getDiff().getConflict());
}
@Test
public void testGetChildren_Periodical() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode periodicalNode = (MatchNode)ePackageMatch.getChildren().get(7);
checkMatch(periodicalNode, RIGHT, "Periodical");
List<TreeNode> periodicalChildren = periodicalNode.getChildren();
assertEquals(5, periodicalChildren.size());
TreeNode node0 = periodicalChildren.get(0);
checkRefChange(node0, LEFT, DELETE, "eClassifiers");
checkNoChild(node0);
assertNotNull(((Diff)node0.getData()).getConflict());
TreeNode node1 = periodicalChildren.get(1);
checkRefChange(node1, RIGHT, ADD, "eSuperTypes");
checkNoChild(node1);
assertNotNull(((Diff)node1.getData()).getConflict());
assertSame(((Diff)node0.getData()).getConflict(), ((Diff)node1.getData()).getConflict());
TreeNode node2 = periodicalChildren.get(2);
checkRefChange(node2, LEFT, DELETE, "eSuperTypes");
checkNoChild(node2);
TreeNode node3 = periodicalChildren.get(3);
assertTrue(node3 instanceof MatchNode);
assertEquals(2, node3.getChildren().size());
DiffNode childNode = (DiffNode)node3.getChildren().get(0);
checkRefChange(childNode, LEFT, DELETE, "eStructuralFeatures");
checkNoChild(childNode);
assertNull(childNode.getDiff().getConflict());
childNode = (DiffNode)node3.getChildren().get(1);
checkRefChange(childNode, LEFT, CHANGE, "eType");
checkNoChild(childNode);
assertNull(childNode.getDiff().getConflict());
TreeNode node4 = periodicalChildren.get(4);
assertTrue(node4 instanceof MatchNode);
assertEquals(4, node4.getChildren().size());
childNode = (DiffNode)node4.getChildren().get(0);
checkRefChange(childNode, LEFT, DELETE, "eStructuralFeatures");
checkNoChild(childNode);
Conflict conflict = childNode.getDiff().getConflict();
assertNotNull(conflict);
assertEquals(PSEUDO, conflict.getKind());
childNode = (DiffNode)node4.getChildren().get(1);
checkRefChange(childNode, RIGHT, DELETE, "eStructuralFeatures");
checkNoChild(childNode);
assertNotNull(childNode.getDiff().getConflict());
assertSame(conflict, childNode.getDiff().getConflict());
childNode = (DiffNode)node4.getChildren().get(2);
checkRefChange(childNode, LEFT, CHANGE, "eType");
checkNoChild(childNode);
Conflict conflict2 = childNode.getDiff().getConflict();
assertNotNull(conflict2);
assertEquals(PSEUDO, conflict2.getKind());
assertNotSame(conflict, conflict2);
childNode = (DiffNode)node4.getChildren().get(3);
checkRefChange(childNode, RIGHT, CHANGE, "eType");
checkNoChild(childNode);
assertNotNull(childNode.getDiff().getConflict());
assertSame(conflict2, childNode.getDiff().getConflict());
}
@Test
public void testGetChildren_Person() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode personNode = (MatchNode)ePackageMatch.getChildren().get(5);
checkMatch(personNode, LEFT, "Person");
List<TreeNode> personChildren = personNode.getChildren();
assertEquals(3, personChildren.size());
TreeNode fullNameNode = personChildren.get(0);
assertEquals(2, fullNameNode.getChildren().size());
DiffNode diffNode = (DiffNode)fullNameNode.getChildren().get(0);
checkRefChange(diffNode, LEFT, ADD, "eStructuralFeatures");
checkNoChild(diffNode);
assertNull(diffNode.getDiff().getConflict());
diffNode = (DiffNode)fullNameNode.getChildren().get(1);
checkRefChange(diffNode, LEFT, CHANGE, "eType");
checkNoChild(diffNode);
assertNull(diffNode.getDiff().getConflict());
TreeNode firstNameNode = personChildren.get(1);
assertEquals(2, firstNameNode.getChildren().size());
diffNode = (DiffNode)firstNameNode.getChildren().get(0);
checkRefChange(diffNode, LEFT, DELETE, "eStructuralFeatures");
checkNoChild(diffNode);
assertNull(diffNode.getDiff().getConflict());
diffNode = (DiffNode)firstNameNode.getChildren().get(1);
checkRefChange(diffNode, LEFT, CHANGE, "eType");
checkNoChild(diffNode);
assertNull(diffNode.getDiff().getConflict());
TreeNode lastNameNode = personChildren.get(2);
assertEquals(3, lastNameNode.getChildren().size());
diffNode = (DiffNode)lastNameNode.getChildren().get(0);
checkRefChange(diffNode, LEFT, DELETE, "eStructuralFeatures");
checkNoChild(diffNode);
Conflict conflict = diffNode.getDiff().getConflict();
assertNotNull(conflict);
diffNode = (DiffNode)lastNameNode.getChildren().get(1);
checkRefChange(diffNode, LEFT, CHANGE, "eType");
checkNoChild(diffNode);
assertNull(diffNode.getDiff().getConflict());
diffNode = (DiffNode)lastNameNode.getChildren().get(2);
checkAttChange(diffNode, RIGHT, CHANGE, "name", "familyName");
checkNoChild(diffNode);
assertSame(conflict, diffNode.getDiff().getConflict());
}
@Test
public void testGetChildren_TitledItem() throws IOException {
TreeNode ePackageMatch = getEcoreA1_EPackageMatch();
MatchNode titledItemNode = (MatchNode)ePackageMatch.getChildren().get(9);
checkMatch(titledItemNode, RIGHT, "TitledItem");
assertEquals(2, titledItemNode.getChildren().size());
DiffNode node = (DiffNode)titledItemNode.getChildren().get(0);
checkRefChange(node, RIGHT, ADD, "eClassifiers");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
MatchNode titleMatchNode = (MatchNode)titledItemNode.getChildren().get(1);
assertEquals(2, titleMatchNode.getChildren().size());
node = (DiffNode)titleMatchNode.getChildren().get(0);
checkRefChange(node, RIGHT, ADD, "eStructuralFeatures");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
node = (DiffNode)titleMatchNode.getChildren().get(1);
checkRefChange(node, RIGHT, CHANGE, "eType");
checkNoChild(node);
assertNull(node.getDiff().getConflict());
}
private Object safeEGet(EObject o, String name) {
return o.eGet(o.eClass().getEStructuralFeature(name));
}
protected void checkMatch(MatchNode node, DifferenceSource side, String value) {
assertEquals(value, safeEGet(MatchUtil.getMatchedObject(node.getMatch(), side), "name"));
}
protected void checkDiffNode(TreeNode node, Class<?> clazz, DifferenceSource src, DifferenceKind kind) {
assertTrue(node instanceof DiffNode);
Diff diff = ((DiffNode)node).getDiff();
assertTrue(clazz.isAssignableFrom(diff.getClass()));
assertSame(src, diff.getSource());
assertSame(kind, diff.getKind());
}
protected void checkRefChange(TreeNode node, DifferenceSource src, DifferenceKind kind, String refName) {
checkDiffNode(node, ReferenceChange.class, src, kind);
ReferenceChange diff = (ReferenceChange)((DiffNode)node).getDiff();
assertEquals(refName, diff.getReference().getName());
}
protected void checkAttChange(TreeNode node, DifferenceSource src, DifferenceKind kind, String refName,
Object value) {
checkDiffNode(node, AttributeChange.class, src, kind);
AttributeChange diff = (AttributeChange)((DiffNode)node).getDiff();
assertEquals(refName, diff.getAttribute().getName());
assertEquals(value, diff.getValue());
}
protected void checkNoChild(TreeNode node) {
assertTrue(node.getChildren().isEmpty());
}
}