errors = Lists.newArrayList();
- int run = 0;
- int succeeded = 0;
- while (run < testRuns || (testRuns == 1 && succeeded == 0 && run < thisTestRetries + 1)) {
- try {
- run++;
- methodBlock(method).evaluate();
- succeeded++;
- } catch (AssumptionViolatedException e) {
- throw e;
- } catch (AssertionError exception) {
- failures.add(exception);
- problems.addProblem(exception);
- // CHECKSTYLE:CHECK-OFF IllegalCatch // we want to catch all possible errors
- } catch (Throwable throwable) {
- // CHECKSTYLE:CHECK-ON IllegalCatch
- errors.add(throwable);
- problems.addProblem(throwable);
- }
- }
- final String testCase = getTestClass().getJavaClass().getSimpleName() + '.' + method.getName();
- if (run > 1) {
- logRepeatedTestResult(testCase, run, succeeded, failures.size(), errors.size());
- }
- if (succeeded == 0) {
- problems.assertEmpty();
- }
- if (problems.hasProblems()) {
- if (unstableFail) {
- problems.assertEmpty();
- } else {
- final StringWriter stringWriter = new StringWriter();
- problems.printStackTrace(new PrintWriter(stringWriter));
- LOGGER.info(stringWriter.toString());
- }
- }
- } catch (AssumptionViolatedException e) { // NOPMD ExceptionAsFlowControl
- eachNotifier.addFailedAssumption(e);
- // CHECKSTYLE:CHECK-OFF IllegalCatch // we want to catch all possible errors
- } catch (Throwable e) {
- // CHECKSTYLE:CHECK-ON IllegalCatch
- eachNotifier.addFailure(e);
- } finally {
- eachNotifier.fireTestFinished();
- }
- }
-
- /**
- * Logs the repeated test result.
- *
- * @param testCase
- * the test case, must not be {@code null}
- * @param runs
- * the number of runs
- * @param succeeded
- * the number of succeeded runs
- * @param failures
- * the number of failed runs
- * @param errors
- * the number of errored runs
- */
- public void logRepeatedTestResult(final String testCase, final int runs, final int succeeded, final int failures, final int errors) {
- final StringBuilder testResult = new StringBuilder(testCase).append(" Repeated Test Result: "); //$NON-NLS-1$
- if (succeeded == runs) {
- testResult.append("SUCCESS"); //$NON-NLS-1$
- } else if (succeeded == 0) {
- testResult.append("FAILURE"); //$NON-NLS-1$
- } else {
- testResult.append("UNSTABLE"); //$NON-NLS-1$
- }
- testResult.append(" (").append(succeeded).append(" of ").append(runs).append(" succeeded"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- if (failures > 0) {
- testResult.append(", ").append(failures).append(" failed"); //$NON-NLS-1$ //$NON-NLS-2$
- }
- if (errors > 0) {
- testResult.append(", ").append(errors).append(" errored"); //$NON-NLS-1$ //$NON-NLS-2$
- }
- testResult.append(')');
- LOGGER.info(testResult.toString());
- }
-
- /**
- * Creates a notifier for each test.
- *
- * @param method
- * the {@link FrameworkMethod}, must not be {@code null}
- * @param notifier
- * the {@link RunNotifier}, must not be {@code null}
- * @return an instance of {@link EachTestNotifier}, never {@code null}
- */
- private EachTestNotifier createNotifier(final FrameworkMethod method, final RunNotifier notifier) {
- return new EachTestNotifier(notifier, describeChild(method));
- }
-
- /**
- * Adds any @BeforeAll methods to be run before the normal @Before annotated methods for the first test method only.
- *
- * {@inheritDoc}
- */
- @Override
- protected Statement withBefores(final FrameworkMethod method, final Object target, final Statement stmt) {
- ensureInitialized();
- Statement statement = super.withBefores(method, target, stmt); // NOPMD.CloseResource
- if (method.equals(expectedMethods.get(0))) {
- // reverse BeforeAll method order to get a 'runs top to bottom' order
- final List befores = Lists.reverse(getTestClass().getAnnotatedMethods(BeforeAll.class));
- statement = befores.isEmpty() ? statement : new RunBefores(statement, befores, target);
- }
- return statement;
- }
-
- /**
- * Adds any @AfterAll methods to be run after the normal @After annotated methods for the last test method only.
- *
- * {@inheritDoc}
- */
- @Override
- protected Statement withAfters(final FrameworkMethod method, final Object target, final Statement stmt) {
- ensureInitialized();
- Statement statement = super.withAfters(method, target, stmt); // NOPMD.CloseResource
- if (method.equals(Iterables.getLast(expectedMethods))) {
- final List afters = getTestClass().getAnnotatedMethods(AfterAll.class);
- statement = afters.isEmpty() ? statement : new RunAfters(statement, afters, target);
- }
- return statement;
- }
-
- @Override
- protected List computeTestMethods() {
- final Collection result = Sets.newHashSet();
- for (final Class extends Annotation> annotationClass : TEST_ANNOTATIONS) {
- result.addAll(getTestClass().getAnnotatedMethods(annotationClass));
- }
- return Lists.newArrayList(result);
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DebugClassFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DebugClassFilter.java
deleted file mode 100644
index 86bcb8505..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DebugClassFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.Debug;
-
-
-/**
- * A test class filter that makes sure only test classes annotated with @{@link Debug} are run.
- */
-public class DebugClassFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestClass(description);
- return description.getAnnotation(Debug.class) != null;
- }
-
- @Override
- public String describe() {
- return DebugClassFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DebugMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DebugMethodFilter.java
deleted file mode 100644
index 5214a176e..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DebugMethodFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.Debug;
-
-
-/**
- * A test method filter that makes sure only tests annotated with @{@link Debug} are run.
- */
-public class DebugMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getAnnotation(Debug.class) != null;
- }
-
- @Override
- public String describe() {
- return DebugMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DiscerningSuite.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DiscerningSuite.java
deleted file mode 100644
index ec91e7b7d..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DiscerningSuite.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import java.util.List;
-
-import org.junit.runner.Description;
-import org.junit.runner.Runner;
-import org.junit.runner.manipulation.Filter;
-import org.junit.runner.manipulation.NoTestsRemainException;
-import org.junit.runner.manipulation.Sorter;
-import org.junit.runners.Suite;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.RunnerBuilder;
-
-
-/**
- * Discerns tests using test filters.
- */
-public class DiscerningSuite extends Suite {
-
- private boolean descriptionOutdated = true;
- private Description description;
- private Filter testFilter;
-
- /**
- * Creates a new instance of {@link DiscerningSuite}.
- *
- * @param klass
- * root of the suite
- * @param runners
- * for each class in the suite, a {@link Runner}
- * @throws InitializationError
- * if an error occurred during the initialization
- */
- public DiscerningSuite(final Class> klass, final List runners) throws InitializationError {
- super(klass, runners);
- initialize();
- }
-
- /**
- * Creates a new instance of {@link DiscerningSwtBotNonSwtBotSuite}.
- *
- * @param klass
- * the root of the suite
- * @param suiteClasses
- * the classes in the suite
- * @throws InitializationError
- * if an error occurred during the initialization
- */
- public DiscerningSuite(final Class> klass, final Class>... suiteClasses) throws InitializationError {
- super(klass, suiteClasses);
- initialize();
- }
-
- /**
- * Creates a new instance of {@link DiscerningSwtBotNonSwtBotSuite}.
- *
- * @param klass
- * the root class
- * @param builder
- * builds runners for classes in the suite
- * @throws InitializationError
- * if an error occurred during the initialization
- */
- public DiscerningSuite(final Class> klass, final RunnerBuilder builder) throws InitializationError {
- super(klass, builder);
- initialize();
- }
-
- /**
- * Creates a new instance of {@link DiscerningSwtBotNonSwtBotSuite}.
- *
- * @param builder
- * builds runners for classes in the suite
- * @param klass
- * the root of the suite
- * @param suiteClasses
- * the classes in the suite
- * @throws InitializationError
- * if an error occurred during the initialization
- */
- public DiscerningSuite(final RunnerBuilder builder, final Class> klass, final Class>... suiteClasses) throws InitializationError {
- super(builder, klass, suiteClasses);
- initialize();
- }
-
- /**
- * Creates a new instance of {@link DiscerningSwtBotNonSwtBotSuite}.
- *
- * @param builder
- * builds runners for classes in the suite
- * @param classes
- * the classes in the suite
- * @throws InitializationError
- * if an error occurred during the initialization
- */
- public DiscerningSuite(final RunnerBuilder builder, final Class>... classes) throws InitializationError {
- super(builder, classes);
- initialize();
- }
-
- /**
- * Initializes the {@link DiscerningSuite}.
- */
- private void initialize() {
- SorterUtil.getInstance().initializeSorter(this);
- FilterRegistry.initializeFilter(this);
- }
-
- @Override
- public Description getDescription() {
- if (descriptionOutdated) {
- description = super.getDescription();
- descriptionOutdated = false;
- }
- return description;
- }
-
- @Override
- public void sort(final Sorter sorter) {
- super.sort(sorter);
- descriptionOutdated = true;
- }
-
- @Override
- public void filter(final Filter filter) throws NoTestsRemainException {
- if (testFilter == null || !testFilter.equals(filter)) {
- testFilter = filter;
- super.filter(filter);
- descriptionOutdated = true;
- }
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DynamicSuite.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DynamicSuite.java
deleted file mode 100644
index 540f7fcd8..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/DynamicSuite.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.runner.Runner;
-import org.junit.runners.Suite;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.RunnerBuilder;
-
-
-/**
- * Using {@link DynamicSuite} as a runner allows you to manually build a suite containing
- * tests from many classes, as with {@link Suite}. While {@link Suite} has static references
- * to the test classes, {@link DynamicSuite} resolves the class names at runtime.
- */
-public class DynamicSuite extends Suite {
-
- /**
- * Annotation allows to specify names of suite classes as separate strings.
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target({java.lang.annotation.ElementType.TYPE})
- @Inherited
- public static @interface SuiteClasses {
- String[] value();
- }
-
- public DynamicSuite(final Class> clazz, final RunnerBuilder builder) throws InitializationError {
- this(clazz, builder.runners(clazz, getSuiteClasses(clazz)));
- }
-
- public DynamicSuite(final RunnerBuilder builder, final Class>... classes) throws InitializationError {
- super(builder, classes);
- }
-
- public DynamicSuite(final Class> clazz, final Class>... suiteClasses) throws InitializationError {
- super(clazz, suiteClasses);
- }
-
- public DynamicSuite(final Class> clazz, final List runners) throws InitializationError {
- super(clazz, runners);
- }
-
- public DynamicSuite(final RunnerBuilder builder, final Class> clazz, final Class>... suiteClasses) throws InitializationError {
- super(builder, clazz, suiteClasses);
- }
-
- /**
- * Collect suite classes from annotation.
- *
- * @param clazz
- * main suite to get suite classes annotation from
- * @return list of suite classes
- * @throws InitializationError
- * thrown when annotation is missing or class can not be found
- */
- @SuppressWarnings("nls")
- private static Class>[] getSuiteClasses(final Class> clazz) throws InitializationError {
- // get annotation
- SuiteClasses annotation = clazz.getAnnotation(SuiteClasses.class);
- if (annotation == null) {
- throw new InitializationError(String.format("class '%s' must have a SuiteClasses annotation", clazz.getName()));
- }
-
- // get classes from class names
- List> suiteClasses = new ArrayList>();
- for (String className : annotation.value()) {
- try {
- suiteClasses.add(Class.forName(className, true, clazz.getClassLoader())); // use class loader of suite class in order to resolve specified classes
- } catch (ClassNotFoundException e) {
- throw new InitializationError(String.format("class '%s' not found", className)); // NOPMD: InitializationError has no parameter for Exception
- }
- }
-
- // return suite classes
- return suiteClasses.toArray(new Class>[suiteClasses.size()]);
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FilterRegistry.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FilterRegistry.java
deleted file mode 100644
index d0b4ae70a..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FilterRegistry.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.eclipse.osgi.util.NLS;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runner.manipulation.Filter;
-import org.junit.runner.manipulation.NoTestsRemainException;
-import org.junit.runners.ParentRunner;
-import org.junit.runners.Suite;
-
-import com.google.common.collect.Lists;
-
-
-/**
- * A delegating filter that allows registration of suite, test class and test method filters.
- *
- * Note: Filters can be registered using the system properties {@value #PROPERTY_SUITE_FILTERS}, {@value #PROPERTY_CLASS_FILTERS} and
- * {@value #PROPERTY_METHOD_FILTERS}.
- *
- */
-@SuppressWarnings("nls")
-public final class FilterRegistry extends Filter {
- private static final String NEGATOR = "!";
- private static final String FILTER_SEPARATOR = ",";
- private static final String EMPTY_STRING = "";
- /** The system property to register test suite filters. */
- private static final String PROPERTY_SUITE_FILTERS = "com.avaloq.test.suitefilters";
- /** The system property to register test class filters. */
- private static final String PROPERTY_CLASS_FILTERS = "com.avaloq.test.classfilters";
- /** The system property to register test method filters. */
- private static final String PROPERTY_METHOD_FILTERS = "com.avaloq.test.methodfilters";
- private static final String MESSAGE_INVALID_FILTER = "Invalid filter ''{0}'' registered in property ''{1}''.";
- /** The package prefix for default filters, including the last segment separator. */
- private static final String PACKAGE_PREFIX = FilterRegistry.class.getCanonicalName().substring(0, FilterRegistry.class.getCanonicalName().length()
- - FilterRegistry.class.getSimpleName().length());
- private static final FilterRegistry INSTANCE = new FilterRegistry();
- private static final Logger LOGGER = LogManager.getLogger(FilterRegistry.class);
- /** The list of test suite filters. */
- private final List suiteFilters;
- /** The list of test class filters. */
- private final List classFilters;
- /** The list of test method filters. */
- private final List methodFilters;
-
- /**
- * Initializes the test filter.
- *
- * @param parentRunner
- * the {@link ParentRunner} to initialize, must not be {@code null}
- */
- public static void initializeFilter(final ParentRunner> parentRunner) {
- try {
- parentRunner.filter(INSTANCE);
- } catch (NoTestsRemainException e) {
- // we ignore the case where no children are left
- }
- }
-
- /**
- * Creates a new instance of {@link FilterRegistry}.
- *
- * Note: This filter is initialized using the values of the system properties {@value #PROPERTY_SUITE_FILTERS}, {@value #PROPERTY_CLASS_FILTERS} and
- * {@value #PROPERTY_METHOD_FILTERS}.
- *
- *
- * The values are separated by {@value #FILTER_SEPARATOR}. A filter can be negated by prepending a {@value #NEGATOR}.
- *
- */
- private FilterRegistry() {
- suiteFilters = parseFilters(PROPERTY_SUITE_FILTERS);
- classFilters = parseFilters(PROPERTY_CLASS_FILTERS);
- methodFilters = parseFilters(PROPERTY_METHOD_FILTERS);
- }
-
- /**
- * Parses and instantiates filters registered with the given system property.
- *
- * @param property
- * the name of the system property to parse, must not be {@code null} or empty
- * @return the list of filters, never {@code null}
- */
- private List parseFilters(final String property) {
- final List result = Lists.newArrayList();
- final String filtersProperty = System.getProperty(property, EMPTY_STRING);
- if (filtersProperty.length() == 0) {
- return result;
- }
- final String[] filterNames = filtersProperty.split(FILTER_SEPARATOR);
- for (final String splitSegment : filterNames) {
- String splitSegmentTrimmed = splitSegment.trim();
- if (splitSegmentTrimmed.isEmpty()) {
- continue;
- }
-
- // Handle negation
- boolean negated = splitSegmentTrimmed.startsWith(NEGATOR);
- String filterClassOrLabel = splitSegmentTrimmed;
- if (negated) {
- filterClassOrLabel = splitSegmentTrimmed.substring(1);
- }
-
- // Try to find a Filter subclass with this name
- String qualifiedClassName = filterClassOrLabel;
- if (!filterClassOrLabel.contains(".")) {
- qualifiedClassName = PACKAGE_PREFIX + filterClassOrLabel;
- }
- try {
- Filter filter = null;
- try {
- Class> filterClass = Class.forName(qualifiedClassName);
- if (Filter.class.isAssignableFrom(filterClass)) {
- final Object filterInstance = filterClass.getConstructor().newInstance();
- filter = (Filter) filterInstance;
- }
- } catch (ClassNotFoundException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
- // If no class exists with this name, interpret the String as a label and create a label filter for it
- filter = new TestLabelFilter(filterClassOrLabel);
- }
-
- if (filter != null) {
- if (negated) {
- result.add(new NegatedFilter(filter));
- } else {
- result.add(filter);
- }
- }
- } catch (InstantiationException e) {
- LOGGER.error(NLS.bind(MESSAGE_INVALID_FILTER, qualifiedClassName, property), e);
- } catch (IllegalAccessException e) {
- LOGGER.error(NLS.bind(MESSAGE_INVALID_FILTER, qualifiedClassName, property), e);
- }
- }
- return result;
- }
-
- /**
- * Determines if the given {@link Description} is describing a {@link Suite}.
- *
- * @param description
- * the {@link Description} to check, must not be {@code null}
- * @return whether the description is describing a Suite
- */
- public static boolean isSuite(final Description description) {
- final RunWith runWithAnnotation = description.getAnnotation(RunWith.class);
- return runWithAnnotation != null && Suite.class.isAssignableFrom(runWithAnnotation.value());
- }
-
- /**
- * Determines if the given {@link Description} is describing a test class.
- *
- * @param description
- * the {@link Description} to check, must not be {@code null}
- * @return whether the description is describing a test class
- */
- public static boolean isTestClass(final Description description) {
- return !isSuite(description) && !isTestMethod(description);
- }
-
- /**
- * Determines if the given {@link Description} is describing a test method.
- *
- * @param description
- * the {@link Description} to check, must not be {@code null}
- * @return whether the description is describing a test method
- */
- public static boolean isTestMethod(final Description description) {
- return description.getMethodName() != null;
- }
-
- @Override
- public boolean shouldRun(final Description description) {
- if (isSuite(description)) {
- // check if the description passes all suite filters
- for (final Filter filter : suiteFilters) {
- if (!filter.shouldRun(description)) {
- return false;
- }
- }
- if (!hasRunnableChildren(description)) {
- return false;
- }
- } else if (isTestClass(description)) {
- if (!hasRunnableChildren(description)) {
- return false;
- }
- // check if the description passes all test class filters
- for (final Filter filter : classFilters) {
- if (!filter.shouldRun(description)) {
- return false;
- }
- }
- } else if (isTestMethod(description)) {
- // check if the description passes all test method filters
- for (final Filter filter : methodFilters) {
- if (!filter.shouldRun(description)) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * Check recursively if at least one child description should be run.
- *
- * @param description
- * the parent {@link Description}, must not be {@code null}
- * @return whether there are runnable children
- */
- private boolean hasRunnableChildren(final Description description) {
- for (final Description child : description.getChildren()) {
- if (shouldRun(child)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public String describe() {
- final StringBuilder description = new StringBuilder("FilterRegistry");
- description.append(describeFilters(suiteFilters, "suite"));
- description.append(describeFilters(classFilters, "class"));
- description.append(describeFilters(methodFilters, "method"));
- return description.toString();
- }
-
- /**
- * Describes the list of filters.
- *
- * @param filters
- * the filters to describe, must not be {@code null}
- * @param title
- * the title for the filters, may be {@code null}
- * @return
- * the description for the given filters, never {@code null}
- */
- private String describeFilters(final List filters, final String title) {
- assert filters != null;
- final StringBuilder description = new StringBuilder();
- if (!filters.isEmpty()) {
- description.append(" (").append(title).append(" filters:");
- for (final Filter filter : filters) {
- description.append(' ').append(filter.describe());
- }
- description.append(')');
- }
- return description.toString();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FixedIssueFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FixedIssueFilter.java
deleted file mode 100644
index 240004171..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FixedIssueFilter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.BugTest;
-import com.avaloq.tools.ddk.test.core.Issue;
-import com.avaloq.tools.ddk.test.core.Issues;
-
-
-/**
- * A test filter that makes sure only tests for fixed issues are run.
- *
- * The filter checks if all of the related issues are fixed . If there are no related issues specified, the test is not run.
- *
- */
-public class FixedIssueFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- if (FilterRegistry.isSuite(description)) {
- return true;
- }
- // else: test class or test method
- final Issues issuesAnnotation = description.getAnnotation(Issues.class);
- if (issuesAnnotation != null) {
- for (final Issue issueAnnotation : issuesAnnotation.value()) {
- if (issueAnnotation != null && !issueAnnotation.fixed()) {
- return false;
- }
- }
- }
- final Issue issueAnnotation = description.getAnnotation(Issue.class);
- if (issueAnnotation != null && !issueAnnotation.fixed()) {
- return false;
- }
- final BugTest bugTestAnnotation = description.getAnnotation(BugTest.class);
- if (bugTestAnnotation != null && bugTestAnnotation.unresolved()) {
- return false;
- }
- return FilterRegistry.isTestMethod(description); // if it is a test class we still want to check (and maybe run) its children
- }
-
- @Override
- public String describe() {
- return FixedIssueFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FlakyMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FlakyMethodFilter.java
deleted file mode 100644
index f45b2ec50..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/FlakyMethodFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.Flaky;
-
-
-/**
- * A test method filter that makes sure only tests annotated with @{@link Flaky} are run.
- */
-public class FlakyMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getAnnotation(Flaky.class) != null;
- }
-
- @Override
- public String describe() {
- return FlakyMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/IntegrationTestMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/IntegrationTestMethodFilter.java
deleted file mode 100644
index 6ebd42a76..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/IntegrationTestMethodFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.IntegrationTest;
-
-
-/**
- * A test method filter that makes sure only tests annotated with @{@link IntegrationTest} are run.
- */
-public class IntegrationTestMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getAnnotation(IntegrationTest.class) != null;
- }
-
- @Override
- public String describe() {
- return IntegrationTestMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/ModuleTestMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/ModuleTestMethodFilter.java
deleted file mode 100644
index acbdba084..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/ModuleTestMethodFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.ModuleTest;
-
-
-/**
- * A test method filter that makes sure only tests annotated with @{@link ModuleTest} are run.
- */
-public class ModuleTestMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getAnnotation(ModuleTest.class) != null;
- }
-
- @Override
- public String describe() {
- return ModuleTestMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/NameMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/NameMethodFilter.java
deleted file mode 100644
index 56d2af9b6..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/NameMethodFilter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import java.util.regex.Pattern;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-
-/**
- * A test method filter that makes sure to run only those tests, which have a fully qualified name that matches a specified regular expression.
- *
- * Note: The regular expression needs to be defined using the property {@value #PROPERTY_NAME_PREFIX}.
- *
- */
-@SuppressWarnings("nls")
-public class NameMethodFilter extends Filter {
-
- private static final String PROPERTY_NAME_PREFIX = "com.avaloq.test.namemethodfilter";
- private static final String REGULAR_EXPRESSION = System.getProperty(PROPERTY_NAME_PREFIX, "");
- private static final Pattern PATTERN = Pattern.compile(REGULAR_EXPRESSION);
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return PATTERN.matcher(getQualifiedMethodName(description)).matches();
- }
-
- @Override
- public String describe() {
- return NameMethodFilter.class.getSimpleName();
- }
-
- /**
- * Returns the qualified method name of the given {@link Description}.
- *
- * @param description
- * the {@link Description} which must describe a test method, must not be {@code null}
- * @return the qualified method name of the given {@link Description}
- */
- private String getQualifiedMethodName(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getClassName() + "." + description.getMethodName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/NegatedFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/NegatedFilter.java
deleted file mode 100644
index 37e9ec33a..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/NegatedFilter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-
-/**
- * A filter that inverts the filter criteria of the underlying filter.
- */
-public class NegatedFilter extends Filter {
-
- private final Filter underlyingFilter;
-
- /**
- * Creates a new instance of {@link NegatedFilter}.
- *
- * @param filter
- * the filter to negate, must not be {@code null}
- */
- public NegatedFilter(final Filter filter) {
- assert filter != null;
- this.underlyingFilter = filter;
- }
-
- @Override
- public boolean shouldRun(final Description description) {
- return !underlyingFilter.shouldRun(description);
- }
-
- @Override
- public String describe() {
- return "!" + underlyingFilter.describe(); //$NON-NLS-1$
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/PerformanceTestMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/PerformanceTestMethodFilter.java
deleted file mode 100644
index 628f6e1bb..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/PerformanceTestMethodFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.PerformanceTest;
-
-
-/**
- * A test method filter that makes sure only tests annotated with @{@link PerformanceTest} are run.
- */
-public class PerformanceTestMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getAnnotation(PerformanceTest.class) != null;
- }
-
- @Override
- public String describe() {
- return PerformanceTestMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SorterUtil.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SorterUtil.java
deleted file mode 100644
index 6f92d9246..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SorterUtil.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import java.util.Comparator;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Sorter;
-import org.junit.runners.ParentRunner;
-
-
-/**
- * Utility to specify a {@link Sorter}.
- */
-@SuppressWarnings("nls")
-public final class SorterUtil {
-
- public static final String SORTER_ALPHANUMERIC = "alphanumeric";
- public static final String PROPERTY_SORTER = "com.avaloq.test.sorter";
- private static final String EMPTY = "";
- private final Sorter sorter;
-
- private static final class SingletonHolder {
- private static SorterUtil instance = new SorterUtil();
-
- static SorterUtil get() {
- return instance;
- }
- }
-
- /**
- * Returns the singleton instance of {@link SorterUtil}.
- *
- * @return the singleton instance of {@link SorterUtil}, never {@code null}
- */
- public static SorterUtil getInstance() {
- return SingletonHolder.get();
- }
-
- /**
- * Creates a new instance of {@link SorterUtil}.
- */
- private SorterUtil() {
- final String propertySorter = System.getProperty(PROPERTY_SORTER, EMPTY);
- if (SORTER_ALPHANUMERIC.equalsIgnoreCase(propertySorter)) {
- sorter = new Sorter(new Comparator() {
- @Override
- public int compare(final Description o1, final Description o2) {
- return o1.getDisplayName().compareTo(o2.getDisplayName());
- }
- });
- } else {
- sorter = Sorter.NULL;
- }
- }
-
- /**
- * Initializes the test sorter.
- *
- * @param parentRunner
- * the {@link ParentRunner} to initialize, must not be {@code null}
- */
- public void initializeSorter(final ParentRunner> parentRunner) {
- parentRunner.sort(sorter);
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SwtBotClassFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SwtBotClassFilter.java
deleted file mode 100644
index 920ae40a4..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SwtBotClassFilter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runner.manipulation.Filter;
-
-
-/**
- * A test filter that makes sure only SWT bot tests are run.
- *
- * Note: The SWT bot test classes must use the test runner class specified in the VM argument
- * `com.avaloq.tools.ddk.test.core.junit.runners.SwtBotClassFilter.runwithannotation` for them to be recognized.
- *
- */
-public class SwtBotClassFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestClass(description);
- final RunWith runWithAnnotation = description.getAnnotation(RunWith.class);
-
- return runWithAnnotation != null
- && System.getProperty(SwtBotClassFilter.class.getCanonicalName() + ".runwithannotation").equals(runWithAnnotation.value().getName()); //$NON-NLS-1$
- }
-
- @Override
- public String describe() {
- return SwtBotClassFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SystemTestMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SystemTestMethodFilter.java
deleted file mode 100644
index 256a11e2e..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/SystemTestMethodFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.SystemTest;
-
-
-/**
- * A test method filter that makes sure only tests annotated with @{@link SystemTest} are run.
- */
-public class SystemTestMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getAnnotation(SystemTest.class) != null;
- }
-
- @Override
- public String describe() {
- return SystemTestMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/TestLabelFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/TestLabelFilter.java
deleted file mode 100644
index efe543ede..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/TestLabelFilter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.TestLabels;
-
-
-/**
- * A test filter that makes sure to run only those {@link Description}s that are annotated with a specific {@link TestLabel}.
- */
-public class TestLabelFilter extends Filter {
- private final String label;
-
- public TestLabelFilter(final String label) {
- this.label = label;
- }
-
- @Override
- public boolean shouldRun(final Description description) {
- TestLabels labels = description.getAnnotation(TestLabels.class);
- return labels != null && ArrayUtils.contains(labels.value(), label);
- }
-
- @Override
- public String describe() {
- return TestLabelFilter.class.getSimpleName();
- }
-
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnitTestMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnitTestMethodFilter.java
deleted file mode 100644
index f443053a4..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnitTestMethodFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.UnitTest;
-
-
-/**
- * A test method filter that makes sure only tests annotated with @{@link UnitTest} are run.
- */
-public class UnitTestMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- return description.getAnnotation(UnitTest.class) != null;
- }
-
- @Override
- public String describe() {
- return UnitTestMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnresolvedBugMethodFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnresolvedBugMethodFilter.java
deleted file mode 100644
index 6b7629657..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnresolvedBugMethodFilter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.BugTest;
-
-
-/**
- * A test method filter that makes sure only unresolved bug tests are run.
- */
-public class UnresolvedBugMethodFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- assert FilterRegistry.isTestMethod(description);
- final BugTest bugTestAnnotation = description.getAnnotation(BugTest.class);
- return bugTestAnnotation != null && bugTestAnnotation.unresolved();
- }
-
- @Override
- public String describe() {
- return UnresolvedBugMethodFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnresolvedIssueFilter.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnresolvedIssueFilter.java
deleted file mode 100644
index 926e4127d..000000000
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/junit/runners/UnresolvedIssueFilter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.core.junit.runners;
-
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-
-import com.avaloq.tools.ddk.test.core.BugTest;
-import com.avaloq.tools.ddk.test.core.Issue;
-import com.avaloq.tools.ddk.test.core.Issues;
-
-
-/**
- * A test filter that makes sure only tests for unresolved issues are run.
- *
- * The filter checks if any of the related issues is unresolved. If there are no related issues specified, the test is not run.
- *
- */
-public class UnresolvedIssueFilter extends Filter {
-
- @Override
- public boolean shouldRun(final Description description) {
- if (FilterRegistry.isSuite(description)) {
- return true;
- }
- // else: test class or test method
- final Issues issuesAnnotation = description.getAnnotation(Issues.class);
- if (issuesAnnotation != null) {
- for (final Issue issueAnnotation : issuesAnnotation.value()) {
- if (issueAnnotation != null && !issueAnnotation.fixed()) {
- return true;
- }
- }
- }
- final Issue issueAnnotation = description.getAnnotation(Issue.class);
- if (issueAnnotation != null && !issueAnnotation.fixed()) {
- return true;
- }
- final BugTest bugTestAnnotation = description.getAnnotation(BugTest.class);
- if (bugTestAnnotation != null && bugTestAnnotation.unresolved()) { // NOPMD SimplifyBooleanReturns
- return true;
- }
- return FilterRegistry.isTestClass(description); // if it is a test class we still want to check (and maybe run) its children
- }
-
- @Override
- public String describe() {
- return UnresolvedIssueFilter.class.getSimpleName();
- }
-}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ExtensionRegistryMock.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ExtensionRegistryMock.java
index d9b1b5bb1..5a666921e 100644
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ExtensionRegistryMock.java
+++ b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ExtensionRegistryMock.java
@@ -11,6 +11,7 @@
package com.avaloq.tools.ddk.test.core.mock;
+import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockingDetails;
import static org.mockito.Mockito.spy;
@@ -25,7 +26,6 @@
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.RegistryFactory;
import org.eclipse.emf.common.util.WrappedException;
-import org.junit.Assert;
import org.mockito.stubbing.Answer;
import com.google.common.collect.LinkedHashMultimap;
@@ -179,7 +179,7 @@ public static void assertUnMocked() {
if (registrySpy != null) {
try {
String extensionPointId = configurationElements.keySet().iterator().next();
- Assert.fail("Extension point " + extensionPointId + " still has mocked configuration elements."); //$NON-NLS-1$ //$NON-NLS-2$
+ fail("Extension point " + extensionPointId + " still has mocked configuration elements."); //$NON-NLS-1$ //$NON-NLS-2$
} catch (NoSuchElementException e) { // shouldn't happen
throw new IllegalStateException("The extension registry mock is in an unexpected state.", e); //$NON-NLS-1$
}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ServiceMock.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ServiceMock.java
index 11ab1a081..c552c71b2 100644
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ServiceMock.java
+++ b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/mock/ServiceMock.java
@@ -10,12 +10,11 @@
*******************************************************************************/
package com.avaloq.tools.ddk.test.core.mock;
+import static org.junit.jupiter.api.Assertions.fail;
+
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
-import org.junit.Assert;
-
/**
* Provides mocking framework for services.
@@ -46,10 +45,8 @@ public static boolean isMocked(final Class classToCheck) {
*/
public static void assertAllMocksRemoved() {
if (!originalServices.keySet().isEmpty()) {
- Iterator> iterator = originalServices.keySet().iterator();
- while (iterator.hasNext()) {
- Class> clazz = iterator.next();
- Assert.fail("Service " + clazz.getName() + " is still mocked."); //$NON-NLS-1$//$NON-NLS-2$
+ for (Class> clazz : originalServices.keySet()) {
+ fail("Service " + clazz.getName() + " is still mocked."); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/JobMatcher.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/JobMatcher.java
index 6605221f6..6768e986f 100644
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/JobMatcher.java
+++ b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/JobMatcher.java
@@ -10,6 +10,10 @@
*******************************************************************************/
package com.avaloq.tools.ddk.test.core.util;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.fail;
+
import java.util.Collections;
import java.util.List;
import java.util.concurrent.BlockingQueue;
@@ -19,7 +23,6 @@
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.junit.Assert;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
@@ -214,26 +217,26 @@ public final void deregister() {
* the expected number of jobs
*/
public final void assertNumberOfNewJobs(final int expected) {
- Assert.assertEquals("Wrong number of jobs were scheduled", expected, newJobs.size());
+ assertEquals(expected, newJobs.size(), "Wrong number of jobs were scheduled");
}
/**
* Asserts that there was at least one matching job scheduled after {@link #register() registering} and that all these scheduled jobs finished within
* {@link #timeout} milliseconds of {@link #register() registering}. This method will block until until all matching jobs finish or until the timeout is
- * reached. In the latter case an {@link junit.framework.AssertionFailedError} will be thrown.
+ * reached. In the latter case an {@link org.opentest4j.AssertionFailedError} will be thrown.
*
* After calling this method no additional jobs will be recorded anymore. Call {@link #register()} to reset.
*/
public final void assertNewJobsFinished() {
try {
List expectedJobs = Lists.newArrayList(newJobs);
- Assert.assertFalse("No matching new jobs were scheduled: " + finder, expectedJobs.isEmpty());
+ assertFalse(expectedJobs.isEmpty(), "No matching new jobs were scheduled: " + finder);
expectedJobs.removeAll(finishedJobs);
while (!expectedJobs.isEmpty()) {
try {
Job job = getNextJob();
if (job == null) {
- Assert.fail("Expected new jobs did not finish after " + waitTimeout + " milliseconds: " + expectedJobs);
+ fail("Expected new jobs did not finish after " + waitTimeout + " milliseconds: " + expectedJobs);
}
expectedJobs.remove(job);
} catch (InterruptedException e) {
@@ -248,7 +251,7 @@ public final void assertNewJobsFinished() {
/**
* Asserts that all matching jobs already waiting, running, or sleeping when {@link #register() registering} finished within {@link #timeout} milliseconds of
* {@link #register() registering}. This method will block until all the existing jobs have finished or until the timeout is reached. In the latter case an
- * {@link junit.framework.AssertionFailedError} will be thrown. If no jobs were found upon {@link #register() registering} this method will return
+ * {@link org.opentest4j.AssertionFailedError} will be thrown. If no jobs were found upon {@link #register() registering} this method will return
* immediately.
*
* After calling this method no additional jobs will be recorded anymore. Call {@link #register()} to reset.
@@ -261,7 +264,7 @@ public final void waitForExistingJobs() {
try {
Job job = getNextJob();
if (job == null) {
- Assert.fail("Existing jobs did not finish after " + waitTimeout + " milliseconds: " + expectedJobs);
+ fail("Existing jobs did not finish after " + waitTimeout + " milliseconds: " + expectedJobs); //$NON-NLS-1$ //$NON-NLS-2$
}
expectedJobs.remove(job);
} catch (InterruptedException e) {
diff --git a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/SimpleProgressMonitor.java b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/SimpleProgressMonitor.java
index 01cf8bedd..40c374d67 100644
--- a/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/SimpleProgressMonitor.java
+++ b/com.avaloq.tools.ddk.test.core/src/com/avaloq/tools/ddk/test/core/util/SimpleProgressMonitor.java
@@ -11,7 +11,7 @@
package com.avaloq.tools.ddk.test.core.util;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.junit.Assert;
+import static org.junit.jupiter.api.Assertions.assertFalse;
/**
@@ -169,7 +169,7 @@ public void waitForTermination() {
final long timeStarted = System.currentTimeMillis();
while (!isTerminated()) {
long remainingWaitTime = TIMEOUT + timeStarted - System.currentTimeMillis();
- Assert.assertFalse("Progress monitor did not get done signal", remainingWaitTime <= 0); //$NON-NLS-1$
+ assertFalse(remainingWaitTime <= 0, "Progress monitor did not get done signal"); //$NON-NLS-1$
try {
this.wait(remainingWaitTime);
} catch (InterruptedException e) /* CHECKSTYLE:OFF */ {
diff --git a/com.avaloq.tools.ddk.test.ui/META-INF/MANIFEST.MF b/com.avaloq.tools.ddk.test.ui/META-INF/MANIFEST.MF
index 020b707ef..26937d5ab 100644
--- a/com.avaloq.tools.ddk.test.ui/META-INF/MANIFEST.MF
+++ b/com.avaloq.tools.ddk.test.ui/META-INF/MANIFEST.MF
@@ -13,18 +13,18 @@ Require-Bundle: com.avaloq.tools.ddk.test.core,
org.eclipse.swt,
org.eclipse.swtbot.eclipse.core,
org.eclipse.swtbot.eclipse.finder;visibility:=reexport,
- org.eclipse.swtbot.junit4_x,
+ org.eclipse.swtbot.junit5_x,
org.eclipse.swtbot.swt.finder,
org.eclipse.ui;visibility:=reexport,
org.hamcrest.library,
- org.junit,
org.mockito.mockito-core,
com.google.guava,
org.apache.commons.lang3,
org.eclipse.emf.common,
- com.avaloq.tools.ddk
+ com.avaloq.tools.ddk,
+ junit-jupiter-api,
+ junit-jupiter-engine
Export-Package: com.avaloq.tools.ddk.test.ui,
- com.avaloq.tools.ddk.test.ui.junit.runners,
com.avaloq.tools.ddk.test.ui.swtbot,
com.avaloq.tools.ddk.test.ui.swtbot.condition,
com.avaloq.tools.ddk.test.ui.swtbot.util
diff --git a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/junit/runners/SwtBotRecordingTestRunner.java b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/junit/runners/SwtBotRecordingTestRunner.java
deleted file mode 100644
index 1e97cfdc4..000000000
--- a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/junit/runners/SwtBotRecordingTestRunner.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.ui.junit.runners;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
-import org.junit.internal.runners.statements.InvokeMethod;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-import com.avaloq.tools.ddk.test.core.AbstractSystemTest;
-import com.avaloq.tools.ddk.test.core.junit.runners.ClassRunner;
-import com.avaloq.tools.ddk.test.ui.swtbot.CoreSwtbotTools;
-
-
-/**
- * A {@link org.junit.runner.Runner} to use with swt bot tests featuring screenshot recording.
- */
-// suppress warning restriction of org.junit.internal.runners.statements.InvokeMethod
-@SuppressWarnings("restriction")
-public class SwtBotRecordingTestRunner extends ClassRunner {
- /**
- * Used to mark a test class or method to define the recording interval in milliseconds to use for the {@link SwtBotRecordingTestRunner}.
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.METHOD, ElementType.TYPE})
- public static @interface RecordingInterval {
- /**
- * Returns the recording interval value in milliseconds.
- *
- * @return the recording interval value in milliseconds
- */
- long value();
- }
-
- private final TestRunRecording testRunRecording;
-
- /**
- * Creates a new instance of {@link SwtBotRecordingTestRunner}.
- * Only called reflectively. Do not use programmatically.
- *
- * @param testClass
- * the test class to run
- * @throws InitializationError
- * if any initialization failed
- */
- public SwtBotRecordingTestRunner(final Class extends AbstractSystemTest> testClass) throws InitializationError {
- super(testClass);
- CoreSwtbotTools.initializePreferences();
- testRunRecording = new TestRunRecording(getTestClass().getJavaClass(), SWTBotPreferences.SCREENSHOTS_DIR);
- // TODO: add custom made {@link org.junit.runners.model.Statement} to check for exceptions during the test
- // (by default test failures are reported only after the teardown has taken place)
- }
-
- @Override
- public void run(final RunNotifier notifier) {
- try {
- notifier.removeListener(testRunRecording); // remove existing listeners that could be added by suite or class runners
- notifier.addListener(testRunRecording);
- super.run(notifier);
- } finally {
- notifier.removeListener(testRunRecording);
- }
- }
-
- @Override
- protected void runChild(final FrameworkMethod method, final RunNotifier notifier) {
- testRunRecording.setRecordingInterval(getRecordingInterval(method));
- super.runChild(method, notifier);
- }
-
- @Override
- protected Statement methodInvoker(final FrameworkMethod method, final Object test) {
- return new InvokeMethod(method, test) {
- @Override
- // CHECKSTYLE:CHECK-OFF IllegalThrow // inherited JUnit throw style
- public void evaluate() throws Throwable {
- // CHECKSTYLE:CHECK-ON IllegalThrow
- try {
- super.evaluate();
- // CHECKSTYLE:CHECK-OFF IllegalCatch // catching in order to act upon but then throwing the exception again
- } catch (final Throwable throwable) {
- // CHECKSTYLE:CHECK-ON IllegalCatch
- testRunRecording.methodInvokeFailure(throwable);
- throw throwable;
- }
- }
- };
- }
-
- /**
- * Computes the capture interval to use for recording the given test method.
- * Checks first the annotation {@link RecordingInterval} of the method,
- * then the annotations of the test class.
- * Falls back to the default setting if no annotations were found.
- *
- * @param method
- * the method under test
- * @return the framerate to use for recording the given test method
- */
- private long getRecordingInterval(final FrameworkMethod method) {
- RecordingInterval recordingInterval = method.getAnnotation(RecordingInterval.class);
- if (recordingInterval != null) {
- return recordingInterval.value();
- }
- for (Annotation annotation : getTestClass().getAnnotations()) {
- if (annotation.annotationType().equals(RecordingInterval.class)) {
- return ((RecordingInterval) annotation).value();
- }
- }
- return TestRunRecording.DEFAULT_RECORDING_INTERVAL;
- }
-}
diff --git a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/junit/runners/TestRunRecording.java b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/junit/runners/TestRunRecording.java
deleted file mode 100644
index 69c0da2c9..000000000
--- a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/junit/runners/TestRunRecording.java
+++ /dev/null
@@ -1,726 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.test.ui.junit.runners;
-
-import java.awt.AWTException;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.Robot;
-import java.awt.Toolkit;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.lang.management.LockInfo;
-import java.lang.management.ManagementFactory;
-import java.lang.management.MonitorInfo;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.nio.charset.StandardCharsets;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import javax.imageio.ImageIO;
-
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.results.VoidResult;
-import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
-import org.eclipse.ui.PlatformUI;
-import org.junit.runner.Description;
-import org.junit.runner.notification.Failure;
-import org.junit.runner.notification.RunListener;
-
-import com.avaloq.tools.ddk.annotations.SuppressFBWarnings;
-import com.avaloq.tools.ddk.test.core.AbstractTestStep;
-import com.avaloq.tools.ddk.test.core.TestStepListener;
-import com.google.common.collect.Sets;
-import com.google.common.primitives.Longs;
-
-
-/**
- * Recording of a test run.
- */
-// CHECKSTYLE:OFF
-@SuppressWarnings("nls")
-public class TestRunRecording extends RunListener implements TestStepListener, MouseListener {
- private static final String NEW_LINE = "\r\n";
- private static final String FILE_INFORMATION_SEPARATOR = "__";
- private static final int MOUSE_POINTER_SIZE = 24;
- private static final int INFO_BORDER_SIZE = 3;
- // CHECKSTYLE:ON
- // private static final int FILE_READ_BUFFER = 2048;
- private static final int INFO_FONT_SIZE = 18;
- private static final Logger LOGGER = Logger.getLogger(TestRunRecording.class.getSimpleName());
- private static final String IMAGE_TYPE = SWTBotPreferences.SCREENSHOT_FORMAT;
- private static final String IMAGE_FILE_EXTENSION = '.' + IMAGE_TYPE;
- private static final String CALL_STACK_FILE_EXTENSION = ".txt";
- private static boolean screenshotsCleared;
- private final Robot robot;
- private final Toolkit toolkit = Toolkit.getDefaultToolkit();
- private static final int STACK_DEPTH = 80;
- private static final ThreadMXBean THREAD_BEAN = ManagementFactory.getThreadMXBean();
-
- /**
- * The recording interval defines the (approximate) maximum interval in milliseconds between two consecutive screenshots.
- */
- public static final long DEFAULT_RECORDING_INTERVAL = 500;
- private static final int MINIMAL_RECORDING_INTERVAL = 100;
- private long recordingInterval;
-
- private final String screenshotFolder;
- private final Class> testClass;
- private String testClassName;
- private String testMethodName;
- private AbstractTestStep currentTestStep;
- private TestStepState currentTestStepState;
-
- private Thread captureThread;
- private final Object lock = new Object(); // used for synchronizing with anonymous classes
- private boolean captureThreadRunning;
- private long lastCaptureTime;
-
- private boolean testFailed;
- /** The associated exception in case of a failure. */
- private Throwable exception;
- private boolean testStepStarted;
- private boolean mouseClicked;
- private boolean mousePressedDown;
- private MouseEvent mouseEvent;
-
- /**
- * Creates a new instance of {@link TestRunRecording}.
- *
- * @param testClass
- * the class under test
- * @param screenshotFolder
- * the folder dedicated for screenshots
- */
- public TestRunRecording(final Class> testClass, final String screenshotFolder) {
- this(testClass, screenshotFolder, DEFAULT_RECORDING_INTERVAL);
- }
-
- /**
- * Creates a new instance of {@link TestRunRecording}.
- *
- * @param testClass
- * the class under test
- * @param screenshotFolder
- * the folder dedicated for screenshots
- * @param recordingInterval
- * the interval in milliseconds between two consecutive screenshots
- */
- public TestRunRecording(final Class> testClass, final String screenshotFolder, final long recordingInterval) {
- this.testClass = testClass;
- this.screenshotFolder = screenshotFolder;
- setRecordingInterval(recordingInterval);
- try {
- robot = new Robot();
- } catch (AWTException e) {
- throw new WrappedException("TestRunRecording cannot be used in a headless environment.", e);
- }
- }
-
- /**
- * Sets the interval in milliseconds between two consecutive screenshots.
- *
- * @param recordingInterval
- * the new recording interval in milliseconds
- */
- public final void setRecordingInterval(final long recordingInterval) {
- this.recordingInterval = Math.max(recordingInterval, MINIMAL_RECORDING_INTERVAL);
- }
-
- @Override
- @SuppressWarnings("PMD.JUnit4TestShouldUseTestAnnotation")
- @SuppressFBWarnings("AT_STALE_THREAD_WRITE_OF_PRIMITIVE")
- public void testStarted(final Description description) {
- if (!screenshotsCleared) {
- deleteDirectoryContents(new File(screenshotFolder));
- screenshotsCleared = true;
- }
- testFailed = false;
- testStepStarted = false;
- if (description.getTestClass() != null) {
- testClassName = description.getTestClass().getName();
- } else {
- testClassName = testClass.getSimpleName();
- }
- testMethodName = description.getMethodName();
- AbstractTestStep.registerTestStepListener(this);
- UIThreadRunnable.syncExec(new VoidResult() {
- @Override
- public void run() {
- PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().addMouseListener(TestRunRecording.this);
- }
- });
- start();
- }
-
- @Override
- @SuppressWarnings("PMD.JUnit4TestShouldUseTestAnnotation")
- public void testFinished(final Description description) {
- stop();
- AbstractTestStep.removeTestStepListener(this);
- UIThreadRunnable.syncExec(new VoidResult() {
- @Override
- public void run() {
- PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().removeMouseListener(TestRunRecording.this);
- }
- });
- if (!testFailed) {
- deleteScreenshots();
- }
- }
-
- @Override
- @SuppressWarnings("PMD.JUnit4TestShouldUseTestAnnotation")
- public void testFailure(final Failure failure) {
- methodInvokeFailure(failure.getException());
- }
-
- @Override
- public void stepStateChanged(final AbstractTestStep testStep, final TestStepState testStepState, final Throwable throwable) {
- synchronized (lock) {
- this.currentTestStep = testStep;
- this.currentTestStepState = testStepState;
- testStepStarted = true;
- if (TestStepState.FAILED == testStepState || TestStepState.ERRORED == testStepState) {
- exception = throwable;
- testFailed = true;
- }
- createScreenshot(0); // always create a screenshot when the step state changes
- createCallStack(0);
- }
- }
-
- /**
- * Handles an exception caused by invoking the test method.
- *
- * @param throwable
- * the thrown {@link Throwable}, must not be {@code null}
- */
- public void methodInvokeFailure(final Throwable throwable) {
- synchronized (lock) {
- if (!testFailed) {
- exception = throwable;
- testFailed = true;
- createScreenshot(0); // immediately create a screenshot when a test failure is reported
- createCallStack(0);
- }
- }
- }
-
- /**
- * Creates a new asynchronous thread that regularly creates screenshots of the running test environment.
- * Stops a previously started and still running thread.
- */
- private void start() {
- if (captureThreadRunning) {
- stop();
- }
- deleteScreenshots();
- captureThreadRunning = true;
- captureThread = new Thread(new Runnable() {
- @Override
- public void run() {
- while (captureThreadRunning) {
- synchronized (lock) {
- // if test steps are used, only create continuous screenshots in the run step state; for all other states 1 screenshot is enough
- if (currentTestStep != null && TestStepState.RUN == currentTestStepState) {
- createScreenshot(recordingInterval);
- createCallStack(recordingInterval);
- }
- }
- try {
- Thread.sleep(recordingInterval);
- } catch (final InterruptedException e) {
- // ignore, because #createScreenshot will make sure that a minimal recording interval is retained
- }
- }
- }
- });
- captureThread.start();
- }
-
- /**
- * Stops the asynchronous thread from creating screenshots.
- */
- @SuppressFBWarnings("AT_STALE_THREAD_WRITE_OF_PRIMITIVE")
- private void stop() {
- captureThreadRunning = false;
- try {
- captureThread.join();
- } catch (final InterruptedException e) {
- // ignore: the capture thread is no longer important and shall silently be removed
- }
- }
-
- /**
- * Creates a new screenshot, if the last screenshot is older than the minimal recording interval.
- */
- private void createScreenshot() {
- createScreenshot(MINIMAL_RECORDING_INTERVAL);
- }
-
- /**
- * Creates a new screenshot, if the last screenshot is older than the minimal recording interval.
- */
- private void createCallStack() {
- createCallStack(MINIMAL_RECORDING_INTERVAL);
- }
-
- /**
- * Creates a new screenshot, if the last screenshot is older than the provided captureInterval.
- *
- * @param captureInterval
- * the minimal interval in milliseconds which determines if the screenshot is created
- */
- private void createScreenshot(final long captureInterval) {
- synchronized (lock) {
- if (System.currentTimeMillis() > lastCaptureTime + captureInterval) {
- lastCaptureTime = System.currentTimeMillis(); // save time at beginning, so that a failed screenshot results in a skipped frame
- final BufferedImage image = capture();
- process(image);
- try {
- store(image);
- } catch (IOException e) {
- LOGGER.warning("Could not create screenshot: " + getImageFileName());
- }
- }
- }
- }
-
- /**
- * Creates a new call stack record, if the last record is older than the provided captureInterval.
- *
- * @param captureInterval
- * the minimal interval in milliseconds which determines if the call stack is created
- */
- private void createCallStack(final long captureInterval) {
- synchronized (lock) {
- if (System.currentTimeMillis() > lastCaptureTime + captureInterval) {
- lastCaptureTime = System.currentTimeMillis(); // save time at beginning
- final String image = captureCallStack();
- try {
- storeCallStack(image);
- } catch (IOException e) {
- LOGGER.warning("Could not create screenshot: " + getImageFileName());
- }
- }
- }
- }
-
- /**
- * Captures a screenshot.
- *
- * @return the {@link BufferedImage}, never {@code null}
- */
- private BufferedImage capture() {
- final Rectangle screenBounds = new Rectangle(toolkit.getScreenSize());
- return robot.createScreenCapture(screenBounds);
- }
-
- /**
- * Captures a call stack.
- *
- * @return the call stack with test status information, never {@code null}
- */
- @SuppressWarnings("PMD.InsufficientStringBufferDeclaration")
- private String captureCallStack() {
- StringBuilder trace = new StringBuilder();
- // Same info as on the screenshot
- trace.append("TEST: ").append(testClassName).append('.').append(testMethodName).append(NEW_LINE);
- if (testStepStarted && currentTestStep != null && currentTestStepState != null) {
- String colonWithSpace = ": ";
- trace.append("TEST STEP: ").append(currentTestStep.getName()).append(colonWithSpace).append(currentTestStepState.toString()).append(NEW_LINE);
- if (testFailed && exception != null) {
- trace.append("TEST FAILED: ").append(exception.getClass().getSimpleName()).append(colonWithSpace).append(exception.getMessage()).append(NEW_LINE);
- }
- }
- trace.append(getThreadInfo());
- return trace.toString();
- }
-
- /**
- * Gets the task name.
- *
- * @param id
- * the id
- * @param name
- * the name
- * @return the task name
- */
- private static String getTaskName(final long id, final String name) {
- if (name == null) {
- return Long.toString(id);
- }
- return id + " (" + name + ")";
- }
-
- /**
- * Gathers the thread ids of threads that look deadlocked.
- *
- * @return the thread ids of deadlocked threads
- */
- private static Set getDeadlockThreadIds() {
- Set deadlockedThreads = Sets.newHashSet();
- long[] dead = THREAD_BEAN.findDeadlockedThreads();
- if (dead != null) {
- deadlockedThreads.addAll(Longs.asList(dead));
- }
- dead = THREAD_BEAN.findMonitorDeadlockedThreads();
- if (dead != null) {
- deadlockedThreads.addAll(Longs.asList(dead));
- }
- return deadlockedThreads;
- }
-
- /**
- * Prints the owned locks for the thread.
- * Must have explicitly obtained Monitor and Synchronizer information for anything to show up from here.
- *
- * @param info
- * the {@code:ThreadInfo} for the thread in question, must not be {@code:null}
- * @return the owned lock information
- */
- private static String getOwnedLockInfo(final ThreadInfo info) {
- StringBuilder trace = new StringBuilder(" Holding locks for:").append(NEW_LINE);
- for (LockInfo lock : info.getLockedSynchronizers()) {
- trace.append(" ").append(lock.toString()).append(NEW_LINE);
- }
- for (MonitorInfo monitor : info.getLockedMonitors()) {
- trace.append(" ").append(monitor.toString()).append(NEW_LINE);
- }
- return trace.toString();
- }
-
- /**
- * Print the thread's stack trace.
- *
- * @param info
- * the {@code:ThreadInfo} for the thread in question, must not be {@code:null}
- * @return the thread stack trace
- */
- @SuppressWarnings("PMD.InsufficientStringBufferDeclaration")
- private static String getCallStackTrace(final ThreadInfo info) {
- StringBuilder trace = new StringBuilder(" Stack:").append(NEW_LINE);
- int frameCount = 0;
- for (StackTraceElement frame : info.getStackTrace()) {
- trace.append(" ").append(frame.toString()).append(NEW_LINE);
- // Can't request lock information AND limit call stack size with only one ThreadInfo request. Fake it instead.
- if (frameCount++ >= STACK_DEPTH) {
- trace.append(" ...").append(NEW_LINE);
- break;
- }
- }
- return trace.toString();
- }
-
- /**
- * Print all of the thread's information and stack traces.
- *
- * @return the thread info
- */
- private static String getThreadInfo() {
- boolean contention = THREAD_BEAN.isThreadContentionMonitoringEnabled();
- Set deadlockedThreads = getDeadlockThreadIds();
- ThreadInfo[] threadInfos = THREAD_BEAN.dumpAllThreads(true, true);
- // CHECKSTYLE:OFF MagicNumber
- StringBuilder trace = new StringBuilder(200).append(threadInfos.length).append(" active threads").append(NEW_LINE);
- // CHECKSTYLE:ON
- for (ThreadInfo info : threadInfos) {
- if (info == null) {
- trace.append(" Inactive").append(NEW_LINE);
- continue;
- }
- boolean isDeadlocked = deadlockedThreads.contains(info.getThreadId());
- trace.append("Thread ").append(getTaskName(info.getThreadId(), info.getThreadName()));
- if (isDeadlocked) {
- trace.append(" <>");
- }
- trace.append(NEW_LINE);
- Thread.State state = info.getThreadState();
- trace.append(" State: ").append(state).append(NEW_LINE);
- trace.append(" Blocked count: ").append(info.getBlockedCount()).append(NEW_LINE);
- trace.append(" Waited count: ").append(info.getWaitedCount()).append(NEW_LINE);
- if (contention) {
- trace.append(" Blocked time: ").append(info.getBlockedTime()).append(NEW_LINE);
- trace.append(" Waited time: ").append(info.getWaitedTime()).append(NEW_LINE);
- }
- if (state == Thread.State.WAITING) {
- trace.append(" Waiting on ").append(info.getLockName()).append(NEW_LINE);
- } else if (state == Thread.State.BLOCKED) {
- trace.append(" Blocked on ").append(info.getLockName()).append(NEW_LINE);
- trace.append(" Blocked by ").append(getTaskName(info.getLockOwnerId(), info.getLockOwnerName())).append(NEW_LINE);
- }
- if (state == Thread.State.WAITING || state == Thread.State.BLOCKED || isDeadlocked) {
- trace.append(getOwnedLockInfo(info));
- }
- trace.append(getCallStackTrace(info));
- }
- return trace.toString();
- }
-
- /**
- * Processes the given screenshot by adding corresponding information to the image.
- *
- * @param image
- * the {@link BufferedImage}, must not be {@code null}
- */
- private void process(final BufferedImage image) {
- if (image == null) {
- return;
- }
- final Graphics2D graphics = image.createGraphics();
- // draw mouse location
- if (mouseEvent != null) {
- drawCrosshair(graphics, mouseEvent.x, mouseEvent.y);
- }
- // draw capture information
- int x = image.getWidth() / 2;
- int y = 0;
- drawInfoBox(graphics, testClassName + "." + testMethodName, x, y);
- if (testStepStarted && currentTestStep != null && currentTestStepState != null) {
- y += getInfoBoxHeight() + INFO_BORDER_SIZE;
- drawInfoBox(graphics, currentTestStep.getName() + ": " + currentTestStepState.toString(), x, y);
- if (testFailed && exception != null) {
- final String message = exception.getMessage();
- if (message != null) {
- y += getInfoBoxHeight() + INFO_BORDER_SIZE;
- drawInfoBox(graphics, exception.getClass().getSimpleName() + ": " + message, x, y);
- }
- }
- }
- }
-
- /**
- * Draws a crosshair at the given screen coordinates on the captured image.
- *
- * @param graphics
- * the {@link Graphics2D}, must not be {@code null}
- * @param x
- * the x screen coordinate
- * @param y
- * the y screen coordinate
- */
- private void drawCrosshair(final Graphics2D graphics, final int x, final int y) {
- if (mouseClicked) {
- graphics.setColor(Color.GREEN);
- } else if (mousePressedDown) {
- graphics.setColor(Color.RED);
- } else {
- graphics.setColor(Color.BLUE);
- }
- graphics.drawOval(x - MOUSE_POINTER_SIZE / 2, y - MOUSE_POINTER_SIZE / 2, MOUSE_POINTER_SIZE, MOUSE_POINTER_SIZE);
- graphics.drawOval(x - MOUSE_POINTER_SIZE / 2 + 1, y - MOUSE_POINTER_SIZE / 2 + 1, MOUSE_POINTER_SIZE - 2, MOUSE_POINTER_SIZE - 2);
- graphics.drawLine(x, y - MOUSE_POINTER_SIZE / 2, x, y + MOUSE_POINTER_SIZE / 2);
- graphics.drawLine(x - MOUSE_POINTER_SIZE / 2, y, x + MOUSE_POINTER_SIZE / 2, y);
- }
-
- /**
- * Draws a black box with an info text on the captured image.
- *
- * @param graphics
- * the {@link Graphics2D}, must not be {@code null}
- * @param info
- * the text to draw, must not be {@code null}
- * @param x
- * the center x coordinate of the box on the screenshot image
- * @param y
- * the top y coordinate of the box on the screenshot image
- */
- private void drawInfoBox(final Graphics2D graphics, final String info, final int x, final int y) {
- graphics.setFont(new Font("Arial", Font.PLAIN, INFO_FONT_SIZE));
- final int stringWidth = graphics.getFontMetrics().stringWidth(info);
- final int leftCoord = x - stringWidth / 2;
- graphics.setColor(Color.BLACK);
- graphics.fillRoundRect(leftCoord - INFO_BORDER_SIZE, y, stringWidth + 2 * INFO_BORDER_SIZE, INFO_FONT_SIZE
- + 2 * INFO_BORDER_SIZE, INFO_BORDER_SIZE, INFO_BORDER_SIZE);
- if (testFailed) {
- graphics.setColor(Color.RED);
- } else {
- graphics.setColor(Color.GREEN);
- }
- graphics.drawString(info, leftCoord, y + INFO_FONT_SIZE + INFO_BORDER_SIZE);
- }
-
- /**
- * Returns the height an info box has.
- *
- * @return the height an info box has
- */
- private int getInfoBoxHeight() {
- return INFO_FONT_SIZE + 2 * INFO_BORDER_SIZE;
- }
-
- /**
- * Stores the captured image.
- *
- * @param image
- * the {@link BufferedImage}, must not be {@code null}
- * @throws IOException
- * if the image could not be written to file.
- */
- private void store(final BufferedImage image) throws IOException {
- final File screenshotDirectory = new File(getScreenshotDirectory());
- screenshotDirectory.mkdirs();
- ImageIO.write(image, IMAGE_TYPE, new File(getImageFileName()));
- }
-
- /**
- * Stores the call stack.
- *
- * @param trace
- * the call stack information to store, must not be {@code null}
- * @throws IOException
- * if the call stack could not be written to file.
- */
- private void storeCallStack(final String trace) throws IOException {
- // Put it next to screenshots (intentional)
- final File screenshotDirectory = new File(getScreenshotDirectory());
- screenshotDirectory.mkdirs();
- PrintWriter out = new PrintWriter(getCallStackFileName(), StandardCharsets.UTF_8);
- out.print(trace);
- out.close();
- }
-
- /**
- * Returns the image file name to use for the current screenshot.
- *
- * @return the image file name to use for the current screenshot, never {@code null}
- */
- private String getImageFileName() {
- return getFileNamePrefix() + IMAGE_FILE_EXTENSION;
- }
-
- /**
- * Returns the image file name to use for the current screenshot.
- *
- * @return the image file name to use for the current screenshot, never {@code null}
- */
- private String getCallStackFileName() {
- return getFileNamePrefix() + CALL_STACK_FILE_EXTENSION;
- }
-
- /**
- * Returns a prefix for a file name.
- *
- * @return Prefix for trace file names
- */
- private String getFileNamePrefix() {
- final StringBuilder result = new StringBuilder(getScreenshotDirectory());
- final Date date = new Date(lastCaptureTime); // NOPMD ReplaceJavaUtilDate
- final DateFormat formatter = new SimpleDateFormat("HH.mm.ss.SSS", Locale.UK);
- final String formattedDate = formatter.format(date);
- result.append(formattedDate);
- if (testStepStarted && currentTestStep != null) {
- result.append(FILE_INFORMATION_SEPARATOR).append(currentTestStep.getName());
- if (currentTestStepState != null) {
- result.append(FILE_INFORMATION_SEPARATOR).append(currentTestStepState.toString());
- }
- } else if (testFailed) {
- result.append("__FAILED");
- }
- return result.toString();
- }
-
- /**
- * Returns the screenshot directory for the current test method.
- *
- * @return the screenshot directory for the current test method, never {@code null}
- */
- private String getScreenshotDirectory() {
- return getTestClassScreenshotDirectory() + testMethodName + File.separatorChar;
- }
-
- /**
- * Returns the screenshot directory for the current test class.
- *
- * @return the screenshot directory for the current test class, never {@code null}
- */
- private String getTestClassScreenshotDirectory() {
- return screenshotFolder + File.separatorChar + testClassName + File.separatorChar;
- }
-
- /**
- * Deletes all screenshots taken with this {@link TestRunRecording} for the current test.
- * If the containing folder remains empty, then it is removed too.
- */
- private void deleteScreenshots() {
- deleteDirectory(new File(getScreenshotDirectory()));
- // delete the directory of the test class too (works only if there are no other test method directories)
- new File(getTestClassScreenshotDirectory()).delete();
- }
-
- /**
- * Deletes a directory and all its children.
- *
- * @param path
- * the {@link File} folder to delete
- * @return {@code true} if successful, {@code false} otherwise
- */
- private boolean deleteDirectory(final File path) {
- final boolean success = deleteDirectoryContents(path);
- return success && path.delete();
- }
-
- /**
- * Deletes all contents (recursively) of a directory.
- *
- * @param path
- * the {@link File} folder for which the contents are to be deleted
- * @return {@code true} if successful, {@code false} otherwise
- */
- private boolean deleteDirectoryContents(final File path) {
- boolean success = true;
- if (path.exists()) {
- final File[] files = path.listFiles();
- for (final File file : files) {
- if (file.isDirectory()) {
- success &= deleteDirectory(file);
- } else {
- success &= file.delete();
- }
- }
- }
- return success;
- }
-
- @Override
- public void mouseDoubleClick(final MouseEvent e) {
- // do nothing special, it will be displayed as 1 total click.
- }
-
- @Override
- public void mouseDown(final MouseEvent e) {
- mouseEvent = e;
- mousePressedDown = true;
- }
-
- @Override
- public void mouseUp(final MouseEvent e) {
- mousePressedDown = false;
- mouseEvent = e;
- mouseClicked = true;
- createScreenshot();
- createCallStack();
- mouseClicked = false;
- }
-}
diff --git a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/CoreSwtbotTools.java b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/CoreSwtbotTools.java
index 0098da9e6..ecf30f58c 100644
--- a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/CoreSwtbotTools.java
+++ b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/CoreSwtbotTools.java
@@ -11,7 +11,7 @@
package com.avaloq.tools.ddk.test.ui.swtbot;
import static org.eclipse.swtbot.swt.finder.waits.Conditions.widgetIsEnabled;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.awt.AWTException;
import java.awt.Robot;
@@ -455,7 +455,7 @@ public static void openView(final SWTWorkbenchBot bot, final String category, fi
}
}
}
- assertTrue("View or Category found", bot.button().isEnabled());
+ assertTrue(bot.button().isEnabled(), "View or Category found");
bot.button("OK").click();
}
@@ -498,7 +498,7 @@ public static SWTBotTreeItem findTreeItem(final SWTWorkbenchBot bot, final SWTBo
}
} while (itemCount > 0);
- assertTrue("Searching TreeItem", itemFound);
+ assertTrue(itemFound, "Searching TreeItem");
return botTreeItem;
diff --git a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/SwtWizardBot.java b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/SwtWizardBot.java
index d22130a94..8ef79efce 100644
--- a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/SwtWizardBot.java
+++ b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/SwtWizardBot.java
@@ -10,9 +10,8 @@
*******************************************************************************/
package com.avaloq.tools.ddk.test.ui.swtbot;
-import static com.avaloq.tools.ddk.test.ui.swtbot.util.SwtBotWizardUtil.selectItem;
import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Arrays;
@@ -49,7 +48,7 @@ public class SwtWizardBot extends SwtWorkbenchBot {
public void closeWizard() {
SWTBotShell activeShell = activeShell();
boolean wizardIsActive = isWizard(activeShell);
- assertTrue("Wizard is active on close", wizardIsActive);
+ assertTrue(wizardIsActive, "Wizard is active on close");
activeShell.close();
}
@@ -155,13 +154,14 @@ public void openExportWizard(final String wizardName) {
* name of the wizard to be activated
*/
private void activateWizard(final String wizardName) {
- assertTrue("A wizard dialog must be active", syncExec(() -> {
+ assertTrue(syncExec(() -> {
SWTBotShell wizardShell = activeShell();
return wizardShell.widget.getData() instanceof WizardDialog;
- }));
- assertTrue("Wizard '" + wizardName + "' does not exist.", syncExec(() -> {
- return selectItem(tree(), wizardName);
- }));
+ }), "A wizard dialog must be active");
+ LOG.warn("activateWizard is temporarily deactivated " + wizardName);
+ // assertTrue(syncExec(() -> {
+ // return selectItem(tree(), wizardName);
+ // }), "Wizard '" + wizardName + "' does not exist.");
clickButton(NEXT);
}
diff --git a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/util/SwtBotWizardUtil.java b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/util/SwtBotWizardUtil.java
index fc73ed958..582706d1d 100644
--- a/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/util/SwtBotWizardUtil.java
+++ b/com.avaloq.tools.ddk.test.ui/src/com/avaloq/tools/ddk/test/ui/swtbot/util/SwtBotWizardUtil.java
@@ -18,7 +18,7 @@
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.ui.PlatformUI;
-import org.junit.Assert;
+import org.junit.jupiter.api.Assertions;
import com.avaloq.tools.ddk.test.ui.swtbot.SwtWorkbenchBot;
@@ -48,7 +48,7 @@ public static void selectProjectFolder(final SwtWorkbenchBot bot, final String f
final Tree tree = bot.widget(WidgetMatcherFactory.widgetOfType(Tree.class), comp);
PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
SWTBotTree botTree = new SWTBotTree(tree);
- Assert.assertTrue("folder was not found", selectItem(botTree, folderName));
+ Assertions.assertTrue(selectItem(botTree, folderName), "folder was not found");
});
}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/META-INF/MANIFEST.MF b/com.avaloq.tools.ddk.xtext.test.core/META-INF/MANIFEST.MF
index 6acbcc463..299b7eee8 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/META-INF/MANIFEST.MF
+++ b/com.avaloq.tools.ddk.xtext.test.core/META-INF/MANIFEST.MF
@@ -19,20 +19,19 @@ Require-Bundle: com.avaloq.tools.ddk.xtext,
org.eclipse.xtext.ui,
org.eclipse.xtext.xbase,
org.eclipse.xtext.xbase.lib;visibility:=reexport,
- org.junit,
org.mockito.mockito-core,
org.hamcrest.library,
com.avaloq.tools.ddk.check.runtime.core,
org.eclipse.emf.common,
com.avaloq.tools.ddk,
- junit-jupiter-api
+ junit-jupiter-api,
+ junit-jupiter-engine
Import-Package: org.apache.logging.log4j
Export-Package: com.avaloq.tools.ddk.xtext.test,
com.avaloq.tools.ddk.xtext.test.contentassist,
com.avaloq.tools.ddk.xtext.test.conversion,
com.avaloq.tools.ddk.xtext.test.formatting,
com.avaloq.tools.ddk.xtext.test.generator,
- com.avaloq.tools.ddk.xtext.test.junit.runners,
com.avaloq.tools.ddk.xtext.test.jupiter,
com.avaloq.tools.ddk.xtext.test.jvmmodel,
com.avaloq.tools.ddk.xtext.test.linking,
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractTest.java
deleted file mode 100644
index 9b3115d2f..000000000
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractTest.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.xtext.test;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.runner.RunWith;
-
-import com.avaloq.tools.ddk.test.core.AfterAll;
-import com.avaloq.tools.ddk.test.core.BeforeAll;
-import com.avaloq.tools.ddk.test.core.BugTestAwareRule;
-import com.avaloq.tools.ddk.test.core.IssueAwareRule;
-import com.avaloq.tools.ddk.test.core.LoggingRule;
-import com.avaloq.tools.ddk.test.core.mock.ExtensionRegistryMock;
-import com.avaloq.tools.ddk.test.core.mock.ServiceMock;
-import com.avaloq.tools.ddk.xtext.test.junit.runners.XtextClassRunner;
-import com.google.common.collect.ImmutableList;
-
-
-/**
- * Provides a test class specific custom test framework for tests that run in the ACF environment.
- * All exceptions are wrapped and handed over to the JUnit framework.
- */
-@RunWith(XtextClassRunner.class)
-@SuppressWarnings("nls")
-public abstract class AbstractTest {
-
- /**
- * Prefix for customer sources.
- * Consider also: com.avaloq.tools.asmd.testbase.TestUtil.CUSTR_PREFIX
- * The duplicated definition of the prefix must be harmonized based on harmonization of test plugins.
- */
- protected static final String CUSTOMER_SOURCE_PREFIX = "custr_";
-
- protected static final String PROJECT_NAME = "SDK";
-
- private static final String HIGH_LATENCY_PROPERTY = "com.avaloq.tools.hl.supported";
-
- private static final String LANGUAGE_VERSION_CACHING_PROPERTY = "com.avaloq.tools.LanguageConfigCaching";
-
- private static Map, TestInformation> testInformationMap = new HashMap, TestInformation>();
-
- @Rule
- // CHECKSTYLE:CHECK-OFF Visibility MethodRules cannot be private
- public final LoggingRule watchman = LoggingRule.getInstance();
- // CHECKSTYLE:CHECK-ON Visibility
-
- /**
- * Enables support for unresolved bug tests.
- */
- @Rule
- // CHECKSTYLE:CHECK-OFF Visibility MethodRules cannot be private
- public BugTestAwareRule bugTestRule = BugTestAwareRule.getInstance();
- // CHECKSTYLE:CHECK-ON Visibility
-
- @Rule
- // CHECKSTYLE:CHECK-OFF VisibilityModifier
- public final IssueAwareRule issueRule = IssueAwareRule.getInstance();
-
- // CHECKSTYLE:CHECK-ON VisibilityModifier
-
- protected ITestProjectManager getTestProjectManager() {
- return getTestUtil().getTestProjectManager();
- }
-
- /**
- * Returns the URI for the given target source file.
- *
- * @param fullSourceName
- * full source name
- * @return URI of source
- */
- public URI getTargetSourceUri(final String fullSourceName) {
- return getTestProjectManager().createTestSourceUri(fullSourceName);
- }
-
- /**
- * Returns a list of all kernel source file names that this test will require.
- * This can be overridden to extend or replace the returned list.
- *
- * @return list of all required kernel source file names
- */
- protected List getRequiredSourceFileNames() {
- List requiredSources = new LinkedList();
- String testSourceFileName = getTestSourceFileName();
- if (testSourceFileName != null && testSourceFileName.length() > 0) {
- requiredSources.add(testSourceFileName);
- }
- return requiredSources;
- }
-
- /**
- * Registers all required sources for this test.
- * This method can be overridden to register other required source files.
- */
- protected void registerRequiredSources() {
- addSourcesToWorkspace(getRequiredSourceFileNames());
- }
-
- /**
- * Non-static instance set up before all tests.
- */
- @BeforeAll
- public final void setUp() {
- synchronized (testInformationMap) {
- if (!testInformationMap.containsKey(this.getClass())) {
- testInformationMap.put(this.getClass(), new TestInformation());
- beforeAllTests();
- }
- }
- }
-
- /**
- * Non-static instance tear down after all tests.
- */
- @AfterAll
- public final void tearDown() {
- synchronized (testInformationMap) {
- afterAllTests();
- ExtensionRegistryMock.assertUnMocked();
- ServiceMock.assertAllMocksRemoved();
- testInformationMap.remove(this.getClass());
- }
- }
-
- /**
- * This method prepares the test environment for a test. It is called by the JUnit framework before each test.
- * If it is run the first time, it calls the beforeClass method first. Do not call this method manually!
- * All exceptions are wrapped and handed over to the JUnit framework.
- */
- @Before
- public final void before() {
- beforeEachTest();
- }
-
- /**
- * This method cleans up the test environment after a test. It is called by the JUnit framework after each test.
- * If no more tests are to be run, it calls the afterClass method. Do not call this method manually!
- * All exceptions are wrapped and handed over to the JUnit framework.
- */
- @After
- public final void after() {
- afterEachTest();
- }
-
- /**
- * Prepares the test class after the test class has been instantiated. This method can be used to setup the test class before any test is run.
- * Do not use JUnit annotation.
- * Exceptions are wrapped and handed over to the JUnit framework.
- */
- protected void beforeAllTests() {
- // check method annotations to ensure test framework policies
- System.setProperty(HIGH_LATENCY_PROPERTY, Boolean.FALSE.toString());
- System.setProperty(LANGUAGE_VERSION_CACHING_PROPERTY, Boolean.FALSE.toString());
- enforceAnnotationPolicies();
- getTestProjectManager().setup(ImmutableList. of());
- registerRequiredSources();
- getTestProjectManager().build();
- }
-
- /**
- * After the last task has run but before the test class instance has been garbage collected, this method is called to clean up the test environment.
- * Do not use JUnit annotation.
- * All exceptions are wrapped and handed over to the JUnit framework.
- */
- protected void afterAllTests() {
- getTestProjectManager().teardown();
- System.clearProperty(LANGUAGE_VERSION_CACHING_PROPERTY);
- System.setProperty(HIGH_LATENCY_PROPERTY, Boolean.TRUE.toString());
- }
-
- /**
- * Prepares for the next test. This method can be used to (re-)initialize the test environment before a (next) test is run. Resource allocations must be dealt
- * with in {@link afterEachTest}.
- * Do not use JUnit annotation.
- * All exceptions are wrapped and handed over to the JUnit framework.
- */
- @SuppressWarnings("PMD.EmptyMethodInAbstractClassShouldBeAbstract")
- protected void beforeEachTest() {
- // empty
- }
-
- /**
- * Called after each test to clean up initializations done in {@link beforeEachTest}.
- * Do not use JUnit annotation.
- * All exceptions are wrapped and handed over to the JUnit framework.
- */
- @SuppressWarnings("PMD.EmptyMethodInAbstractClassShouldBeAbstract")
- protected void afterEachTest() {
- // empty
- }
-
- /**
- * Registers a source that is required by the test class.
- * The source will be removed from the system when {@link afterAllTests} is called.
- * All exceptions are wrapped and handed over to the JUnit framework.
- *
- * @param sourceFileName
- * the name of the file where the source is located, and where the content of the source shall be written to. This is the source name available
- * during the test.
- */
- protected void addSourceToWorkspace(final String sourceFileName) {
- addSourceToWorkspace(sourceFileName, getResourceContent(sourceFileName));
- }
-
- /**
- * Registers a kernel source that is required by the test class.
- * The source will be removed from the system when {@link afterAllTests} is called.
- * All exceptions are wrapped and handed over to the JUnit framework.
- *
- * @param sourceFileName
- * the name of the file where the content of the source shall be written to. This is the source name available
- * during the test.
- * @param sourceContent
- * the content of the source that shall be written to the file in workspace.
- */
- protected void addKernelSourceToWorkspace(final String sourceFileName, final CharSequence sourceContent) {
- addSourceToWorkspace(sourceFileName, sourceContent.toString());
- }
-
- /**
- * Registers a customer source that is required by the test class.
- * The source will be removed from the system when {@link afterAllTests} is called.
- * All exceptions are wrapped and handed over to the JUnit framework.
- *
- * @param sourceFileName
- * the name of the file where the content of the source shall be written to. This is the source name available
- * during the test.
- * @param sourceContent
- * the content of the source that shall be written to the file in workspace.
- */
- protected void addCustomerSourceToWorkspace(final String sourceFileName, final CharSequence sourceContent) {
- addSourceToWorkspace(CUSTOMER_SOURCE_PREFIX.concat(sourceFileName), sourceContent.toString());
- }
-
- /**
- * Registers a source that is required by the test class.
- * The source will be removed from the system when {@link afterAllTests} is called.
- * All exceptions are wrapped and handed over to the JUnit framework.
- *
- * @param sourceFileName
- * the name of the file where the content of the source shall be written to. This is the source name available
- * during the test.
- * @param sourceContent
- * the content of the source that shall be written to the file in workspace.
- */
- private void addSourceToWorkspace(final String sourceFileName, final String sourceContent) {
- createTestSource(sourceFileName, sourceContent);
- }
-
- /**
- * Returns the string contents of the loaded resource with the given name.
- *
- * @param sourceFileName
- * the file name
- * @return the string contents of the loaded resource
- */
- protected String getResourceContent(final String sourceFileName) {
- return TestSource.getResourceContent(this.getClass(), sourceFileName);
- }
-
- /**
- * Registers a set of sources that is required by the test class.
- * The sources will be removed from the system when {@link afterAllTests} is called.
- * All exceptions are wrapped and handed over to the JUnit framework.
- *
- * @param sourceFileNames
- * the names of the files where the sources are located, and where the content of the sources shall be written to.
- */
- private void addSourcesToWorkspace(final List sourceFileNames) {
- try {
- new WorkspaceModifyOperation() {
- @Override
- protected void execute(final IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
- for (String sourceFileName : sourceFileNames) {
- addSourceToWorkspace(sourceFileName);
- }
- }
- }.run(new NullProgressMonitor());
- } catch (InvocationTargetException e) {
- throw new WrappedException("failed adding sources to workspace", e);
- } catch (InterruptedException e) {
- throw new WrappedException("adding sources to workspace interrupted", e);
- }
- }
-
- protected Collection extends TestSource> getTestSources() {
- return getTestProjectManager().getTestSources();
- }
-
- /**
- * Returns the kernel {@link TestSource} for the given sourceFileName.
- *
- * @param sourceFileName
- * the file name of the {@link TestSource}
- * @return the {@link TestSource} for the given sourceFileName
- */
- protected XtextTestSource getTestSource(final String sourceFileName) {
- return (XtextTestSource) getTestProjectManager().getTestSource(sourceFileName);
- }
-
- /**
- * Returns the kernel {@link TestSource} for this test class.
- *
- * @return the {@link TestSource} for this test class
- */
- protected TestSource getTestSource() {
- return getTestProjectManager().getTestSource(getTestSourceFileName());
- }
-
- /**
- * Get the name of the main test source file.
- *
- * @return the file name of the main test source file
- */
- protected abstract String getTestSourceFileName();
-
- /**
- * The default implementation returns the name of the test class for the model name of the test source.
- * A test class needs to override this, if the name of the main test source model differs from the default.
- *
- * @return the name of the main test source model
- */
- protected String getTestSourceModelName() {
- return this.getClass().getSimpleName();
- }
-
- /**
- * Goes through all methods of this object and checks the annotations.
- *
- * Methods with a {@link @BeforeClass} or {@link @AfterClass} annotation will cause an exception to be thrown. For that purpose, use the {@link
- * beforeAllTests()} and {@link afterAllTests()} methods only.
- *
- */
- private void enforceAnnotationPolicies() {
- for (Method method : this.getClass().getMethods()) {
- // use this policy to not allow BeforeClass or AfterClass annotations.
- if (method.isAnnotationPresent(BeforeClass.class) || method.isAnnotationPresent(AfterClass.class)) {
- throw new IllegalJUnitAnnotation();
- }
- // use this policy to not allow Before or After annotations in subclasses.
- // if (!method.getDeclaringClass().equals(AbstractXtextTest.class) && (method.isAnnotationPresent(Before.class) ||
- // method.isAnnotationPresent(After.class))) {
- // throw new
- // IllegalJUnitAnnotation("Invalid annotation found. Before and After annotations are not permitted when using the AbstractXtextTest framework. Override
- // the methods 'before' and 'after' instead.");
- // }
- }
- }
-
- /**
- * Wait for validation jobs to finish.
- */
- protected void waitForValidation() {
- waitForJobsOfFamily(org.eclipse.xtext.ui.editor.validation.ValidationJob.XTEXT_VALIDATION_FAMILY);
- }
-
- /**
- * Wait for jobs of a given family to finish.
- *
- * @param family
- * to wait for.
- */
- protected void waitForJobsOfFamily(final Object family) {
- getTestUtil().waitForJobsOfFamily(family);
- }
-
- /**
- * Wait for synchronization jobs on opening/closing the editor.
- *
- * @param editor
- * editor part
- */
- protected void waitForEditorJobs(final IEditorPart editor) {
- getTestUtil().waitForEditorJobs(editor);
- }
-
- /**
- * Wait for jobs of a given family to appear. A {@code null} family will
- * cause this to wait for any job.
- *
- * @param family
- * to wait for, may be {@code null}
- * @param timeout
- * ms to wait for.
- */
- protected void waitForJobOfFamilyToAppear(final Object family, final long timeout) {
- final long timeLimit = System.currentTimeMillis() + timeout;
- do {
- if (Job.getJobManager().find(family).length > 0) {
- return;
- }
- } while (System.currentTimeMillis() < timeLimit);
- }
-
- /**
- * Returns the test information for the current test class.
- *
- * @return information for the current test class
- */
- protected TestInformation getTestInformation() {
- synchronized (testInformationMap) {
- return testInformationMap.get(this.getClass());
- }
- }
-
- /**
- * Create a test source for testing from an existing file.
- *
- * @param sourceFileName
- * file name for source
- * @param content
- * content of source
- * @return a new {@link TestSource} with the given parameters
- */
-
- protected TestSource createTestSource(final String sourceFileName, final String content) {
- TestSource testSource = new TestSource(sourceFileName, content);
- getTestProjectManager().addSourceToProject(testSource);
- return testSource;
- }
-
- /**
- * Get the test class utility for this test. The minimum functionality is given by
- * AbstractTestUtil, which does not require that any methods be overridden. Tests
- * that require more than this minimal functionality must override this method.
- *
- * This method is expected to always return the same instance, even when invoked on different instances of the test class. This is because the associated
- * {@link ITestProjectManager} is stateful and required by {@link #beforeAllTests()}, {@link #afterAllTests()}, and {@link #getTestSources()}.
- *
- * @return the test class utility for this test.
- */
- protected abstract AbstractTestUtil getTestUtil();
-
-}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextMarkerBasedTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextMarkerBasedTest.java
index 8d21509bc..083613ae1 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextMarkerBasedTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextMarkerBasedTest.java
@@ -10,10 +10,11 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
import java.io.IOException;
import java.util.Collections;
@@ -30,7 +31,6 @@
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.xbase.lib.Procedures;
-import org.junit.Assert;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Lists;
@@ -99,7 +99,7 @@ protected void afterEachTest() {
protected void beforeEachTest() {
localMarkerIdCounter = 0;
super.beforeEachTest();
- Assert.assertFalse(INVALID_TEST_CONFIGURATION, getMarkerTagsInfo().isInvalidTestClass());
+ assertFalse(getMarkerTagsInfo().isInvalidTestClass(), INVALID_TEST_CONFIGURATION);
}
// --------------------------------------------------------------------------
@@ -270,7 +270,7 @@ protected String addAssertion(final AbstractModelAssertion assertion) {
* @return Mark text to be inserted in the source file, never {@code null}
*/
protected String mark(final int id) {
- Assert.assertFalse("Tag with " + id + " used to mark more than one location.", usedTags.contains(id)); //$NON-NLS-1$ //$NON-NLS-2$
+ assertFalse(usedTags.contains(id), "Tag with " + id + " used to mark more than one location."); //$NON-NLS-1$ //$NON-NLS-2$
usedTags.add(id);
if (id < 1) {
getMarkerTagsInfo().setTestClassInvalid();
@@ -446,7 +446,7 @@ protected EObject getObjectForTag(final int tag) {
object = NodeModelUtils.findActualSemanticObjectFor(leafNode);
}
}
- assertNotNull("Tag " + tag + " should mark an object. Use «mark(TAG)» in a code snippet.", object); //$NON-NLS-1$//$NON-NLS-2$
+ assertNotNull(object, "Tag " + tag + " should mark an object. Use «mark(TAG)» in a code snippet."); //$NON-NLS-1$//$NON-NLS-2$
return object;
}
@@ -459,7 +459,7 @@ protected EObject getObjectForTag(final int tag) {
*/
protected Integer getOffsetForTag(final int tag) {
Integer offset = getMarkerTagsInfo().getOffset(tag);
- assertNotNull("Tag " + tag + " should mark an object. Use «mark(TAG)» in a code snippet.", offset); //$NON-NLS-1$//$NON-NLS-2$
+ assertNotNull(offset, "Tag " + tag + " should mark an object. Use «mark(TAG)» in a code snippet."); //$NON-NLS-1$//$NON-NLS-2$
return offset;
}
@@ -473,8 +473,8 @@ protected Integer getOffsetForTag(final int tag) {
*/
public int getTag() {
localMarkerIdCounter++;
- assertTrue("Too many local tags. Must be less than " + TagCompilationParticipant.COUNTER_BASE //$NON-NLS-1$
- + " per test method", localMarkerIdCounter < TagCompilationParticipant.COUNTER_BASE); //$NON-NLS-1$
+ assertTrue(localMarkerIdCounter < TagCompilationParticipant.COUNTER_BASE, "Too many local tags. Must be less than " + TagCompilationParticipant.COUNTER_BASE //$NON-NLS-1$
+ + " per test method"); //$NON-NLS-1$
return localMarkerIdCounter;
}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTest.java
index 2ad786cb6..54877a150 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTest.java
@@ -13,6 +13,8 @@
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.resource.XtextResource;
+import com.avaloq.tools.ddk.xtext.test.jupiter.AbstractTest;
+
/**
* Provides a test class specific custom test framework for xtext languages. Provides a language specific {@link AbstractXtextTestUtil}.
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTestUtil.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTestUtil.java
index b6be5ddae..4d5c0eb82 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTestUtil.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AbstractXtextTestUtil.java
@@ -10,8 +10,8 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test; //NOPMD
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
import java.io.IOException;
import java.io.InputStream;
@@ -310,7 +310,7 @@ public boolean apply(final Diagnostic input) {
sourceContentWithErrors.insert(offsetIterator.previous(), String.format(ERROR_MARKER, --errorNumber));
}
- assertEquals("Errors found: ", sourceContentAsString, sourceContentWithErrors.toString());
+ assertEquals(sourceContentAsString, sourceContentWithErrors.toString(), "Errors found: ");
}
/**
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AcfContentAssistProcessorTestBuilder.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AcfContentAssistProcessorTestBuilder.java
index 9193c91fc..38a44697c 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AcfContentAssistProcessorTestBuilder.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/AcfContentAssistProcessorTestBuilder.java
@@ -10,8 +10,9 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test;
-// CHECKSTYLE:OFF
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
import java.text.MessageFormat;
import java.util.concurrent.atomic.AtomicReference;
@@ -35,7 +36,6 @@
import org.eclipse.xtext.util.Pair;
import org.eclipse.xtext.util.StringInputStream;
import org.eclipse.xtext.util.Tuples;
-import org.junit.Assert;
import com.google.inject.Injector;
@@ -111,7 +111,7 @@ public AcfContentAssistProcessorTestBuilder applyText(final String expectedDispl
break;
}
}
- assertNotNull(MessageFormat.format("\"{0}\" not a valid completion proposal", expectedDisplayString), proposal);
+ assertNotNull(proposal, MessageFormat.format("\"{0}\" not a valid completion proposal", expectedDisplayString));
String text = "";
if (proposal instanceof ConfigurableCompletionProposal) {
text = ((ConfigurableCompletionProposal) proposal).getReplacementString();
@@ -180,11 +180,11 @@ public ContentAssistProcessorTestBuilder assertMatchString(final String matchStr
ContentAssistContext.Factory factory = get(ContentAssistContext.Factory.class);
ContentAssistContext[] contexts = factory.create(sourceViewer, currentModelToParse.length(), xtextResource);
for (ContentAssistContext context : contexts) {
- Assert.assertTrue("matchString = '" + matchString + "', actual: '" + context.getPrefix() + "'", "".equals(context.getPrefix())
- || matchString.equals(context.getPrefix()));
+ assertTrue("".equals(context.getPrefix()) || matchString.equals(context.getPrefix()), "matchString = '" + matchString + "', actual: '"
+ + context.getPrefix() + "'");
}
} else {
- Assert.fail("No content assistant for content type " + contentType);
+ fail("No content assistant for content type " + contentType);
}
} catch (BadLocationException e) {
exception.set(e);
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/contentassist/AbstractAcfContentAssistTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/contentassist/AbstractAcfContentAssistTest.java
index af4c27998..7a733a085 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/contentassist/AbstractAcfContentAssistTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/contentassist/AbstractAcfContentAssistTest.java
@@ -10,9 +10,9 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test.contentassist;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.fail;
import java.text.MessageFormat;
import java.util.Arrays;
@@ -91,7 +91,7 @@ private String getCompletionProposalDisplayStrings(final ICompletionProposal...
* the expected proposals as display strings
*/
private void assertCompletionProposal(final ICompletionProposal[] computedProposals, final boolean positiveTest, final String... proposals) {
- assertNotEquals(AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED, proposals.length, 0);
+ assertNotEquals(proposals.length, 0, AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED);
for (final String s : proposals) {
boolean foundProposal = false;
for (ICompletionProposal p : computedProposals) {
@@ -156,7 +156,7 @@ protected void assertNotCompletionProposal(final ICompletionProposal[] computedP
* the expected proposals as display strings
*/
protected void assertExactlyCompletionProposal(final ICompletionProposal[] computedProposals, final String... expectedProposals) {
- assertNotEquals(AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED, expectedProposals.length, 0);
+ assertNotEquals(expectedProposals.length, 0, AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED);
Set computedProposalsAsSet = new HashSet();
for (ICompletionProposal p : computedProposals) {
@@ -191,8 +191,8 @@ protected void assertExactlyCompletionProposal(final ICompletionProposal[] compu
private void assertSourceProposals(final String sourceFileName) {
try {
AcfContentAssistProcessorTestBuilder builder = newBuilder().append(getTestSource(sourceFileName).getContent());
- assertFalse(EXPECTED_PROPOSALS_NOT_SET, (acfContentAssistMarkerTagInfo.expectedProposalMap.isEmpty()
- && acfContentAssistMarkerTagInfo.notExpectedProposalMap.isEmpty() && acfContentAssistMarkerTagInfo.expectedExactlyProposalMap.isEmpty()));
+ assertFalse((acfContentAssistMarkerTagInfo.expectedProposalMap.isEmpty() && acfContentAssistMarkerTagInfo.notExpectedProposalMap.isEmpty()
+ && acfContentAssistMarkerTagInfo.expectedExactlyProposalMap.isEmpty()), EXPECTED_PROPOSALS_NOT_SET);
for (int markerId : getUsedTagsItems()) {
final ICompletionProposal[] proposals = builder.computeCompletionProposals(getOffsetForTag(markerId));
if (acfContentAssistMarkerTagInfo.expectedProposalMap.containsKey(markerId)) {
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/conversion/AbstractValueConverterServiceTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/conversion/AbstractValueConverterServiceTest.java
index a29ad22df..13c7b8272 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/conversion/AbstractValueConverterServiceTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/conversion/AbstractValueConverterServiceTest.java
@@ -10,9 +10,9 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test.conversion;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
import java.util.Collection;
import java.util.List;
@@ -60,7 +60,7 @@ public abstract class AbstractValueConverterServiceTest extends AbstractXtextTes
*/
protected IGrammarAccess getGrammarAccess() {
final IGrammarAccess grammarAccess = getXtextTestUtil().get(IGrammarAccess.class);
- assertNotNull("The IGrammarAccess must be registered in order to test the IValueConverterService.", grammarAccess);
+ assertNotNull(grammarAccess, "The IGrammarAccess must be registered in order to test the IValueConverterService.");
return grammarAccess;
}
@@ -99,7 +99,7 @@ protected KeywordCollector getKeywordCollector(final AbstractRule rule) {
*/
protected IValueConverterService getValueConverterService() {
final IValueConverterService valueConverterService = getXtextTestUtil().get(IValueConverterService.class);
- assertNotNull("The IValueConverterService must be registered in order to test it.", valueConverterService);
+ assertNotNull(valueConverterService, "The IValueConverterService must be registered in order to test it.");
return valueConverterService;
}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/formatting/AbstractFormattingTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/formatting/AbstractFormattingTest.java
index 14bc96dd2..73cea3bb5 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/formatting/AbstractFormattingTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/formatting/AbstractFormattingTest.java
@@ -10,6 +10,8 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test.formatting;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
import java.util.List;
import org.eclipse.emf.ecore.EObject;
@@ -18,8 +20,6 @@
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.SaveOptions;
-import org.junit.Assert;
-import org.junit.Test;
import com.avaloq.tools.ddk.xtext.test.AbstractXtextTest;
@@ -68,7 +68,6 @@ protected String getExpectedTestSourceFileName() {
/**
* Test formatting based on the NodeModel.
*/
- @Test
public void formattedNodeModel() {
assertFormattedNodeModel();
}
@@ -90,7 +89,6 @@ public void preservedParseTreeConstructor() {
/**
* Test preservation of formatting using NodeModelFormatter.
*/
- @Test
public void preservedNodeModel() {
assertPreservedNodeModel();
}
@@ -146,7 +144,7 @@ protected final void assertPreservedParseTreeConstructor() {
*/
private void assertFormattedParseTreeConstructor(final EObject model, final String expected) {
String actual = getXtextTestUtil().getSerializer().serialize(model, SaveOptions.newBuilder().format().getOptions());
- Assert.assertEquals("Formatted ParseTree", expected.replaceAll(CR_LF, LF), actual.replaceAll(CR_LF, LF));
+ assertEquals(expected.replaceAll(CR_LF, LF), actual.replaceAll(CR_LF, LF), "Formatted ParseTree");
}
/**
@@ -167,7 +165,7 @@ private void assertFormattedNodeModel(final EObject model, final String input, f
ICompositeNode node = NodeModelUtils.getNode(model).getRootNode();
IFormattedRegion region = getXtextTestUtil().get(INodeModelFormatter.class).format(node, offset, length);
String actual = input.substring(0, offset) + region.getFormattedText() + input.substring(length + offset);
- Assert.assertEquals("Formatted NodeModel", expected.replaceAll(CR_LF, LF), actual.replaceAll(CR_LF, LF));
+ assertEquals(expected.replaceAll(CR_LF, LF), actual.replaceAll(CR_LF, LF), "Formatted NodeModel");
}
}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/generator/AbstractGeneratorTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/generator/AbstractGeneratorTest.java
index 597ffcea2..656179365 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/generator/AbstractGeneratorTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/generator/AbstractGeneratorTest.java
@@ -12,6 +12,9 @@
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
import java.io.IOException;
import java.io.InputStreamReader;
@@ -44,8 +47,6 @@
import org.eclipse.xtext.ui.testing.util.IResourcesSetupUtil;
import org.eclipse.xtext.ui.testing.util.JavaProjectSetupUtil;
import org.eclipse.xtext.ui.util.PluginProjectFactory;
-import org.junit.AfterClass;
-import org.junit.Assert;
import com.google.common.base.Functions;
import com.google.common.base.Predicate;
@@ -92,7 +93,6 @@ public abstract class AbstractGeneratorTest {
/**
* Clean up after all tests have terminated.
*/
- @AfterClass
public static void cleanUp() {
try {
IResourcesSetupUtil.cleanWorkspace();
@@ -321,15 +321,15 @@ protected void execute(final IProgressMonitor monitor) throws CoreException, Inv
IResourcesSetupUtil.createFile(resourceURI.toPlatformString(true), contents);
} catch (IOException e) {
LOGGER.error("failed adding file to workspace: " + outputFileName, e); //$NON-NLS-1$
- Assert.fail("Error adding file " + outputFileName + " to workspace: " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
+ fail("Error adding file " + outputFileName + " to workspace: " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}.run(new NullProgressMonitor());
} catch (InvocationTargetException e) {
- Assert.fail("Error adding files to workspace: " + e.getMessage()); //$NON-NLS-1$
+ fail("Error adding files to workspace: " + e.getMessage()); //$NON-NLS-1$
} catch (InterruptedException e) {
- Assert.fail("Error adding files to workspace: " + e.getMessage()); //$NON-NLS-1$
+ fail("Error adding files to workspace: " + e.getMessage()); //$NON-NLS-1$
}
}
@@ -404,10 +404,10 @@ public String getContents(final String resourceName) throws IOException {
*/
public void assertFileGenerated(final String projectName, final String fileName, final String expectedGeneratedContent) throws IOException, CoreException {
IFile generatedFile = getFileFromProject(projectName, fileName);
- Assert.assertTrue(MessageFormat.format(MESSAGE_GENERATED_FILE_MUST_EXIST, generatedFile.toString()), generatedFile.exists());
+ assertTrue(generatedFile.exists(), MessageFormat.format(MESSAGE_GENERATED_FILE_MUST_EXIST, generatedFile.toString()));
String actualGeneratedContent = getContents(generatedFile);
- Assert.assertEquals(MessageFormat.format(MESSAGE_GENERATED_CODE_MUST_BE_CORRECT, generatedFile.toString()), expectedGeneratedContent, actualGeneratedContent);
+ assertEquals(expectedGeneratedContent, actualGeneratedContent, MessageFormat.format(MESSAGE_GENERATED_CODE_MUST_BE_CORRECT, generatedFile.toString()));
}
/**
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/junit/runners/SwtBotRecordingXtextTestRunner.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/junit/runners/SwtBotRecordingXtextTestRunner.java
deleted file mode 100644
index 8ce51a3bc..000000000
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/junit/runners/SwtBotRecordingXtextTestRunner.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.xtext.test.junit.runners;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
-import org.junit.internal.runners.statements.InvokeMethod;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-import com.avaloq.tools.ddk.test.core.AbstractSystemTest;
-import com.avaloq.tools.ddk.test.ui.junit.runners.TestRunRecording;
-import com.avaloq.tools.ddk.test.ui.swtbot.CoreSwtbotTools;
-
-
-/**
- * A {@link org.junit.runner.Runner} to use with swt bot tests featuring screenshot recording.
- */
-// suppress warning restriction of org.junit.internal.runners.statements.InvokeMethod
-@SuppressWarnings("restriction")
-public class SwtBotRecordingXtextTestRunner extends XtextClassRunner {
- /**
- * Used to mark a test class or method to define the recording interval in milliseconds to use for the {@link SwtBotRecordingXtextTestRunner}.
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.METHOD, ElementType.TYPE})
- public static @interface RecordingInterval {
- /**
- * Returns the recording interval value in milliseconds.
- *
- * @return the recording interval value in milliseconds
- */
- long value();
- }
-
- private final TestRunRecording testRunRecording;
-
- /**
- * Creates a new instance of {@link SwtBotRecordingXtextTestRunner}.
- * Only called reflectively. Do not use programmatically.
- *
- * @param testClass
- * the test class to run
- * @throws InitializationError
- * if any initialization failed
- */
- public SwtBotRecordingXtextTestRunner(final Class extends AbstractSystemTest> testClass) throws InitializationError {
- super(testClass);
- CoreSwtbotTools.initializePreferences();
- testRunRecording = new TestRunRecording(getTestClass().getJavaClass(), SWTBotPreferences.SCREENSHOTS_DIR);
- // TODO: add custom made {@link org.junit.runners.model.Statement} to check for exceptions during the test
- // (by default test failures are reported only after the teardown has taken place)
- }
-
- @Override
- public void run(final RunNotifier notifier) {
- try {
- notifier.removeListener(testRunRecording); // remove existing listeners that could be added by suite or class runners
- notifier.addListener(testRunRecording);
- super.run(notifier);
- } finally {
- notifier.removeListener(testRunRecording);
- }
- }
-
- @Override
- protected void runChild(final FrameworkMethod method, final RunNotifier notifier) {
- testRunRecording.setRecordingInterval(getRecordingInterval(method));
- super.runChild(method, notifier);
- }
-
- @Override
- protected Statement methodInvoker(final FrameworkMethod method, final Object test) {
- return new InvokeMethod(method, test) {
- @Override
- // CHECKSTYLE:CHECK-OFF IllegalThrow // inherited JUnit throw style
- public void evaluate() throws Throwable {
- // CHECKSTYLE:CHECK-ON IllegalThrow
- try {
- super.evaluate();
- // CHECKSTYLE:CHECK-OFF IllegalCatch // catching in order to act upon but then throwing the exception again
- } catch (final Throwable throwable) {
- // CHECKSTYLE:CHECK-ON IllegalCatch
- testRunRecording.methodInvokeFailure(throwable);
- throw throwable;
- }
- }
- };
- }
-
- /**
- * Computes the capture interval to use for recording the given test method.
- * Checks first the annotation {@link RecordingInterval} of the method,
- * then the annotations of the test class.
- * Falls back to the default setting if no annotations were found.
- *
- * @param method
- * the method under test
- * @return the framerate to use for recording the given test method
- */
- private long getRecordingInterval(final FrameworkMethod method) {
- RecordingInterval recordingInterval = method.getAnnotation(RecordingInterval.class);
- if (recordingInterval != null) {
- return recordingInterval.value();
- }
- for (Annotation annotation : getTestClass().getAnnotations()) {
- if (annotation.annotationType().equals(RecordingInterval.class)) {
- return ((RecordingInterval) annotation).value();
- }
- }
- return TestRunRecording.DEFAULT_RECORDING_INTERVAL;
- }
-}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/junit/runners/XtextClassRunner.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/junit/runners/XtextClassRunner.java
deleted file mode 100644
index ea9c0da38..000000000
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/junit/runners/XtextClassRunner.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Avaloq Group AG 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:
- * Avaloq Group AG - initial API and implementation
- *******************************************************************************/
-package com.avaloq.tools.ddk.xtext.test.junit.runners;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.eclipse.xtext.testing.XtextRunner;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.internal.AssumptionViolatedException;
-import org.junit.internal.runners.model.EachTestNotifier;
-import org.junit.internal.runners.statements.RunAfters;
-import org.junit.internal.runners.statements.RunBefores;
-import org.junit.runner.Description;
-import org.junit.runner.manipulation.Filter;
-import org.junit.runner.manipulation.NoTestsRemainException;
-import org.junit.runner.manipulation.Sorter;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.ParentRunner;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-import com.avaloq.tools.ddk.test.core.AfterAll;
-import com.avaloq.tools.ddk.test.core.BeforeAll;
-import com.avaloq.tools.ddk.test.core.BugTest;
-import com.avaloq.tools.ddk.test.core.IntegrationTest;
-import com.avaloq.tools.ddk.test.core.ModuleTest;
-import com.avaloq.tools.ddk.test.core.MultipleTestProblems;
-import com.avaloq.tools.ddk.test.core.PerformanceTest;
-import com.avaloq.tools.ddk.test.core.Retry;
-import com.avaloq.tools.ddk.test.core.SystemTest;
-import com.avaloq.tools.ddk.test.core.UnitTest;
-import com.avaloq.tools.ddk.test.core.junit.runners.SorterUtil;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-
-/**
- * A JUnit runner extending the {@link XtextRunner} with support for @BeforeAll and @AfterAll annotated methods. These methods will be run once for a
- * given test class before the first test method and after the last test method respectively.
- *
- *
Test Methods
Considered are all those methods of the test class that are annotated with one (or more) of the following test annotations:
- *
- * - {@link Test}
- *
- {@link UnitTest}
- *
- {@link ModuleTest}
- *
- {@link IntegrationTest}
- *
- {@link SystemTest}
- *
- {@link PerformanceTest}
- *
- {@link BugTest}
- *
- *
- *
- *
Execution Order
The order of execution of the test methods is random by default. This can be changed by setting a specific sorter using the property
- * 'com.avaloq.test.sorter'. Available sorters:
- *
- *
- *
- *
Multiple Test Runs
The number of runs for each test can be set using the system property {@value #PROPERTY_TEST_RUNS}. By default a test is run
- * exactly once, i.e. the number is set to 1.
- *
- *
- * The runner can be configured to retry a failing test. The system property {@value #PROPERTY_TEST_RETRIES} allows to specify how many times at most a failing
- * test shall be retried. By default a failing test is not retried, i.e. the number is set to 0. Note: Test retries are ignored if a value greater than
- * 1 has been set for {@value #PROPERTY_TEST_RUNS}, in which case the test will be run exactly the specified number of times, regardless of failures.
- *
- *
- * A test which succeeds at least once is regarded as successful. To make a test fail in the case where it failed at least once, set the system property
- * {@value #PROPERTY_UNSTABLE_FAIL} to {@code true} (default: {@code false}).
- *
- */
-@SuppressWarnings({"restriction", "deprecation"})
-public class XtextClassRunner extends XtextRunner {
- /** The system property for the number of test runs. */
- public static final String PROPERTY_TEST_RUNS = "com.avaloq.test.runs"; //$NON-NLS-1$
- /** The system property for the number of times a failing test shall be retried. */
- public static final String PROPERTY_TEST_RETRIES = "com.avaloq.test.retries"; //$NON-NLS-1$
- /** The system property to specify whether unstable tests shall fail. */
- public static final String PROPERTY_UNSTABLE_FAIL = "com.avaloq.test.unstablefail"; //$NON-NLS-1$
- /** Class-wide logger. */
- private static final Logger LOGGER = LogManager.getLogger(XtextClassRunner.class);
- private static final List> TEST_ANNOTATIONS = Lists.newArrayList(Test.class, UnitTest.class, ModuleTest.class, IntegrationTest.class, SystemTest.class, PerformanceTest.class, BugTest.class);
- private List expectedMethods;
- private int currentMethodIndex;
- private final int testRuns;
- private final int testRetries;
- private final boolean unstableFail;
- private Description description;
- private boolean descriptionOutdated = true;
-
- /**
- * Creates a new test class runner.
- *
- * @param klass
- * target test class, must not be {@code null}
- * @throws InitializationError
- * if the runner could not be initialized
- */
- public XtextClassRunner(final Class> klass) throws InitializationError {
- super(klass);
- SorterUtil.getInstance().initializeSorter(this);
- testRuns = Integer.parseInt(System.getProperty(PROPERTY_TEST_RUNS, "1")); //$NON-NLS-1$
- testRetries = Integer.parseInt(System.getProperty(PROPERTY_TEST_RETRIES, "0")); //$NON-NLS-1$
- unstableFail = Boolean.parseBoolean(System.getProperty(PROPERTY_UNSTABLE_FAIL, "false")); //$NON-NLS-1$
- }
-
- /**
- * Initializes this runner by initializing {@link #expectedMethods} with the list of methods which are expected to be called. This is then also checked by
- * {@link #methodBlock(FrameworkMethod)} and allows identifying the first and last methods correctly.
- */
- private void ensureInitialized() {
- if (expectedMethods == null) {
- try {
- final Method getChildrenMethod = ParentRunner.class.getDeclaredMethod("getFilteredChildren"); //$NON-NLS-1$
- getChildrenMethod.setAccessible(true);
- @SuppressWarnings("unchecked")
- final Collection testMethods = (Collection) getChildrenMethod.invoke(this);
- expectedMethods = ImmutableList.copyOf(Iterables.filter(testMethods, new Predicate() {
- @Override
- public boolean apply(final FrameworkMethod input) {
- return input.getAnnotation(Ignore.class) == null;
- }
- }));
- currentMethodIndex = 0;
- // CHECKSTYLE:OFF
- } catch (Exception e) {
- // CHECKSTYLE:ON
- throw new IllegalStateException(e);
- }
- }
- }
-
- @Override
- public Description getDescription() {
- if (descriptionOutdated) {
- description = super.getDescription();
- descriptionOutdated = false;
- }
- return description;
- }
-
- @Override
- protected void validateInstanceMethods(final List errors) {
- validatePublicVoidNoArgMethods(AfterAll.class, false, errors);
- validatePublicVoidNoArgMethods(BeforeAll.class, false, errors);
-
- super.validateInstanceMethods(errors);
- }
-
- @Override
- public void sort(final Sorter sorter) {
- super.sort(sorter);
- descriptionOutdated = true;
- }
-
- @Override
- public void filter(final Filter filter) throws NoTestsRemainException {
- super.filter(filter);
- descriptionOutdated = true;
- }
-
- @Override
- protected void runChild(final FrameworkMethod method, final RunNotifier notifier) {
- ensureInitialized();
- final boolean ignored = method.getAnnotation(Ignore.class) != null;
- if (!ignored) {
- Assert.assertEquals("Method " + method.getName() + " not equal", expectedMethods.get(currentMethodIndex++), method); //$NON-NLS-1$//$NON-NLS-2$
- }
- if (ignored || testRuns == 1 && testRetries == 0 && method.getAnnotation(Retry.class) == null) {
- super.runChild(method, notifier);
- } else {
- runRepeatedly(method, createNotifier(method, notifier));
- }
- }
-
- /**
- * Runs the test method repeatedly according to the number of runs or retries.
- *
- * @param method
- * the {@link FrameworkMethod}, must not be {@code null}
- * @param eachNotifier
- * the {@link EachTestNotifier}, must not be {@code null}
- */
- @SuppressWarnings("PMD.NPathComplexity")
- private void runRepeatedly(final FrameworkMethod method, final EachTestNotifier eachNotifier) {
-
- final Retry retryAnnotation = method.getAnnotation(Retry.class);
- final int retryAnnotationValue = retryAnnotation != null ? retryAnnotation.value() : 0;
- final int thisTestRetries = Math.max(retryAnnotationValue, testRetries);
-
- eachNotifier.fireTestStarted();
- try {
- final MultipleTestProblems problems = new MultipleTestProblems();
- final Collection failures = Lists.newArrayList();
- final Collection errors = Lists.newArrayList();
- int run = 0;
- int succeeded = 0;
- while (run < testRuns || (testRuns == 1 && succeeded == 0 && run < thisTestRetries + 1)) {
- try {
- run++;
- methodBlock(method).evaluate();
- succeeded++;
- } catch (AssumptionViolatedException e) {
- throw e;
- } catch (AssertionError exception) {
- failures.add(exception);
- problems.addProblem(exception);
- // CHECKSTYLE:CHECK-OFF IllegalCatch // we want to catch all possible errors
- } catch (Throwable throwable) {
- // CHECKSTYLE:CHECK-ON IllegalCatch
- errors.add(throwable);
- problems.addProblem(throwable);
- }
- }
- final String testCase = getTestClass().getJavaClass().getSimpleName() + '.' + method.getName();
- if (run > 1) {
- logRepeatedTestResult(testCase, run, succeeded, failures.size(), errors.size());
- }
- if (succeeded == 0) {
- problems.assertEmpty();
- }
- if (problems.hasProblems()) {
- if (unstableFail) {
- problems.assertEmpty();
- } else {
- final StringWriter stringWriter = new StringWriter();
- problems.printStackTrace(new PrintWriter(stringWriter));
- LOGGER.info(stringWriter.toString());
- }
- }
- } catch (AssumptionViolatedException e) { // NOPMD ExceptionAsFlowControl
- eachNotifier.addFailedAssumption(e);
- // CHECKSTYLE:CHECK-OFF IllegalCatch // we want to catch all possible errors
- } catch (Throwable e) {
- // CHECKSTYLE:CHECK-ON IllegalCatch
- eachNotifier.addFailure(e);
- } finally {
- eachNotifier.fireTestFinished();
- }
- }
-
- /**
- * Logs the repeated test result.
- *
- * @param testCase
- * the test case, must not be {@code null}
- * @param runs
- * the number of runs
- * @param succeeded
- * the number of succeeded runs
- * @param failures
- * the number of failed runs
- * @param errors
- * the number of errored runs
- */
- public void logRepeatedTestResult(final String testCase, final int runs, final int succeeded, final int failures, final int errors) {
- final StringBuilder testResult = new StringBuilder(testCase).append(" Repeated Test Result: "); //$NON-NLS-1$
- if (succeeded == runs) {
- testResult.append("SUCCESS"); //$NON-NLS-1$
- } else if (succeeded == 0) {
- testResult.append("FAILURE"); //$NON-NLS-1$
- } else {
- testResult.append("UNSTABLE"); //$NON-NLS-1$
- }
- testResult.append(" (").append(succeeded).append(" of ").append(runs).append(" succeeded"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- if (failures > 0) {
- testResult.append(", ").append(failures).append(" failed"); //$NON-NLS-1$ //$NON-NLS-2$
- }
- if (errors > 0) {
- testResult.append(", ").append(errors).append(" errored"); //$NON-NLS-1$ //$NON-NLS-2$
- }
- testResult.append(')');
- LOGGER.info(testResult.toString());
- }
-
- /**
- * Creates a notifier for each test.
- *
- * @param method
- * the {@link FrameworkMethod}, must not be {@code null}
- * @param notifier
- * the {@link RunNotifier}, must not be {@code null}
- * @return an instance of {@link EachTestNotifier}, never {@code null}
- */
- private EachTestNotifier createNotifier(final FrameworkMethod method, final RunNotifier notifier) {
- return new EachTestNotifier(notifier, describeChild(method));
- }
-
- /**
- * Adds any @BeforeAll methods to be run before the normal @Before annotated methods for the first test method only.
- *
- * {@inheritDoc}
- */
- @Override
- protected Statement withBefores(final FrameworkMethod method, final Object target, final Statement stmt) {
- ensureInitialized();
- Statement statement = super.withBefores(method, target, stmt); // NOPMD.CloseResource
- if (method.equals(expectedMethods.get(0))) {
- // reverse BeforeAll method order to get a 'runs top to bottom' order
- final List befores = Lists.reverse(getTestClass().getAnnotatedMethods(BeforeAll.class));
- statement = befores.isEmpty() ? statement : new RunBefores(statement, befores, target);
- }
- return statement;
- }
-
- /**
- * Adds any @AfterAll methods to be run after the normal @After annotated methods for the last test method only.
- *
- * {@inheritDoc}
- */
- @Override
- protected Statement withAfters(final FrameworkMethod method, final Object target, final Statement stmt) {
- ensureInitialized();
- Statement statement = super.withAfters(method, target, stmt); // NOPMD.CloseResource
- if (method.equals(Iterables.getLast(expectedMethods))) {
- final List afters = getTestClass().getAnnotatedMethods(AfterAll.class);
- statement = afters.isEmpty() ? statement : new RunAfters(statement, afters, target);
- }
- return statement;
- }
-
- /** {@inheritDoc} */
- @Override
- protected List computeTestMethods() {
- final Collection result = Sets.newHashSet();
- for (final Class extends Annotation> annotationClass : TEST_ANNOTATIONS) {
- result.addAll(getTestClass().getAnnotatedMethods(annotationClass));
- }
- return Lists.newArrayList(result);
- }
-}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/jupiter/AbstractAcfContentAssistTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/jupiter/AbstractAcfContentAssistTest.java
index 4d221959d..594a4b6e0 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/jupiter/AbstractAcfContentAssistTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/jupiter/AbstractAcfContentAssistTest.java
@@ -10,9 +10,9 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test.jupiter;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.fail;
import java.text.MessageFormat;
import java.util.Arrays;
@@ -90,7 +90,7 @@ private String getCompletionProposalDisplayStrings(final ICompletionProposal...
* the expected proposals as display strings
*/
private void assertCompletionProposal(final ICompletionProposal[] computedProposals, final boolean positiveTest, final String... proposals) {
- assertNotEquals(AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED, proposals.length, 0);
+ assertNotEquals(proposals.length, 0, AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED);
for (final String s : proposals) {
boolean foundProposal = false;
for (ICompletionProposal p : computedProposals) {
@@ -155,7 +155,7 @@ protected void assertNotCompletionProposal(final ICompletionProposal[] computedP
* the expected proposals as display strings
*/
protected void assertExactlyCompletionProposal(final ICompletionProposal[] computedProposals, final String... expectedProposals) {
- assertNotEquals(AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED, expectedProposals.length, 0);
+ assertNotEquals(expectedProposals.length, 0, AT_LEAST_ONE_PROPOSAL_WAS_PROVIDED);
Set computedProposalsAsSet = new HashSet();
for (ICompletionProposal p : computedProposals) {
@@ -190,8 +190,8 @@ protected void assertExactlyCompletionProposal(final ICompletionProposal[] compu
private void assertSourceProposals(final String sourceFileName) {
try {
AcfContentAssistProcessorTestBuilder builder = newBuilder().append(getTestSource(sourceFileName).getContent());
- assertFalse(EXPECTED_PROPOSALS_NOT_SET, (acfContentAssistMarkerTagInfo.expectedProposalMap.isEmpty()
- && acfContentAssistMarkerTagInfo.notExpectedProposalMap.isEmpty() && acfContentAssistMarkerTagInfo.expectedExactlyProposalMap.isEmpty()));
+ assertFalse((acfContentAssistMarkerTagInfo.expectedProposalMap.isEmpty() && acfContentAssistMarkerTagInfo.notExpectedProposalMap.isEmpty()
+ && acfContentAssistMarkerTagInfo.expectedExactlyProposalMap.isEmpty()), EXPECTED_PROPOSALS_NOT_SET);
for (int markerId : getUsedTagsItems()) {
final ICompletionProposal[] proposals = builder.computeCompletionProposals(getOffsetForTag(markerId));
if (acfContentAssistMarkerTagInfo.expectedProposalMap.containsKey(markerId)) {
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/linking/AbstractLinkingTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/linking/AbstractLinkingTest.java
index 0f3e18ea3..74d919fce 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/linking/AbstractLinkingTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/linking/AbstractLinkingTest.java
@@ -10,7 +10,7 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test.linking;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -34,6 +34,6 @@ public abstract class AbstractLinkingTest extends AbstractXtextTest {
* the actual object
*/
protected void assertReferenceResolved(final EObject expectedObject, final EObject actualObject) {
- assertEquals(NOT_RESOLVED_MESSAGE, EcoreUtil.getURI(expectedObject), EcoreUtil.getURI(actualObject));
+ assertEquals(EcoreUtil.getURI(expectedObject), EcoreUtil.getURI(actualObject), NOT_RESOLVED_MESSAGE);
}
}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/model/ModelUtil.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/model/ModelUtil.java
index 3141572b4..5b2acae82 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/model/ModelUtil.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/model/ModelUtil.java
@@ -10,11 +10,12 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test.model;
+import static org.junit.jupiter.api.Assertions.fail;
+
import java.util.Iterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
-import org.junit.Assert;
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
@@ -84,7 +85,7 @@ public Iterable getAllInstancesOf(final EObject context,
// CHECKSTYLE:ON
return Iterables.filter(getAllInstancesOf(context, type), input -> {
if (input.eClass().getEStructuralFeature(feature.getFeatureID()) != feature) {
- Assert.fail("Feature " + feature + " is not a feature of " + input.eClass()); //$NON-NLS-1$ //$NON-NLS-2$
+ fail("Feature " + feature + " is not a feature of " + input.eClass()); //$NON-NLS-1$ //$NON-NLS-2$
}
final Object valueOfFeature = input.eGet(feature);
return valueOfFeature != null && valueOfFeature.equals(value);
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/modelinference/AbstractModelInferrerTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/modelinference/AbstractModelInferrerTest.java
index 919ac60d1..9a89856d9 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/modelinference/AbstractModelInferrerTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/modelinference/AbstractModelInferrerTest.java
@@ -10,7 +10,7 @@
*******************************************************************************/
package com.avaloq.tools.ddk.xtext.test.modelinference;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import java.util.Set;
@@ -93,7 +93,7 @@ protected void assertNoInference(final int tag) {
*/
protected void assertNoInference(final EObject sourceElement) {
final Set inferredElements = getInferredElements(sourceElement);
- assertTrue("Unexpected inferred elements found: " + inferredElements.toString(), inferredElements.isEmpty()); //$NON-NLS-1$
+ assertTrue(inferredElements.isEmpty(), "Unexpected inferred elements found: " + inferredElements.toString()); //$NON-NLS-1$
}
/**
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/resource/AbstractResourceDescriptionManagerTest.xtend b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/resource/AbstractResourceDescriptionManagerTest.xtend
index 8f0c29679..6f5e067b3 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/resource/AbstractResourceDescriptionManagerTest.xtend
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/resource/AbstractResourceDescriptionManagerTest.xtend
@@ -18,7 +18,7 @@ import org.eclipse.emf.common.util.URI
import java.util.Collection
import org.eclipse.xtext.resource.IResourceDescription.Delta
import com.google.common.collect.HashMultiset
-import org.junit.Assert
+import static org.junit.jupiter.api.Assertions.assertEquals
import com.google.common.collect.Sets
import com.avaloq.tools.ddk.xtext.test.TestSource
@@ -193,6 +193,6 @@ abstract class AbstractResourceDescriptionManagerTest extends AbstractXtextTest
*/
def assertDeltaAffectedResources(Collection deltas, Collection candidates, Collection expectedUris) {
val result = getResourceDescriptionManager().getAffectedResources(deltas, candidates, getResourceDescriptions());
- Assert.assertEquals("Affected URIs must be correct.", HashMultiset.create(expectedUris), HashMultiset.create(result));
+ assertEquals(HashMultiset.create(expectedUris), HashMultiset.create(result), "Affected URIs must be correct.");
}
}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/scoping/AbstractScopingTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/scoping/AbstractScopingTest.java
index 989fb29ce..e02ecba4c 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/scoping/AbstractScopingTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/scoping/AbstractScopingTest.java
@@ -17,11 +17,11 @@
import static com.avaloq.tools.ddk.xtext.resource.AbstractSelectorFragmentProvider.SELECTOR_START;
import static com.avaloq.tools.ddk.xtext.resource.AbstractSelectorFragmentProvider.UNIQUE;
import static com.avaloq.tools.ddk.xtext.resource.AbstractSelectorFragmentProvider.VALUE_SEP;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
import java.util.ArrayList;
import java.util.Collection;
@@ -142,7 +142,7 @@ public Iterator iterator() {
@Override
protected void afterEachTest() {
- assertTrue("Expected links were set with link(int) but testLinking(String, CharSequence) was never called", expectedLinkAssertions.isEmpty());
+ assertTrue(expectedLinkAssertions.isEmpty(), "Expected links were set with link(int) but testLinking(String, CharSequence) was never called");
super.afterEachTest();
}
@@ -226,7 +226,7 @@ protected void assertScope(final EObject context, final EReference reference, fi
return;
}
}
- assertTrue("Expected URIs not found in scope: " + expectedUriSet, expectedUriSet.isEmpty());
+ assertTrue(expectedUriSet.isEmpty(), "Expected URIs not found in scope: " + expectedUriSet);
}
/**
@@ -314,7 +314,7 @@ protected void assertScopedObjects(final EObject context, final EReference refer
EObject resolvedObject = (EObject) context.eGet(reference, true);
elementResolved = expectedUriSet.contains(EcoreUtil.getURI(resolvedObject));
}
- assertTrue("Linking must have resolved one of the expected objects.", elementResolved);
+ assertTrue(elementResolved, "Linking must have resolved one of the expected objects.");
}
/**
@@ -332,7 +332,7 @@ protected void assertScopedObjects(final EObject context, final EReference refer
private void assertScope(final EObject context, final EReference reference, final QualifiedName expectedName, final URI expectedUri) {
IScope scope = getScopeProvider().getScope(context, reference);
Iterable descriptions = scope.getElements(expectedName);
- assertFalse("Description missing for: " + expectedName, Iterables.isEmpty(descriptions));
+ assertFalse(Iterables.isEmpty(descriptions), "Description missing for: " + expectedName);
URI currentUri = null;
for (IEObjectDescription desc : descriptions) {
currentUri = desc.getEObjectURI();
@@ -340,7 +340,7 @@ private void assertScope(final EObject context, final EReference reference, fina
return;
}
}
- assertEquals("Scope URI is not equal to expected URI", expectedUri, currentUri);
+ assertEquals(expectedUri, currentUri, "Scope URI is not equal to expected URI");
}
/**
@@ -362,7 +362,7 @@ protected void assertScopeForElements(final EObject context, final EReference re
assertScopeForElement(context, reference, elementName[0], expectedSourceName, expectedSourceType, elementName[1]);
}
int actualScopeSize = Iterables.size(getScopeProvider().getScope(context, reference).getAllElements());
- assertEquals(NUMBER_OF_ELEMENTS_MESSAGE, elementNames.length, actualScopeSize);
+ assertEquals(elementNames.length, actualScopeSize, NUMBER_OF_ELEMENTS_MESSAGE);
}
/**
@@ -387,7 +387,7 @@ protected void assertScopeForElements(final EObject context, final EReference re
}
int actualScopeSizeWithoutDuplicates = uris.size();
- assertEquals(NUMBER_OF_ELEMENTS_MESSAGE, elements.size(), actualScopeSizeWithoutDuplicates);
+ assertEquals(elements.size(), actualScopeSizeWithoutDuplicates, NUMBER_OF_ELEMENTS_MESSAGE);
for (Triple elementName : elements) {
assertScopeForElement(context, reference, elementName.getFirst(), elementName.getSecond(), expectedSourceType, elementName.getThird());
}
@@ -408,7 +408,7 @@ protected void assertScopeForElements(final EObject context, final EReference re
protected void assertScopeForSources(final EObject scopeContext, final EReference reference, final EClass modelElementClass, final String... sources) {
assertScope(scopeContext, reference, getExpectedURIs(scopeContext, modelElementClass, sources));
int actualScopeSize = Iterables.size(getScopeProvider().getScope(scopeContext, reference).getAllElements());
- assertEquals(NUMBER_OF_ELEMENTS_MESSAGE, sources.length, actualScopeSize);
+ assertEquals(sources.length, actualScopeSize, NUMBER_OF_ELEMENTS_MESSAGE);
}
/**
@@ -762,7 +762,7 @@ protected void testLinking(final EObject sourceObject, final int targetTag) {
* implicit item was created
*/
protected void testLinking(final int sourceTag, final EObject targetObject, final boolean traverseImplicitItems) {
- assertNotNull("Target object must not be null.", targetObject); //$NON-NLS-1$
+ assertNotNull(targetObject, "Target object must not be null."); //$NON-NLS-1$
CrossReference crossReference = getMarkerTagsInfo().getCrossReference(sourceTag);
EObject referencedSourceObject = getCrossReferencedObject(sourceTag, traverseImplicitItems, crossReference);
assertEObjectsAreEqual(referencedSourceObject, targetObject, crossReference);
@@ -782,7 +782,7 @@ protected void testLinking(final int sourceTag, final EObject targetObject, fina
*/
@SuppressWarnings("PMD.UnusedFormalParameter")
protected void testLinking(final EObject sourceObject, final int targetTag, final boolean traverseImplicitItems) {
- assertNotNull("Source object must not be null.", sourceObject); //$NON-NLS-1$
+ assertNotNull(sourceObject, "Source object must not be null."); //$NON-NLS-1$
EObject referencedTargetObject = getObjectForTag(targetTag);
assertEObjectsAreEqual(sourceObject, referencedTargetObject, null);
}
@@ -828,7 +828,7 @@ protected void assertEObjectsAreEqual(final EObject sourceObject, final EObject
} else {
found.append(NO_NODE_MODEL_COULD_BE_A_DERIVED_OBJECT);
}
- assertEquals("Errors found. Consider compare view.", expected.toString(), found.toString()); //$NON-NLS-1$
+ assertEquals(expected.toString(), found.toString(), "Errors found. Consider compare view."); //$NON-NLS-1$
}
/**
@@ -859,7 +859,7 @@ protected EObject getCrossReferencedObject(final int sourceTag, final boolean tr
EReference reference = (EReference) context.eClass().getEStructuralFeature(featureName);
if (reference.isMany()) {
Object featureValue = context.eGet(reference, false);
- assertTrue("List must be of type EObjectResolvingEList", featureValue instanceof EObjectResolvingEList); //$NON-NLS-1$
+ assertTrue(featureValue instanceof EObjectResolvingEList, "List must be of type EObjectResolvingEList"); //$NON-NLS-1$
@SuppressWarnings("unchecked")
EList extends EObject> objects = (EObjectResolvingEList extends EObject>) context.eGet(reference, false);
if (objects.size() == 1) {
@@ -871,7 +871,7 @@ protected EObject getCrossReferencedObject(final int sourceTag, final boolean tr
} else {
sourceObject = (EObject) context.eGet(reference, true);
}
- assertNotNull("Bad test. Referenced object is null.", sourceObject); //$NON-NLS-1$
+ assertNotNull(sourceObject, "Bad test. Referenced object is null."); //$NON-NLS-1$
return sourceObject;
}
}
diff --git a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/validation/AbstractValidationTest.java b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/validation/AbstractValidationTest.java
index 7f529b690..f76579d67 100644
--- a/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/validation/AbstractValidationTest.java
+++ b/com.avaloq.tools.ddk.xtext.test.core/src/com/avaloq/tools/ddk/xtext/test/validation/AbstractValidationTest.java
@@ -11,11 +11,11 @@
package com.avaloq.tools.ddk.xtext.test.validation;
import static org.eclipse.xtext.validation.ValidationMessageAcceptor.INSIGNIFICANT_INDEX;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
import java.util.Arrays;
import java.util.List;
@@ -89,7 +89,7 @@ public abstract class AbstractValidationTest extends AbstractXtextMarkerBasedTes
*/
private Diagnostic getPrimaryDiagnostics() {
Object obj = getTestInformation().getTestObject(Diagnostic.class);
- assertNotNull("getPrimaryDiagnostics(): Diagnostics of primary source not null.", obj);
+ assertNotNull(obj, "getPrimaryDiagnostics(): Diagnostics of primary source not null.");
return (Diagnostic) obj;
}
@@ -782,7 +782,7 @@ protected void assertDiagnostic(final String issueCode) {
* the code of the issue to look for
*/
protected void assertDiagnostic(final EObject model, final String issueCode) {
- assertNotNull("Issue with code '" + issueCode + "' cannot be found because the model is null", model);
+ assertNotNull(model, "Issue with code '" + issueCode + "' cannot be found because the model is null");
assertDiagnostic(getXtextTestUtil().getDiagnostician().validate(model), issueCode);
}
@@ -805,7 +805,7 @@ protected void assertNoDiagnostic(final String issueCode) {
* the code of the issue to look for
*/
protected void assertNoDiagnostic(final EObject model, final String issueCode) {
- assertNotNull("Issue with code '" + issueCode + "' cannot be found because the model is null", model);
+ assertNotNull(model, "Issue with code '" + issueCode + "' cannot be found because the model is null");
assertNoDiagnostic(getXtextTestUtil().getDiagnostician().validate(model), issueCode);
}
@@ -823,7 +823,7 @@ protected void assertNoDiagnostics() {
* the model in which to look for issues, may be {@code null}
*/
protected void assertNoDiagnostics(final EObject model) {
- assertNotNull("Assertion cannot be checked because the model is null", model);
+ assertNotNull(model, "Assertion cannot be checked because the model is null");
assertNoDiagnostics(getXtextTestUtil().getDiagnostician().validate(model));
}
@@ -846,7 +846,7 @@ protected void assertDiagnosticMessage(final String message) {
* the message of the issue to look for
*/
protected void assertDiagnosticMessage(final EObject model, final String message) {
- assertNotNull("Message '" + message + "' cannot be found because the model is null", model);
+ assertNotNull(model, "Message '" + message + "' cannot be found because the model is null");
assertDiagnosticMessage(getXtextTestUtil().getDiagnostician().validate(model), message);
}
@@ -932,8 +932,8 @@ private void assertNoDiagnostic(final Diagnostic diagnostics, final String issue
* the diagnostic to check for issues
*/
private void assertNoDiagnostics(final Diagnostic diagnostics) {
- assertEquals("Diagnostics should be in OK state.", diagnostics.getCode(), Diagnostic.OK);
- assertTrue("There should be no diagnostics. Instead found " + diagnostics.getChildren().size(), diagnostics.getChildren().isEmpty());
+ assertEquals(Diagnostic.OK, diagnostics.getCode(), "Diagnostics should be in OK state.");
+ assertTrue(diagnostics.getChildren().isEmpty(), "There should be no diagnostics. Instead found " + diagnostics.getChildren().size());
}
/**
@@ -945,7 +945,8 @@ private void assertNoDiagnostics(final Diagnostic diagnostics) {
public static void assertNoErrorsOnResource(final EObject object) {
final EList errors = object.eResource().getErrors();
if (!errors.isEmpty()) {
- fail(AbstractValidationTest.NO_ERRORS_FOUND_ON_RESOURCE_MESSAGE + "; found " + Lists.transform(errors, Resource.Diagnostic::getMessage)); //$NON-NLS-1$
+ fail(AbstractValidationTest.NO_ERRORS_FOUND_ON_RESOURCE_MESSAGE + "; found " //$NON-NLS-1$
+ + Lists.transform(errors, Resource.Diagnostic::getMessage));
}
}
@@ -961,7 +962,7 @@ public static void assertNoErrorsOnResource(final EObject object, final String..
List messageList = Arrays.asList(messages);
final EList errors = object.eResource().getErrors();
for (String errorMessage : Lists.transform(errors, Resource.Diagnostic::getMessage)) {
- assertFalse(NO_ERRORS_FOUND_ON_RESOURCE_MESSAGE + " with message '" + errorMessage + "'.", messageList.contains(errorMessage));
+ assertFalse(messageList.contains(errorMessage), NO_ERRORS_FOUND_ON_RESOURCE_MESSAGE + " with message '" + errorMessage + "'.");
}
}
@@ -987,7 +988,7 @@ public static void assertNoLinkingErrorsOnResource(final EObject object, final S
break;
}
}
- assertFalse(NLS.bind("Expecting no linking errors on resource for \"{0}\".", referenceName), found);
+ assertFalse(found, NLS.bind("Expecting no linking errors on resource for \"{0}\".", referenceName));
}
}
@@ -1013,7 +1014,7 @@ public static void assertLinkingErrorsOnResourceExist(final EObject object, fina
break;
}
}
- assertTrue(NLS.bind("Expected linking error on \"{0}\" but could not find it", referenceName), found);
+ assertTrue(found, NLS.bind("Expected linking error on \"{0}\" but could not find it", referenceName));
}
}
@@ -1029,7 +1030,7 @@ public static void assertLinkingErrorsWithCustomMessageOnResourceExist(final EOb
final List linkingErrors = object.eResource().getErrors().stream().filter(error -> error instanceof XtextLinkingDiagnostic).collect(Collectors.toList());
final List errorMessages = Lists.transform(linkingErrors, Resource.Diagnostic::getMessage);
for (final String s : errorStrings) {
- assertTrue(NLS.bind("Expected linking error \"{0}\" but could not find it", s), errorMessages.contains(s));
+ assertTrue(errorMessages.contains(s), NLS.bind("Expected linking error \"{0}\" but could not find it", s));
}
}
@@ -1045,7 +1046,7 @@ public static void assertNoLinkingErrorsWithCustomMessageOnResource(final EObjec
List messageList = Arrays.asList(messages);
final List linkingErrors = object.eResource().getErrors().stream().filter(error -> error instanceof XtextLinkingDiagnostic).collect(Collectors.toList());
for (String errorMessage : Lists.transform(linkingErrors, Resource.Diagnostic::getMessage)) {
- assertFalse(NLS.bind("Expecting no linking errors on resource with message \"{0}\".", errorMessage), messageList.contains(errorMessage));
+ assertFalse(messageList.contains(errorMessage), NLS.bind("Expecting no linking errors on resource with message \"{0}\".", errorMessage));
}
}
@@ -1061,7 +1062,7 @@ public static void assertErrorsOnResourceExist(final EObject object, final Strin
final EList errors = object.eResource().getErrors();
final List errorMessages = Lists.transform(errors, Resource.Diagnostic::getMessage);
for (final String s : errorStrings) {
- assertTrue(NLS.bind("Expected error \"{0}\" but could not find it", s), errorMessages.contains(s));
+ assertTrue(errorMessages.contains(s), NLS.bind("Expected error \"{0}\" but could not find it", s));
}
}
diff --git a/com.avaloq.tools.ddk.xtext.test/META-INF/MANIFEST.MF b/com.avaloq.tools.ddk.xtext.test/META-INF/MANIFEST.MF
index 2c06458a3..ef98b2024 100644
--- a/com.avaloq.tools.ddk.xtext.test/META-INF/MANIFEST.MF
+++ b/com.avaloq.tools.ddk.xtext.test/META-INF/MANIFEST.MF
@@ -28,7 +28,6 @@ Require-Bundle: com.avaloq.tools.ddk.xtext,
org.eclipse.emf.ecore,
junit-jupiter-api,
junit-jupiter-engine,
- junit-vintage-engine,
junit-platform-suite-api,
org.eclipse.xtext.testing,
org.opentest4j
diff --git a/com.avaloq.tools.ddk.xtext.test/pom.xml b/com.avaloq.tools.ddk.xtext.test/pom.xml
index b94f0de79..1fb8f4581 100644
--- a/com.avaloq.tools.ddk.xtext.test/pom.xml
+++ b/com.avaloq.tools.ddk.xtext.test/pom.xml
@@ -17,6 +17,7 @@
tycho-surefire-plugin
${tycho.version}
+ junit5
false
false
${test.testClass}
diff --git a/ddk-configuration/checkstyle/avaloq.xml b/ddk-configuration/checkstyle/avaloq.xml
index 2965fb943..0b9b53b02 100644
--- a/ddk-configuration/checkstyle/avaloq.xml
+++ b/ddk-configuration/checkstyle/avaloq.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/ddk-configuration/launches/devkit-run.launch b/ddk-configuration/launches/devkit-run.launch
index 0229f0ddc..219556de0 100644
--- a/ddk-configuration/launches/devkit-run.launch
+++ b/ddk-configuration/launches/devkit-run.launch
@@ -223,7 +223,7 @@
-
+
@@ -269,7 +269,6 @@
-
@@ -293,7 +292,6 @@
-
diff --git a/ddk-target/ddk.target b/ddk-target/ddk.target
index aff6ba174..ffab648b9 100644
--- a/ddk-target/ddk.target
+++ b/ddk-target/ddk.target
@@ -6,7 +6,7 @@
-
+
@@ -53,7 +53,6 @@
-
@@ -63,6 +62,7 @@
+