/*
* 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.junit.platform.commons.util.FunctionUtils.where;
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.REPORTING_ENTRY_PUBLISHED;
import static org.junit.platform.engine.test.event.ExecutionEvent.Type.SKIPPED;
import static org.junit.platform.engine.test.event.ExecutionEvent.Type.STARTED;
import java.util.Optional;
import java.util.function.Predicate;
import org.junit.platform.commons.util.ToStringBuilder;
import org.junit.platform.engine.TestDescriptor;
import org.junit.platform.engine.TestExecutionResult;
import org.junit.platform.engine.reporting.ReportEntry;
/**
* Represents an event collected by {@link ExecutionEventRecorder}.
*
* @since 1.0
* @see ExecutionEventConditions
*/
public class ExecutionEvent {
public enum Type {
DYNAMIC_TEST_REGISTERED, SKIPPED, STARTED, FINISHED, REPORTING_ENTRY_PUBLISHED
}
public static ExecutionEvent reportingEntryPublished(TestDescriptor testDescriptor, ReportEntry entry) {
return new ExecutionEvent(REPORTING_ENTRY_PUBLISHED, testDescriptor, entry);
}
public static ExecutionEvent dynamicTestRegistered(TestDescriptor testDescriptor) {
return new ExecutionEvent(DYNAMIC_TEST_REGISTERED, testDescriptor, null);
}
public static ExecutionEvent executionSkipped(TestDescriptor testDescriptor, String reason) {
return new ExecutionEvent(SKIPPED, testDescriptor, reason);
}
public static ExecutionEvent executionStarted(TestDescriptor testDescriptor) {
return new ExecutionEvent(STARTED, testDescriptor, null);
}
public static ExecutionEvent executionFinished(TestDescriptor testDescriptor, TestExecutionResult result) {
return new ExecutionEvent(FINISHED, testDescriptor, result);
}
public static Predicate<ExecutionEvent> byType(ExecutionEvent.Type type) {
return where(ExecutionEvent::getType, isEqual(type));
}
public static Predicate<ExecutionEvent> byTestDescriptor(Predicate<? super TestDescriptor> predicate) {
return where(ExecutionEvent::getTestDescriptor, predicate);
}
public static <T> Predicate<ExecutionEvent> byPayload(Class<T> payloadClass, Predicate<? super T> predicate) {
return event -> event.getPayload(payloadClass).filter(predicate).isPresent();
}
private final ExecutionEvent.Type type;
private final TestDescriptor testDescriptor;
private final Object payload;
private ExecutionEvent(ExecutionEvent.Type type, TestDescriptor testDescriptor, Object payload) {
this.type = type;
this.testDescriptor = testDescriptor;
this.payload = payload;
}
public ExecutionEvent.Type getType() {
return type;
}
public TestDescriptor getTestDescriptor() {
return testDescriptor;
}
public <T> Optional<T> getPayload(Class<T> payloadClass) {
return Optional.ofNullable(payload).filter(payloadClass::isInstance).map(payloadClass::cast);
}
@Override
public String toString() {
// @formatter:off
return new ToStringBuilder(this)
.append("type", type)
.append("testDescriptor", testDescriptor)
.append("payload", payload)
.toString();
// @formatter:on
}
}