/******************************************************************************* * 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()); } }