blob: 44b61453d8ca1c99157f9494e03b9ad8b838868d [file] [log] [blame]
// Copyright 2015 The Bazel Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.testing.junit.runner.model;
import com.google.testing.junit.runner.util.TestIntegration;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
/** Result of executing a test suite or test case. */
public final class TestResult {
/**
* Possible result values to a test.
*/
public enum Status {
/**
* Test case was not run because the test decided that it should not be run
* (e.g.: due to a failed assumption in a JUnit4-style tests).
*/
SKIPPED(false),
/**
* Test case was not run because the user specified that it should be filtered out of the
* test run.
*/
FILTERED(false),
/**
* Test case was not run because the test was labeled in the code as suppressed
* (e.g.: the test was annotated with {@code @Suppress} or {@code @Ignore}).
*/
SUPPRESSED(false),
/**
* Test case was not started because the test harness run was interrupted by a
* signal or timed out.
*/
CANCELLED(false),
/**
* Test case was started but not finished because the test harness run was interrupted by a
* signal or timed out.
*/
INTERRUPTED(true),
/**
* Test case was run and completed (possibly failing or throwing an exception, but not
* interrupted).
*/
COMPLETED(true);
private final boolean wasRun;
Status(boolean wasRun) {
this.wasRun = wasRun;
}
/**
* Equivalent semantic value to wasRun {@code status="run|notrun"} on
* the XML schema.
*/
public boolean wasRun() {
return wasRun;
}
}
private final String name;
private final String className;
private final Map<String, String> properties;
private final List<Throwable> failures;
@Nullable private final TestInterval runTime;
private final Set<TestIntegration> integrations;
private final Status status;
private final int numTests;
private final int numFailures;
private final List<TestResult> childResults;
private TestResult(Builder builder) {
name = checkNotNull(builder.name, "name not set");
className = checkNotNull(builder.className, "className not set");
properties = checkNotNull(builder.properties, "properties not set");
failures = checkNotNull(builder.failures, "failures not set");
runTime = builder.runTime;
status = checkNotNull(builder.status, "status not set");
numTests = checkNotNull(builder.numTests, "numTests not set");
numFailures = checkNotNull(builder.numFailures, "numFailures not set");
childResults = checkNotNull(builder.childResults, "childResults not set");
integrations = checkNotNull(builder.integrations, "integrations not set");
}
public String getName() {
return name;
}
public String getClassName() {
return className;
}
public Map<String, String> getProperties() {
return properties;
}
public List<Throwable> getFailures() {
return failures;
}
public Set<TestIntegration> getIntegrations() {
return integrations;
}
@Nullable
public TestInterval getRunTimeInterval() {
return runTime;
}
public Status getStatus() {
return status;
}
public boolean wasRun() {
return getStatus().wasRun();
}
public int getNumTests() {
return numTests;
}
public int getNumFailures() {
return numFailures;
}
public List<TestResult> getChildResults() {
return childResults;
}
private static <T> T checkNotNull(T reference, String errorMessage) {
if (reference == null) {
throw new NullPointerException(errorMessage);
}
return reference;
}
public static final class Builder {
private String name = null;
private String className = null;
private Map<String, String> properties = null;
private List<Throwable> failures = null;
@Nullable private TestInterval runTime = null;
private Set<TestIntegration> integrations = null;
private Status status = null;
private Integer numTests = null;
private Integer numFailures = null;
private List<TestResult> childResults = null;
public Builder() {}
public Builder name(String name) {
this.name = checkNullToNotNull(this.name, name, "name");
return this;
}
public Builder className(String className) {
this.className = checkNullToNotNull(this.className, className, "className");
return this;
}
public Builder properties(Map<String, String> properties) {
this.properties = checkNullToNotNull(this.properties, properties, "properties");
return this;
}
public Builder integrations(Set<TestIntegration> integrations) {
this.integrations = checkNullToNotNull(this.integrations, integrations, "integrations");
return this;
}
public Builder failures(List<Throwable> failures) {
this.failures = checkNullToNotNull(this.failures, failures, "failures");
return this;
}
public Builder runTimeInterval(@Nullable TestInterval runTime) {
if (this.runTime != null) {
throw new IllegalStateException("runTime already set");
}
this.runTime = runTime;
return this;
}
public Builder status(Status status) {
this.status = checkNullToNotNull(this.status, status, "status");
return this;
}
public Builder numTests(int numTests) {
this.numTests = checkNullToNotNull(this.numTests, numTests, "numTests");
return this;
}
public Builder numFailures(int numFailures) {
this.numFailures = checkNullToNotNull(this.numFailures, numFailures, "numFailures");
return this;
}
public Builder childResults(List<TestResult> childResults) {
this.childResults = checkNullToNotNull(this.childResults, childResults, "childResults");
return this;
}
public TestResult build() {
return new TestResult(this);
}
private static <T> T checkNullToNotNull(T currValue, T newValue, String desc) {
if (currValue != null) {
throw new IllegalStateException(desc + " already set");
}
return checkNotNull(newValue, desc + " is null");
}
}
}