/* * 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.platform.engine.test.event; import static java.util.function.Predicate.isEqual; import static org.assertj.core.api.Assertions.allOf; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.Index.atIndex; import static org.junit.platform.commons.util.FunctionUtils.where; import static org.junit.platform.engine.TestExecutionResult.Status.ABORTED; import static org.junit.platform.engine.TestExecutionResult.Status.FAILED; import static org.junit.platform.engine.TestExecutionResult.Status.SUCCESSFUL; import static org.junit.platform.engine.test.event.ExecutionEvent.Type.DYNAMIC_TEST_REGISTERED; import static org.junit.platform.engine.test.event.ExecutionEvent.Type.FINISHED; import static org.junit.platform.engine.test.event.ExecutionEvent.Type.SKIPPED; import static org.junit.platform.engine.test.event.ExecutionEvent.Type.STARTED; import static org.junit.platform.engine.test.event.ExecutionEvent.byPayload; import static org.junit.platform.engine.test.event.ExecutionEvent.byTestDescriptor; import static org.junit.platform.engine.test.event.ExecutionEvent.byType; import static org.junit.platform.engine.test.event.TestExecutionResultConditions.cause; import static org.junit.platform.engine.test.event.TestExecutionResultConditions.status; import java.util.List; import org.assertj.core.api.Assertions; import org.assertj.core.api.Condition; import org.assertj.core.api.SoftAssertions; import org.junit.platform.engine.TestDescriptor; import org.junit.platform.engine.TestExecutionResult; import org.junit.platform.engine.TestExecutionResult.Status; import org.junit.platform.engine.support.descriptor.EngineDescriptor; import org.junit.platform.engine.test.event.ExecutionEvent.Type; /** * Collection of AssertJ conditions for {@link ExecutionEvent}. * * @since 1.0 */ public class ExecutionEventConditions { @SafeVarargs public static void assertRecordedExecutionEventsContainsExactly(List<ExecutionEvent> executionEvents, Condition<? super ExecutionEvent>... conditions) { SoftAssertions softly = new SoftAssertions(); assertThat(executionEvents).hasSize(conditions.length); for (int i = 0; i < conditions.length; i++) { softly.assertThat(executionEvents).has(conditions[i], atIndex(i)); } softly.assertAll(); } @SafeVarargs @SuppressWarnings("varargs") public static Condition<ExecutionEvent> event(Condition<? super ExecutionEvent>... conditions) { return Assertions.<ExecutionEvent> allOf(conditions); } public static Condition<ExecutionEvent> engine() { return new Condition<>(byTestDescriptor(EngineDescriptor.class::isInstance), "is an engine"); } public static Condition<ExecutionEvent> test(String uniqueIdSubstring) { return allOf(test(), uniqueIdSubstring(uniqueIdSubstring)); } public static Condition<ExecutionEvent> test(String uniqueIdSubstring, String displayName) { return allOf(test(), uniqueIdSubstring(uniqueIdSubstring), displayName(displayName)); } public static Condition<ExecutionEvent> test() { return new Condition<>(byTestDescriptor(TestDescriptor::isTest), "is a test"); } public static Condition<ExecutionEvent> container(Class<?> clazz) { return container(clazz.getName()); } public static Condition<ExecutionEvent> container(String uniqueIdSubstring) { return allOf(container(), uniqueIdSubstring(uniqueIdSubstring)); } public static Condition<ExecutionEvent> container() { return new Condition<>(byTestDescriptor(TestDescriptor::isContainer), "is a container"); } public static Condition<ExecutionEvent> dynamicTestRegistered(String uniqueIdSubstring) { return allOf(type(DYNAMIC_TEST_REGISTERED), uniqueIdSubstring(uniqueIdSubstring)); } public static Condition<ExecutionEvent> uniqueIdSubstring(String uniqueIdSubstring) { return new Condition<>( byTestDescriptor(where(testDescriptor -> testDescriptor.getUniqueId().toString(), uniqueId -> uniqueId.contains(uniqueIdSubstring))), "descriptor with uniqueId substring \"%s\"", uniqueIdSubstring); } public static Condition<ExecutionEvent> displayName(String displayName) { return new Condition<>(byTestDescriptor(where(TestDescriptor::getDisplayName, isEqual(displayName))), "descriptor with display name \"%s\"", displayName); } public static Condition<ExecutionEvent> skippedWithReason(String expectedReason) { return allOf(type(SKIPPED), reason(expectedReason)); } public static Condition<ExecutionEvent> started() { return type(STARTED); } public static Condition<ExecutionEvent> abortedWithReason(Condition<? super Throwable> causeCondition) { return finishedWithCause(ABORTED, causeCondition); } public static Condition<ExecutionEvent> finishedWithFailure(Condition<? super Throwable> causeCondition) { return finishedWithCause(FAILED, causeCondition); } private static Condition<ExecutionEvent> finishedWithCause(Status expectedStatus, Condition<? super Throwable> causeCondition) { return finished(allOf(status(expectedStatus), cause(causeCondition))); } public static Condition<ExecutionEvent> finishedWithFailure() { return finished(status(FAILED)); } public static Condition<ExecutionEvent> finishedSuccessfully() { return finished(status(SUCCESSFUL)); } public static Condition<ExecutionEvent> finished(Condition<TestExecutionResult> resultCondition) { return allOf(type(FINISHED), result(resultCondition)); } public static Condition<ExecutionEvent> type(Type expectedType) { return new Condition<>(byType(expectedType), "type is %s", expectedType); } public static Condition<ExecutionEvent> result(Condition<TestExecutionResult> condition) { return new Condition<>(byPayload(TestExecutionResult.class, condition::matches), "event with result where %s", condition); } public static Condition<ExecutionEvent> reason(String expectedReason) { return new Condition<>(byPayload(String.class, isEqual(expectedReason)), "event with reason '%s'", expectedReason); } }