Add the CLIReporter and its tests.
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details

main 0.9.0
KKlochko 2 years ago
parent 9945480a6a
commit b57b005d97

@ -0,0 +1,95 @@
package space.kklochko.simple_jbdd.tests.reports;
import space.kklochko.simple_jbdd.tests.factories.meta.AbstractTestCommandMetaDataFactory;
import space.kklochko.simple_jbdd.tests.reports.fmt.AbstractTestReportFormatter;
import java.util.AbstractMap;
import java.util.ArrayList;
import org.apache.commons.lang3.StringUtils;
public class CLIReporter extends AbstractReporter {
final int terminalWidth = 80;
public CLIReporter(ArrayList<AbstractMap.SimpleEntry<AbstractTestCommandMetaDataFactory, Boolean>> metadata, AbstractTestReportFormatter formatter) {
super(metadata, formatter);
}
public void report() {
ArrayList<AbstractMap.SimpleEntry<String, Boolean>> testData = format();
ArrayList<AbstractMap.SimpleEntry<String, Boolean>> failedTestData = getFailedTests(testData);
int passed = count(testData, true);
int failed = count(testData, false);
System.out.printf("%s\n", center(" Tests "));
printTests(testData);
if(failed != 0) {
System.out.printf("\n%s\n", center(" Errors "));
printTests(failedTestData);
}
System.out.printf("\n%s\n", center(" Summary "));
System.out.print(summary(passed, failed));
}
public ArrayList<AbstractMap.SimpleEntry<String, Boolean>> format() {
ArrayList<AbstractMap.SimpleEntry<String, Boolean>> data = new ArrayList<>();
for(var pair : getMetadata()) {
boolean isPassed = pair.getValue();
getFormatter().setTestMetaData(pair.getKey().create());
getFormatter().setPassed(isPassed);
data.add(new AbstractMap.SimpleEntry<>(getFormatter().format(), isPassed));
}
return data;
}
public ArrayList<AbstractMap.SimpleEntry<String, Boolean>> getFailedTests(ArrayList<AbstractMap.SimpleEntry<String, Boolean>> testData) {
ArrayList<AbstractMap.SimpleEntry<String, Boolean>> failed = new ArrayList<>();
for(var pair : testData) {
boolean isPassed = pair.getValue();
if(isPassed) continue;
failed.add(pair);
}
return failed;
}
public int count(ArrayList<AbstractMap.SimpleEntry<String, Boolean>> testData, boolean isPassedStatus) {
int count = 0;
for(var pair : testData) {
boolean isPassed = pair.getValue();
if(isPassed == isPassedStatus)
count++;
}
return count;
}
public void printTests(ArrayList<AbstractMap.SimpleEntry<String, Boolean>> testData) {
for(var pair : testData) {
System.out.print(pair.getKey());
}
}
public String center(String content) {
return StringUtils.center(content, 80, '=');
}
public String summary(int passed, int failed) {
int all = passed + failed;
double passedPercent = (double) passed / (double) all * 100.0;
double failedPercent = (double) failed / (double) all * 100.0;
return String.format("Ran %d tests.\nPassed: %d (%.2f%%)\nFailed: %d (%.2f%%)\n", all, passed, passedPercent, failed, failedPercent);
}
}

@ -0,0 +1,72 @@
package space.kklochko.simple_jbdd.tests.reports
import space.kklochko.simple_jbdd.tests.factories.meta.AbstractTestCommandMetaDataFactory
import space.kklochko.simple_jbdd.tests.reports.fmt.AbstractTestReportFormatter
import space.kklochko.simple_jbdd.tests.reports.fmt.SimpleTestReportFormatter
import spock.lang.Narrative
import spock.lang.Specification
import spock.lang.Subject
import spock.lang.Title
@Narrative("""The reporter must generate a report in the same format, so
those tests check if the reporter generate it right.
""")
@Title("Unit tests for CLIReporter.format()")
class CLIReporterFormatMethodSpec extends Specification {
private metaData
def setup() {
def factory = Mock(AbstractTestCommandMetaDataFactory) {
create() >> [
new AbstractMap.SimpleEntry<>("Title", "A simple test"),
new AbstractMap.SimpleEntry<>("Then", "Then block")
]
}
def metaData = [
new AbstractMap.SimpleEntry<>(factory, true),
new AbstractMap.SimpleEntry<>(factory, false)
]
this.metaData = metaData
}
def "Format function use formatter twice."() {
given: "I have a formatter"
def formatter = Mock(AbstractTestReportFormatter)
and: "I have a reporter"
@Subject
def reporter = new CLIReporter(metaData, formatter)
when: "Generate the summary format"
def formattedTestData = reporter.format()
then: "The methods must called 2 times"
2 * formatter.format()
2 * formatter.setPassed(_)
2 * formatter.setTestMetaData(_)
and: "The data must have 2 elements"
2 == formattedTestData.size()
}
def "Format function returns the formatted data."() {
given: "I have a formatter"
def formatter = new SimpleTestReportFormatter()
and: "I have a reporter"
@Subject
def reporter = new CLIReporter(metaData, formatter)
when: "Generate the summary format"
def formattedTestData = reporter.format()
then: "The format must have not null values"
formattedTestData.every({ it.getKey() != null })
and: "The data must have 2 elements"
2 == formattedTestData.size()
}
}

@ -0,0 +1,77 @@
package space.kklochko.simple_jbdd.tests.reports
import space.kklochko.simple_jbdd.tests.factories.meta.AbstractTestCommandMetaDataFactory
import space.kklochko.simple_jbdd.tests.reports.fmt.AbstractTestReportFormatter
import space.kklochko.simple_jbdd.tests.reports.fmt.SimpleTestReportFormatter
import spock.lang.Narrative
import spock.lang.Specification
import spock.lang.Subject
import spock.lang.Title
@Narrative("""The reporter must generate a report in the same format, so
those tests check if the reporter generate it right.
""")
@Title("Unit tests for CLIReporter")
class CLIReporterSpec extends Specification {
def "Function, getFailedTest, returns the data of failed tests."() {
given: "I have a reporter"
@Subject
def reporter = new CLIReporter(null, null)
and: "I have a testData"
def passedTestPair = new AbstractMap.SimpleEntry<>("Passed", true)
def failedTestPair = new AbstractMap.SimpleEntry<>("Failed", false)
def testData = Collections.nCopies(countPassed, passedTestPair) + Collections.nCopies(countFailed, failedTestPair)
when: "Generate the summary format"
def failedTestData = reporter.getFailedTests(testData)
then: "The format must be the same"
failedTestData.every({ it.getKey() == "Failed" && it.getValue() == false})
expectedFailedCount == failedTestData.size()
where: "Possible variants of tests"
countPassed | countFailed || expectedFailedCount
5 | 10 || 10
}
def "Count function returns the count of passed or failed tests."() {
given: "I have a reporter"
@Subject
def reporter = new CLIReporter(null, null)
and: "I have a testData"
def passedTestPair = new AbstractMap.SimpleEntry<>("Passed", true)
def failedTestPair = new AbstractMap.SimpleEntry<>("Failed", false)
def testData = Collections.nCopies(countPassed, passedTestPair) + Collections.nCopies(countFailed, failedTestPair)
when: "Generate the summary format"
def count = reporter.count(testData, isPassed)
then: "The format must be the same"
expectedCount == count
where: "Possible variants of tests"
countPassed | countFailed | isPassed || expectedCount
10 | 20 | true || 10
10 | 20 | false || 20
}
def "Summary format."() {
given: "I have a reporter"
@Subject
def reporter = new CLIReporter(null, null)
when: "Generate the summary format"
def format = reporter.summary(passed, failed)
then: "The format must be the same"
expectedFormat == format
where: "Possible variants of tests"
passed | failed || expectedFormat
10 | 20 || "Ran 30 tests.\nPassed: 10 (33.33%)\nFailed: 20 (66.67%)\n"
10 | 10 || "Ran 20 tests.\nPassed: 10 (50.00%)\nFailed: 10 (50.00%)\n"
}
}
Loading…
Cancel
Save