blob: 7cd9190fe6c1b020448f0ac39c1f7d781aa452c1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 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.ide.ui.tests.framework;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.compare.conflict.DefaultConflictDetector;
import org.eclipse.emf.compare.conflict.MatchBasedConflictDetector;
import org.eclipse.emf.compare.diff.DefaultDiffEngine;
import org.eclipse.emf.compare.equi.DefaultEquiEngine;
import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.ConflictDetectors;
import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.DiffEngines;
import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.DisabledMatchEngines;
import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.DisabledPostProcessors;
import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.EqEngines;
import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.ReqEngines;
import org.eclipse.emf.compare.ide.ui.tests.framework.annotations.ResolutionStrategies;
import org.eclipse.emf.compare.req.DefaultReqEngine;
import org.junit.Assert;
import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.ParentRunner;
import org.junit.runners.model.InitializationError;
/**
* EMFCompare specific runners must extends this class.
*
* @author <a href="mailto:mathieu.cartaud@obeo.fr">Mathieu Cartaud</a>
*/
public abstract class AbstractCompareTestRunner extends ParentRunner<Runner> {
/** The list of all runners. */
protected final List<Runner> runners;
/** Default list of resolution strategies used if the @ResolutionStrategies annotation is not used. */
private final ResolutionStrategyID[] defaultResolutionStrategies = new ResolutionStrategyID[] {
ResolutionStrategyID.WORKSPACE, };
/** Default list of match engines disabled if the @MatchEngines annotation is not used. */
private final Class<?>[] defaultDisabledMatchEngines = new Class<?>[] {};
/** Default list of diff engines used if the @DiffEngines annotation is not used. */
private final Class<?>[] defaultDiffEngines = new Class<?>[] {DefaultDiffEngine.class };
/** Default list of eq engines used if the @EqEngines annotation is not used. */
private final Class<?>[] defaultEqEngines = new Class<?>[] {DefaultEquiEngine.class };
/** Default list of req engines used if the @ReqEngines annotation is not used. */
private final Class<?>[] defaultReqEngines = new Class<?>[] {DefaultReqEngine.class };
/** Default list of conflict detector used if the @ConflictEngines annotation is not used. */
private final Class<?>[] defaultConflictDetectors = new Class<?>[] {DefaultConflictDetector.class,
MatchBasedConflictDetector.class, };
/** Default list of resolution strategies disabled if the @PostProcessors annotation is not used. */
private final Class<?>[] defaultDisabledPostProcessors = new Class<?>[] {};
/**
* The constructor.
*
* @param testClass
* The given test class
* @throws InitializationError
* If the test cannot be created
*/
public AbstractCompareTestRunner(Class<?> testClass) throws InitializationError {
super(testClass);
runners = new ArrayList<Runner>();
prepareRunnersForTests();
}
/**
* Create a runner for each configuration. The configurations are a matrix of all association
* possibilities between match, diff, eq, req and conflict engines.
*/
private void prepareRunnersForTests() {
ResolutionStrategies rStrategies = getTestClass().getAnnotation(ResolutionStrategies.class);
final ResolutionStrategyID[] resolutionStrategies;
if (rStrategies == null) {
resolutionStrategies = defaultResolutionStrategies;
} else {
resolutionStrategies = rStrategies.value();
}
DisabledMatchEngines mEngines = getTestClass().getAnnotation(DisabledMatchEngines.class);
final Class<?>[] disabledMatchEngines;
if (mEngines == null) {
disabledMatchEngines = defaultDisabledMatchEngines;
} else {
disabledMatchEngines = mEngines.value();
}
DiffEngines dEngines = getTestClass().getAnnotation(DiffEngines.class);
final Class<?>[] diffEngines;
if (dEngines == null) {
diffEngines = defaultDiffEngines;
} else {
diffEngines = dEngines.value();
}
EqEngines eEngines = getTestClass().getAnnotation(EqEngines.class);
final Class<?>[] eqEngines;
if (eEngines == null) {
eqEngines = defaultEqEngines;
} else {
eqEngines = eEngines.value();
}
ReqEngines rEngines = getTestClass().getAnnotation(ReqEngines.class);
final Class<?>[] reqEngines;
if (rEngines == null) {
reqEngines = defaultReqEngines;
} else {
reqEngines = rEngines.value();
}
ConflictDetectors cEngines = getTestClass().getAnnotation(ConflictDetectors.class);
final Class<?>[] conflictDetectors;
if (cEngines == null) {
conflictDetectors = defaultConflictDetectors;
} else {
conflictDetectors = cEngines.value();
}
DisabledPostProcessors pProcessors = getTestClass().getAnnotation(DisabledPostProcessors.class);
final Class<?>[] disabledPostProcessors;
if (pProcessors == null) {
disabledPostProcessors = defaultDisabledPostProcessors;
} else {
disabledPostProcessors = pProcessors.value();
}
// CHECKSTYLE:OFF those embedded fors are necessary to create all the test possibilities
for (ResolutionStrategyID resolutionStrategy : resolutionStrategies) {
for (Class<?> diffEngine : diffEngines) {
for (Class<?> eqEngine : eqEngines) {
for (Class<?> reqEngine : reqEngines) {
for (Class<?> conflictDetector : conflictDetectors) {
// CHECKSTYLE:ON
try {
EMFCompareTestConfiguration configuration = new EMFCompareTestConfiguration(
disabledMatchEngines, diffEngine, eqEngine, reqEngine,
conflictDetector, disabledPostProcessors);
createRunner(getTestClass().getJavaClass(), resolutionStrategy,
configuration);
} catch (InitializationError e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
}
}
}
}
}
/**
* Create the specific runner for the given parameters.
*
* @param testClass
* The class to test
* @param resolutionStrategy
* The resolution strategy used for this runner
* @param configuration
* EMFCompare configurations for the test
* @throws InitializationError
* If the creation of the runner goes wrong
*/
public abstract void createRunner(Class<?> testClass, ResolutionStrategyID resolutionStrategy,
EMFCompareTestConfiguration configuration) throws InitializationError;
/**
* {@inheritDoc}
*
* @see org.junit.runners.BlockJUnit4ClassRunner#getChildren()
*/
@Override
protected List<Runner> getChildren() {
return runners;
}
/**
* {@inheritDoc}
*
* @see org.junit.runners.ParentRunner#describeChild(java.lang.Object)
*/
@Override
protected Description describeChild(Runner child) {
return child.getDescription();
}
/**
* {@inheritDoc}
*
* @see org.junit.runners.ParentRunner#runChild(java.lang.Object,
* org.junit.runner.notification.RunNotifier)
*/
@Override
protected void runChild(Runner child, RunNotifier notifier) {
child.run(notifier);
}
}