/* * Copyright 2015-2017 the original author or authors. * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.jupiter.migrationsupport.rules; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; import org.junit.Rule; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.engine.JupiterTestEngine; import org.junit.platform.engine.ExecutionRequest; import org.junit.platform.engine.TestDescriptor; import org.junit.platform.engine.UniqueId; import org.junit.platform.engine.test.event.ExecutionEventRecorder; import org.junit.platform.launcher.LauncherDiscoveryRequest; import org.junit.rules.ErrorCollector; import org.junit.rules.ExternalResource; import org.junit.rules.Verifier; class LauncherBasedEnableRuleMigrationSupportTests { @Test void enableRuleMigrationSupportAnnotationWorksForBothRuleTypes() { ExecutionEventRecorder eventRecorder = executeTestsForClass( EnableRuleMigrationSupportWithBothRuleTypesTestCase.class); assertEquals(1, eventRecorder.getTestStartedCount(), "# tests started"); assertEquals(1, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"); assertEquals(0, eventRecorder.getTestAbortedCount(), "# tests aborted"); assertEquals(0, eventRecorder.getTestFailedCount(), "# tests failed"); assertEquals(true, EnableRuleMigrationSupportWithBothRuleTypesTestCase.afterOfRule1WasExecuted, "after of rule 1 executed?"); assertEquals(true, EnableRuleMigrationSupportWithBothRuleTypesTestCase.beforeOfRule2WasExecuted, "before of rule 2 executed?"); assertEquals(true, EnableRuleMigrationSupportWithBothRuleTypesTestCase.afterOfRule2WasExecuted, "before of rule 2 executed?"); } @Test void verifierSupportForErrorCollectorFieldFailsTheTest() { ExecutionEventRecorder eventRecorder = executeTestsForClass(VerifierSupportForErrorCollectorTestCase.class); assertEquals(1, eventRecorder.getTestStartedCount(), "# tests started"); assertEquals(0, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"); assertEquals(0, eventRecorder.getTestAbortedCount(), "# tests aborted"); assertEquals(1, eventRecorder.getTestFailedCount(), "# tests failed"); assertEquals(true, VerifierSupportForErrorCollectorTestCase.survivedBothErrors, "after of rule 1 executed?"); } private final JupiterTestEngine engine = new JupiterTestEngine(); private ExecutionEventRecorder executeTestsForClass(Class<?> testClass) { return executeTests(request().selectors(selectClass(testClass)).build()); } private ExecutionEventRecorder executeTests(LauncherDiscoveryRequest request) { TestDescriptor testDescriptor = discoverTests(request); ExecutionEventRecorder eventRecorder = new ExecutionEventRecorder(); engine.execute(new ExecutionRequest(testDescriptor, eventRecorder, request.getConfigurationParameters())); return eventRecorder; } private TestDescriptor discoverTests(LauncherDiscoveryRequest request) { return engine.discover(request, UniqueId.forEngine(engine.getId())); } @EnableRuleMigrationSupport private static class EnableRuleMigrationSupportWithBothRuleTypesTestCase { static boolean afterOfRule1WasExecuted = false; static boolean beforeOfRule2WasExecuted = false; static boolean afterOfRule2WasExecuted = false; @Rule public Verifier verifier1 = new Verifier() { @Override protected void verify() throws Throwable { afterOfRule1WasExecuted = true; } }; private ExternalResource resource2 = new ExternalResource() { @Override protected void before() throws Throwable { beforeOfRule2WasExecuted = true; } @Override protected void after() { afterOfRule2WasExecuted = true; } }; @Rule public ExternalResource getResource2() { return resource2; } @Test void beforeMethodOfBothRule2WasExecuted() { assertTrue(beforeOfRule2WasExecuted); } } @ExtendWith(VerifierSupport.class) private static class VerifierSupportForErrorCollectorTestCase { static boolean survivedBothErrors = false; @Rule public ErrorCollector collector = new ErrorCollector(); @Test void addingTwoThrowablesToErrorCollectorFailsLate() { collector.addError(new Throwable("first thing went wrong")); collector.addError(new Throwable("second thing went wrong")); survivedBothErrors = true; } } }