/*
* 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.descriptor;
import static java.util.stream.Collectors.toCollection;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.engine.execution.ExtensionValuesStore;
import org.junit.jupiter.engine.execution.NamespaceAwareStore;
import org.junit.platform.commons.util.Preconditions;
import org.junit.platform.engine.EngineExecutionListener;
import org.junit.platform.engine.TestDescriptor;
import org.junit.platform.engine.TestTag;
import org.junit.platform.engine.reporting.ReportEntry;
/**
* @since 5.0
*/
abstract class AbstractExtensionContext<T extends TestDescriptor> implements ExtensionContext {
private final ExtensionContext parent;
private final EngineExecutionListener engineExecutionListener;
private final T testDescriptor;
private final ExtensionValuesStore valuesStore;
AbstractExtensionContext(ExtensionContext parent, EngineExecutionListener engineExecutionListener,
T testDescriptor) {
this.parent = parent;
this.engineExecutionListener = engineExecutionListener;
this.testDescriptor = testDescriptor;
this.valuesStore = createStore(parent);
}
private ExtensionValuesStore createStore(ExtensionContext parent) {
ExtensionValuesStore parentStore = null;
if (parent != null) {
parentStore = ((AbstractExtensionContext<?>) parent).valuesStore;
}
return new ExtensionValuesStore(parentStore);
}
@Override
public String getUniqueId() {
return getTestDescriptor().getUniqueId().toString();
}
@Override
public String getDisplayName() {
return getTestDescriptor().getDisplayName();
}
@Override
public void publishReportEntry(Map<String, String> values) {
engineExecutionListener.reportingEntryPublished(this.testDescriptor, ReportEntry.from(values));
}
@Override
public Optional<ExtensionContext> getParent() {
return Optional.ofNullable(parent);
}
protected T getTestDescriptor() {
return testDescriptor;
}
@Override
public Store getStore(Namespace namespace) {
Preconditions.notNull(namespace, "Namespace must not be null");
return new NamespaceAwareStore(valuesStore, namespace);
}
@Override
public Set<String> getTags() {
return testDescriptor.getTags().stream().map(TestTag::getName).collect(toCollection(LinkedHashSet::new));
}
}