/*
* Copyright 2015-2019 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 v2.0 which
* accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v20.html
*/
package org.junit.jupiter.engine.script;
import static org.apiguardian.api.API.Status.INTERNAL;
import java.lang.annotation.Annotation;
import java.util.Objects;
import org.apiguardian.api.API;
import org.junit.platform.commons.util.Preconditions;
Script data class.
See Also: Since: 5.1
/**
* Script data class.
*
* @since 5.1
* @see org.junit.jupiter.api.condition.DisabledIf
* @see org.junit.jupiter.api.condition.EnabledIf
* @see ScriptExecutionManager
*/
@API(status = INTERNAL, since = "5.1")
public final class Script {
The script engine name defaults to Nashorn
. /**
* The script engine name defaults to {@code Nashorn}.
*/
public static final String DEFAULT_SCRIPT_ENGINE_NAME = "Nashorn";
Set of all tags assigned to the current extension context.
Value type: Set<String>
See Also:
/**
* Set of all tags assigned to the current extension context.
*
* <p>Value type: {@code Set<String>}
*
* @see org.junit.jupiter.api.extension.ExtensionContext#getTags()
*/
public static final String BIND_JUNIT_TAGS = "junitTags";
Unique ID associated with the current extension context.
Value type: String
See Also:
/**
* Unique ID associated with the current extension context.
*
* <p>Value type: {@code String}
*
* @see org.junit.jupiter.api.extension.ExtensionContext#getUniqueId()
*/
public static final String BIND_JUNIT_UNIQUE_ID = "junitUniqueId";
Display name of the test or container.
Value type: String
See Also:
/**
* Display name of the test or container.
*
* <p>Value type: {@code String}
*
* @see org.junit.jupiter.api.extension.ExtensionContext#getDisplayName()
*/
public static final String BIND_JUNIT_DISPLAY_NAME = "junitDisplayName";
Accessor for JUnit Platform configuration parameters.
Usage: junitConfigurationParameter.get(key) -> String
See Also:
/**
* Accessor for JUnit Platform configuration parameters.
*
* <p>Usage: {@code junitConfigurationParameter.get(key) -> String}
*
* @see org.junit.jupiter.api.extension.ExtensionContext#getConfigurationParameter(String)
*/
public static final String BIND_JUNIT_CONFIGURATION_PARAMETER = "junitConfigurationParameter";
Accessor for JVM system properties.
Usage: systemProperty.get(key) -> String
See Also:
/**
* Accessor for JVM system properties.
*
* <p>Usage: {@code systemProperty.get(key) -> String}
*
* @see System#getProperty(String)
*/
static final String BIND_SYSTEM_PROPERTY = "systemProperty";
Accessor for operating system environment variables.
Usage: systemEnvironment.get(key) -> String
See Also:
/**
* Accessor for operating system environment variables.
*
* <p>Usage: {@code systemEnvironment.get(key) -> String}
*
* @see System#getenv(String)
*/
static final String BIND_SYSTEM_ENVIRONMENT = "systemEnvironment";
Default reason message pattern.
/**
* Default reason message pattern.
*/
public static final String DEFAULT_SCRIPT_REASON_PATTERN = "Script `{source}` evaluated to: {result}";
Placeholder name for the annotation.toString()
value. /**
* Placeholder name for the {@code annotation.toString()} value.
*/
private static final String REASON_ANNOTATION_PLACEHOLDER = "{annotation}";
Placeholder name for String representation of the result object.
/**
* Placeholder name for String representation of the result object.
*/
private static final String REASON_RESULT_PLACEHOLDER = "{result}";
Placeholder name for the script source.
/**
* Placeholder name for the script source.
*/
private static final String REASON_SOURCE_PLACEHOLDER = "{source}";
// ------------------------------------------------------------------------
private final Class<? extends Annotation> annotationType;
private final String annotationAsString;
private final String engine;
private final String source;
private final String reason;
private final int hashCode;
public Script(Annotation annotation, String engine, String source, String reason) {
this(Preconditions.notNull(annotation, "annotation must not be null").annotationType(), annotation.toString(),
engine, source, reason);
}
public Script(Class<? extends Annotation> annotationType, String annotationAsString, String engine, String source,
String reason) {
Preconditions.notNull(annotationType, "annotationType must not be null");
Preconditions.notNull(annotationAsString, "annotationAsString must not be null");
Preconditions.notBlank(engine, "engine must not be blank");
Preconditions.notBlank(source, "source must not be blank");
Preconditions.notNull(reason, "reason must not be null");
this.annotationType = annotationType;
this.annotationAsString = annotationAsString;
this.engine = engine;
this.source = source;
this.reason = reason;
this.hashCode = computeHashCode();
}
Properties annotationType
and reason
are not
included on purpose. This allows more cache hits when using instances
of this class as keys in a hash map.
/**
* Properties {@link #annotationType} and {@link #reason} are <b>not</b>
* included on purpose. This allows more cache hits when using instances
* of this class as keys in a hash map.
*/
private int computeHashCode() {
return Objects.hash(annotationType.getTypeName(), engine, source);
}
@Override
public boolean equals(Object other) {
if (other == null) {
return false;
}
if (this.getClass() != other.getClass()) {
return false;
}
Script otherScript = (Script) other;
return this.hashCode == otherScript.hashCode;
}
@Override
public int hashCode() {
return hashCode;
}
public String getAnnotationAsString() {
return annotationAsString;
}
public Class<? extends Annotation> getAnnotationType() {
return annotationType;
}
public String getEngine() {
return engine;
}
public String getReason() {
return reason;
}
public String getSource() {
return source;
}
Returns: the string returned by getReason()
with all placeholders replaced with their current values stored here.
/**
* @return the string returned by {@link #getReason()} with all placeholders
* replaced with their current values stored here.
*/
public String toReasonString(String resultAsString) {
return reason.replace(REASON_ANNOTATION_PLACEHOLDER, getAnnotationAsString()) //
.replace(REASON_SOURCE_PLACEHOLDER, getSource()) //
.replace(REASON_RESULT_PLACEHOLDER, resultAsString);
}
}