/* * 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.engine; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.platform.engine.TestDescriptor; import org.junit.platform.engine.test.event.ExecutionEventRecorder; import org.junit.platform.launcher.LauncherDiscoveryRequest; /** * Integration tests that verify support for {@linkplain Nested nested contexts} * in the {@link JupiterTestEngine}. * * @since 5.0 */ class NestedTestClassesTests extends AbstractJupiterTestEngineTests { @Test void nestedTestsAreCorrectlyDiscovered() { LauncherDiscoveryRequest request = request().selectors(selectClass(TestCaseWithNesting.class)).build(); TestDescriptor engineDescriptor = discoverTests(request); assertEquals(5, engineDescriptor.getDescendants().size(), "# resolved test descriptors"); } @Test void nestedTestsAreExecuted() { ExecutionEventRecorder eventRecorder = executeTestsForClass(TestCaseWithNesting.class); assertEquals(3, eventRecorder.getTestStartedCount(), "# tests started"); assertEquals(2, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"); assertEquals(1, eventRecorder.getTestFailedCount(), "# tests failed"); assertEquals(3, eventRecorder.getContainerStartedCount(), "# containers started"); assertEquals(3, eventRecorder.getContainerFinishedCount(), "# containers finished"); } @Test void doublyNestedTestsAreCorrectlyDiscovered() { LauncherDiscoveryRequest request = request().selectors(selectClass(TestCaseWithDoubleNesting.class)).build(); TestDescriptor engineDescriptor = discoverTests(request); assertEquals(8, engineDescriptor.getDescendants().size(), "# resolved test descriptors"); } @Test void doublyNestedTestsAreExecuted() { ExecutionEventRecorder eventRecorder = executeTestsForClass(TestCaseWithDoubleNesting.class); assertEquals(5, eventRecorder.getTestStartedCount(), "# tests started"); assertEquals(3, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"); assertEquals(2, eventRecorder.getTestFailedCount(), "# tests failed"); assertEquals(4, eventRecorder.getContainerStartedCount(), "# containers started"); assertEquals(4, eventRecorder.getContainerFinishedCount(), "# containers finished"); assertAll("before each counts", // () -> assertEquals(5, TestCaseWithDoubleNesting.beforeTopCount), () -> assertEquals(4, TestCaseWithDoubleNesting.beforeNestedCount), () -> assertEquals(2, TestCaseWithDoubleNesting.beforeDoublyNestedCount)); assertAll("after each counts", // () -> assertEquals(5, TestCaseWithDoubleNesting.afterTopCount), () -> assertEquals(4, TestCaseWithDoubleNesting.afterNestedCount), () -> assertEquals(2, TestCaseWithDoubleNesting.afterDoublyNestedCount)); } @Test void inheritedNestedTestsAreExecuted() { ExecutionEventRecorder eventRecorder = executeTestsForClass(TestCaseWithInheritedNested.class); assertEquals(2, eventRecorder.getTestStartedCount(), "# tests started"); assertEquals(1, eventRecorder.getTestSuccessfulCount(), "# tests succeeded"); assertEquals(1, eventRecorder.getTestFailedCount(), "# tests failed"); assertEquals(3, eventRecorder.getContainerStartedCount(), "# containers started"); assertEquals(3, eventRecorder.getContainerFinishedCount(), "# containers finished"); } // ------------------------------------------------------------------- private static class TestCaseWithNesting { @Test void someTest() { } @Nested class NestedTestCase { @Test void successful() { } @Test void failing() { Assertions.fail("Something went horribly wrong"); } } } static private class TestCaseWithDoubleNesting { static int beforeTopCount = 0; static int beforeNestedCount = 0; static int beforeDoublyNestedCount = 0; static int afterTopCount = 0; static int afterNestedCount = 0; static int afterDoublyNestedCount = 0; @BeforeEach void beforeTop() { beforeTopCount++; } @AfterEach void afterTop() { afterTopCount++; } @Test void someTest() { } @Nested class NestedTestCase { @BeforeEach void beforeNested() { beforeNestedCount++; } @AfterEach void afterNested() { afterNestedCount++; } @Test void successful() { } @Test void failing() { Assertions.fail("Something went horribly wrong"); } @Nested class DoublyNestedTestCase { @BeforeEach void beforeDoublyNested() { beforeDoublyNestedCount++; } @BeforeEach void afterDoublyNested() { afterDoublyNestedCount++; } @Test void successful() { } @Test void failing() { Assertions.fail("Something went horribly wrong"); } } } } interface InterfaceWithNestedClass { @Nested class NestedInInterface { @Test void notExecutedByImplementingClass() { Assertions.fail("class in interface is static and should have been filtered out"); } } } static abstract class AbstractSuperClass implements InterfaceWithNestedClass { @Nested class NestedInAbstractClass { @Test void successful() { } @Test void failing() { Assertions.fail("something went wrong"); } } } static class TestCaseWithInheritedNested extends AbstractSuperClass { // empty on purpose } }