package org.eclipse.emf.compare.ide.ui.tests.unit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IStorage; import org.eclipse.core.resources.mapping.ModelProvider; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin; import org.eclipse.emf.compare.ide.ui.internal.logical.EMFModelProvider; import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.CrossReferenceResolutionScope; import org.eclipse.emf.compare.ide.ui.internal.preferences.EMFCompareUIPreferences; import org.eclipse.emf.compare.ide.ui.tests.workspace.TestProject; import org.eclipse.emf.compare.ide.utils.StorageTraversal; import org.eclipse.jface.preference.IPreferenceStore; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * This is the super-class of parameterized unit tests that check the validity of logical model resolution in * each possible scope. * * @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a> */ @SuppressWarnings("restriction") public abstract class LocalResolutionTest extends LogicalModelGraphTest { protected static final String PROJECT2_NAME = "Project-2"; //$NON-NLS-1$ protected TestProject project2; protected IFile iFile1; protected IFile iFile2; private CrossReferenceResolutionScope originalResolutionScope; protected final CrossReferenceResolutionScope scopeToUse; protected final Set<? extends Set<URI>> expectedGraph; protected final Set<String> expectedTraversal; /** * This parameterized test receives the scope to use and the associated expected graph and traversal. * * @param scopeToUse * The resolution scope to run the test with * @param uriSets * The expected graph, as a set of URI sets * @param traversalPaths * The expected traversal, as a set of paths */ public LocalResolutionTest(CrossReferenceResolutionScope scopeToUse, Set<? extends Set<URI>> uriSets, Set<String> traversalPaths) { this.scopeToUse = scopeToUse; this.expectedGraph = uriSets; this.expectedTraversal = traversalPaths; } /** * Implement this method in sub-classes to create models in relevant projects. * * @throws Exception */ protected abstract void setUpModel() throws Exception; @Test public void test() throws Exception { ResolvingResult result = resolveTraversalOf(iFile1); Set<Set<URI>> subGraphs = result.getSubGraphs(); assertEquals(expectedGraph.size(), subGraphs.size()); assertTrue(subGraphs.containsAll(expectedGraph)); StorageTraversal traversal = result.getTraversal(); assertEquals(expectedTraversal.size(), traversal.getStorages().size()); for (IStorage storage : traversal.getStorages()) { assertTrue(expectedTraversal.contains(storage.getFullPath().toString())); } } @Override @Before public void setUp() throws Exception { final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore(); final String stringValue = store.getString(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE); originalResolutionScope = CrossReferenceResolutionScope.valueOf(stringValue); project2 = new TestProject(PROJECT2_NAME); super.setUp(); setUpModel(); setResolutionScope(scopeToUse); } @Override @After public void tearDown() throws Exception { final EMFModelProvider emfModelProvider = (EMFModelProvider)ModelProvider .getModelProviderDescriptor(EMFModelProvider.PROVIDER_ID).getModelProvider(); emfModelProvider.clear(); setResolutionScope(originalResolutionScope); iFile1 = null; iFile2 = null; project2.dispose(); super.tearDown(); } }