/******************************************************************************* * Copyright (c) 2016 EclipseSource Services GmbH 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: * Martin Fleck - initial API and implementation *******************************************************************************/ package org.eclipse.emf.compare.uml2.tests.message.bug507177; import static org.eclipse.emf.compare.merge.AbstractMerger.SUB_DIFF_AWARE_OPTION; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import java.util.Map; import java.util.Map.Entry; import org.eclipse.emf.common.util.BasicMonitor; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.ide.ui.tests.framework.RuntimeTestRunner; import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.Compare; import org.eclipse.emf.compare.merge.BatchMerger; import org.eclipse.emf.compare.merge.IBatchMerger; import org.eclipse.emf.compare.merge.IMergeOptionAware; import org.eclipse.emf.compare.merge.IMerger; import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin; import org.junit.runner.RunWith; /** * Tests that equivalences are handled correctly when a message is added to an interaction. * * @author <a href="mailto:mfleck@eclipsesource.com">Martin Fleck</a> */ @RunWith(RuntimeTestRunner.class) public class AddMessageSubDiffTest { private static final IMerger.Registry MERGER_REGISTRY = EMFCompareRCPPlugin.getDefault() .getMergerRegistry(); private static final Map<IMergeOptionAware, Object> CACHED_OPTIONS = Maps.newHashMap(); public void enableCascadingFilter() { setCascadingFilter(true); } public void disableCascadingFilter() { setCascadingFilter(false); } public void setCascadingFilter(boolean enabled) { for (IMergeOptionAware merger : Iterables.filter(MERGER_REGISTRY.getMergers(null), IMergeOptionAware.class)) { Map<Object, Object> mergeOptions = merger.getMergeOptions(); Object previousValue = mergeOptions.get(SUB_DIFF_AWARE_OPTION); CACHED_OPTIONS.put(merger, previousValue); mergeOptions.put(SUB_DIFF_AWARE_OPTION, Boolean.valueOf(enabled)); } } public void restoreCascadingFilter() { // restore previous values for (Entry<IMergeOptionAware, Object> entry : CACHED_OPTIONS.entrySet()) { IMergeOptionAware merger = entry.getKey(); merger.getMergeOptions().put(SUB_DIFF_AWARE_OPTION, entry.getValue()); } } /** * Test that equivalent diffs are not merged on both sides when sub-diffs are considered during the merge * process, i.e., the cascading filter is enabled. In this test case, a single message is added. * * @param comparison */ @Compare(left = "data/left.uml", right = "data/right.uml") public void testNoDuplicateAddition(final Comparison comparison) { try { enableCascadingFilter(); final IBatchMerger merger = new BatchMerger(MERGER_REGISTRY); merger.copyAllLeftToRight(comparison.getDifferences(), new BasicMonitor()); // if no exception is thrown during merge, we are happy } finally { restoreCascadingFilter(); } } }