package net.thucydides.core.model.formatters;
import net.thucydides.core.model.NumericalFormatter;
import net.thucydides.core.model.TestResult;
import net.thucydides.core.model.TestType;
import net.thucydides.core.reports.TestOutcomeCounter;
import net.thucydides.core.reports.TestOutcomes;
public class TestCoverageFormatter {
private final TestOutcomes outcomes;
private final NumericalFormatter formatter;
public TestCoverageFormatter(TestOutcomes outcomes) {
this.outcomes = outcomes;
formatter = new NumericalFormatter();
}
public FormattedPercentageCoverage percentTests(String testType) {
return percentTests(TestType.valueOf(testType.toUpperCase()));
}
public FormattedPercentageCoverage percentTests(TestType testType) {
return new FormattedPercentageCoverage(testType);
}
public FormattedPercentageCoverage percentTests() {
return new FormattedPercentageCoverage(TestType.ANY);
}
public FormattedPercentageCoverage getPercentTests() {
return percentTests();
}
public FormattedPercentageStepCoverage getPercentSteps() {
return percentSteps();
}
public FormattedPercentageStepCoverage percentSteps() {
return percentSteps(TestType.ANY);
}
public FormattedPercentageStepCoverage percentSteps(String testType) {
return percentSteps(TestType.valueOf(testType.toUpperCase()));
}
public FormattedPercentageStepCoverage percentSteps(TestType testType) {
return new FormattedPercentageStepCoverage(testType);
}
public abstract class FormattedCoverage extends TestOutcomeCounter {
public FormattedCoverage(TestType testType) {
super(testType);
}
public String withResult(String expectedResult) {
return withResult(TestResult.valueOf(expectedResult.toUpperCase()));
}
protected abstract double percentageDeterminedResult();
protected abstract double percentageWithResult(TestResult expectedResult);
public String withResult(TestResult expectedResult) {
return formatter.percentage(percentageWithResult(expectedResult), 1);
}
public String withIndeterminateResult() {
return formatter.percentage(1 - percentageDeterminedResult(), 1);
}
public String withFailureOrError() {
return formatter.percentage(percentageWithResult(TestResult.FAILURE) + percentageWithResult(TestResult.ERROR),1);
}
public String withSkippedOrIgnored() {
return formatter.percentage(percentageWithResult(TestResult.SKIPPED) + percentageWithResult(TestResult.IGNORED),1);
}
}
public class FormattedPercentageCoverage extends FormattedCoverage {
public FormattedPercentageCoverage(TestType testType) {
super(testType);
}
@Override
protected double percentageDeterminedResult() {
return outcomes.proportionOf(testType).withResult(TestResult.ERROR)
+ outcomes.proportionOf(testType).withResult(TestResult.FAILURE)
+ outcomes.proportionOf(testType).withResult(TestResult.SUCCESS);
}
@Override
protected double percentageWithResult(TestResult expectedResult) {
return outcomes.proportionOf(testType).withResult(expectedResult);
}
}
public class FormattedPercentageStepCoverage extends FormattedCoverage {
public FormattedPercentageStepCoverage(TestType testType) {
super(testType);
}
@Override
protected double percentageDeterminedResult() {
return outcomes.proportionalStepsOf(testType).withResult(TestResult.ERROR)
+ outcomes.proportionalStepsOf(testType).withResult(TestResult.FAILURE)
+ outcomes.proportionalStepsOf(testType).withResult(TestResult.SUCCESS);
}
@Override
protected double percentageWithResult(TestResult expectedResult) {
return outcomes.proportionalStepsOf(testType).withResult(expectedResult);
}
}
}