/******************************************************************************* * Copyright (C) 2015 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 *******************************************************************************/ package org.eclipse.emf.compare.uml2.ide.ui.tests.comparison.tooltip; import static com.google.common.collect.Iterables.filter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.google.common.collect.UnmodifiableIterator; import com.google.common.eventbus.EventBus; import java.io.IOException; import java.util.Collection; import java.util.Iterator; import org.eclipse.compare.CompareConfiguration; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.domain.ICompareEditingDomain; import org.eclipse.emf.compare.domain.impl.EMFCompareEditingDomain; import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration; import org.eclipse.emf.compare.ide.ui.tests.structuremergeviewer.actions.MockMergeAction; import org.eclipse.emf.compare.internal.merge.MergeMode; import org.eclipse.emf.compare.merge.IMerger; import org.eclipse.emf.compare.provider.TooltipLabelAdapterFactory; import org.eclipse.emf.compare.provider.spec.CompareItemProviderAdapterFactorySpec; import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin; import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration; import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter; import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.DefaultGroupProvider; import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.provider.TreeItemProviderAdapterFactorySpec; import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.provider.TreeNodeItemProviderSpec; import org.eclipse.emf.compare.scope.DefaultComparisonScope; import org.eclipse.emf.compare.uml2.ide.ui.tests.comparison.tooltip.data.UMLTooltipProviderInputData; import org.eclipse.emf.compare.uml2.internal.AssociationChange; import org.eclipse.emf.compare.uml2.internal.EMFCompareUML2EditMessages; import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData; import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; import org.eclipse.emf.edit.tree.TreeFactory; import org.eclipse.emf.edit.tree.TreeNode; import org.eclipse.jface.viewers.StructuredSelection; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @SuppressWarnings({"nls", "restriction" }) public class UMLTooltipProviderTest extends AbstractUMLTest { private static AdapterFactory composedAdapterFactory; private UMLTooltipProviderInputData input = new UMLTooltipProviderInputData(); private IMerger.Registry mergerRegistry; private ICompareEditingDomain editingDomain; private static TreeNodeItemProviderSpec itemProvider; private TreeNode moveEdge; private EventBus eventBus; @BeforeClass public static void setupClass() { fillRegistries(); } @AfterClass public static void teardownClass() { resetRegistries(); } public void setup_001() throws Exception { eventBus = new EventBus(); TreeItemProviderAdapterFactorySpec treeItemProviderAdapterFactorySpec = new TreeItemProviderAdapterFactorySpec( new StructureMergeViewerFilter(eventBus)); final Collection<AdapterFactory> factories = Lists.newArrayList(); factories.add(new CompareItemProviderAdapterFactorySpec()); factories.add(treeItemProviderAdapterFactorySpec); factories.add(new EcoreItemProviderAdapterFactory()); factories.add(new ReflectiveItemProviderAdapterFactory()); factories.add(new TooltipLabelAdapterFactory()); composedAdapterFactory = new ComposedAdapterFactory(factories); itemProvider = (TreeNodeItemProviderSpec)treeItemProviderAdapterFactorySpec.createTreeNodeAdapter(); mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry(); final Resource origin = input.getOrigin(); final Resource left = input.getLeft(); final Resource right = input.getRight(); editingDomain = EMFCompareEditingDomain.create(left, right, origin); DefaultComparisonScope scope = new DefaultComparisonScope(left, right, origin); Comparison comparison = emfCompare.compare(scope); EList<Diff> differences = comparison.getDifferences(); assertNotEquals(0, differences.size()); Iterator<AssociationChange> iterator = Iterables.filter(differences, AssociationChange.class) .iterator(); assertTrue(iterator.hasNext()); final AssociationChange diff = iterator.next(); assertFalse(iterator.hasNext()); // Get the compare editor tree nodes linked with the EdgeChange diff. Iterable<TreeNode> nodeRootMatchs = getNodeRootMatch(comparison); Predicate<EObject> predicate = new Predicate<EObject>() { public boolean apply(EObject object) { if (object instanceof TreeNode) { TreeNode node = (TreeNode)object; if (node.getData() == diff) { return true; } } return false; } }; for (TreeNode nodeRootMatch : nodeRootMatchs) { UnmodifiableIterator<EObject> treeNode = Iterators.filter(nodeRootMatch.eAllContents(), predicate); if (treeNode != null && treeNode.hasNext()) { moveEdge = (TreeNode)treeNode.next(); break; } } } @Test public void testReject() throws Exception { setup_001(); final MergeMode accept = MergeMode.REJECT; final boolean leftEditable = true; final boolean rightEditable = false; IEMFCompareConfiguration emfCC = createConfiguration(leftEditable, rightEditable); MockMergeAction action = new MockMergeAction(emfCC, mergerRegistry, accept, null); // Get tooltip for a diff on a move of an edge. action.updateSelection(new StructuredSelection(moveEdge)); String toolTipText = action.getToolTipText(); String tooltipBody = EMFCompareUML2EditMessages.getString("reject.change.tooltip"); assertEquals(tooltipBody, toolTipText); } @Test public void testAccept() throws Exception { setup_001(); final MergeMode accept = MergeMode.ACCEPT; final boolean leftEditable = true; final boolean rightEditable = false; IEMFCompareConfiguration emfCC = createConfiguration(leftEditable, rightEditable); MockMergeAction action = new MockMergeAction(emfCC, mergerRegistry, accept, null); // Get tooltip for a diff on a move of an edge. action.updateSelection(new StructuredSelection(moveEdge)); String toolTipText = action.getToolTipText(); String tooltipBody = EMFCompareUML2EditMessages.getString("accept.change.tooltip"); assertEquals(tooltipBody, toolTipText); } @Test public void testLeft2Right() throws Exception { setup_001(); final MergeMode accept = MergeMode.LEFT_TO_RIGHT; final boolean leftEditable = true; final boolean rightEditable = true; IEMFCompareConfiguration emfCC = createConfiguration(leftEditable, rightEditable); MockMergeAction action = new MockMergeAction(emfCC, mergerRegistry, accept, null); // Get tooltip for a diff on a move of an edge. action.updateSelection(new StructuredSelection(moveEdge)); String toolTipText = action.getToolTipText(); String tooltipBody = EMFCompareUML2EditMessages.getString("merged.to.right.tooltip"); assertEquals(tooltipBody, toolTipText); } @Test public void testRight2Left() throws Exception { setup_001(); final MergeMode accept = MergeMode.RIGHT_TO_LEFT; final boolean leftEditable = true; final boolean rightEditable = true; IEMFCompareConfiguration emfCC = createConfiguration(leftEditable, rightEditable); MockMergeAction action = new MockMergeAction(emfCC, mergerRegistry, accept, null); // Get tooltip for a diff on a move of an edge. action.updateSelection(new StructuredSelection(moveEdge)); String toolTipText = action.getToolTipText(); String tooltipBody = EMFCompareUML2EditMessages.getString("merged.to.left.tooltip"); assertEquals(tooltipBody, toolTipText); } @Override protected AbstractUMLInputData getInput() { return input; } private static Iterable<TreeNode> getNodeRootMatch(Comparison comparison) throws IOException { TreeNode treeNode = TreeFactory.eINSTANCE.createTreeNode(); treeNode.setData(comparison); treeNode.eAdapters().add(new DefaultGroupProvider()); Collection<?> children = itemProvider.getChildren(treeNode); Iterable<TreeNode> matches = (Iterable<TreeNode>)filter(children, matchTreeNode); return matches; } public static Predicate<Object> matchTreeNode = new Predicate<Object>() { public boolean apply(Object object) { if (object instanceof TreeNode) { EObject data = ((TreeNode)object).getData(); if (data instanceof Match) { return true; } } return false; } }; private IEMFCompareConfiguration createConfiguration(boolean leftEditable, boolean rightEditable) { CompareConfiguration cc = new CompareConfiguration(); cc.setLeftEditable(leftEditable); cc.setRightEditable(rightEditable); EMFCompareConfiguration emfCC = new EMFCompareConfiguration(cc); emfCC.setEditingDomain(editingDomain); emfCC.setAdapterFactory(composedAdapterFactory); return emfCC; } }