Skip to content

Commit

Permalink
Merge 207b111 into faaa2d4
Browse files Browse the repository at this point in the history
  • Loading branch information
uhafner authored Dec 15, 2023
2 parents faaa2d4 + 207b111 commit 938bfcd
Show file tree
Hide file tree
Showing 19 changed files with 480 additions and 135 deletions.
28 changes: 16 additions & 12 deletions src/main/java/edu/hm/hafner/grading/AggregatedScore.java
Original file line number Diff line number Diff line change
Expand Up @@ -183,14 +183,10 @@ public boolean hasMutationCoverage() {

private List<CoverageConfiguration> getMutationCoverageConfigurations() {
return coverageConfigurations.stream()
.filter(configuration -> isMutation(configuration.getId(), configuration.getName()))
.filter(CoverageConfiguration::isMutationCoverage)
.toList();
}

private boolean isMutation(final String id, final String name) {
return StringUtils.containsAnyIgnoreCase(id + name, CoverageConfiguration.MUTATION_IDS);
}

private List<CoverageConfiguration> getCodeCoverageConfigurations() {
List<CoverageConfiguration> configurations = new ArrayList<>(coverageConfigurations);
configurations.removeAll(getMutationCoverageConfigurations());
Expand Down Expand Up @@ -284,7 +280,7 @@ public List<CoverageScore> getCoverageScores() {
*/
public List<CoverageScore> getMutationCoverageScores() {
return coverageScores.stream()
.filter(score -> isMutation(score.getId(), score.getName()))
.filter(score -> score.getConfiguration().isMutationCoverage())
.toList();
}

Expand Down Expand Up @@ -413,8 +409,7 @@ public void gradeAnalysis(final AnalysisReportFactory factory) {

analysisScores.add(aggregation);

log.logInfo("=> %s Score: %d of %d", analysisConfiguration.getName(), aggregation.getValue(),
aggregation.getMaxScore());
logResult(analysisConfiguration, aggregation);
}
}

Expand Down Expand Up @@ -448,8 +443,7 @@ public void gradeCoverage(final CoverageReportFactory factory) {

coverageScores.add(aggregation);

log.logInfo("=> %s Score: %d of %d", coverageConfiguration.getName(), aggregation.getValue(),
aggregation.getMaxScore());
logResult(coverageConfiguration, aggregation);
}
}

Expand Down Expand Up @@ -483,8 +477,18 @@ public void gradeTests(final TestReportFactory factory) {

testScores.add(aggregation);

log.logInfo("=> %s Score: %d of %d", testConfiguration.getName(), aggregation.getValue(),
aggregation.getMaxScore());
logResult(testConfiguration, aggregation);
}
}

private void logResult(final Configuration configuration, final Score<?, ?> score) {
if (score.hasMaxScore()) {
log.logInfo("=> %s Score: %d of %d",
configuration.getName(), score.getValue(), score.getMaxScore());
}
else {
log.logInfo("=> %s: %s",
configuration.getName(), score.createSummary());
}
}

Expand Down
52 changes: 19 additions & 33 deletions src/main/java/edu/hm/hafner/grading/AnalysisMarkdown.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,11 @@ protected void createSpecificDetails(final AggregatedScore aggregation, final Li
for (AnalysisScore score : scores) {
details.addText(getTitle(score, 2))
.addNewline()
.addText(formatColumns("Name", "Errors", "Warning High", "Warning Normal", "Warning Low",
"Total", "Impact"))
.addText(formatColumns("Name", "Errors", "Warning High", "Warning Normal", "Warning Low", "Total"))
.addTextIf(formatColumns("Impact"), score.hasMaxScore())
.addNewline()
.addText(formatColumns(":-:", ":-:", ":-:", ":-:", ":-:", ":-:", ":-:"))
.addText(formatColumns(":-:", ":-:", ":-:", ":-:", ":-:", ":-:"))
.addTextIf(formatColumns(":-:"), score.hasMaxScore())
.addNewline();

score.getSubScores().forEach(subScore -> details
Expand All @@ -44,8 +45,8 @@ protected void createSpecificDetails(final AggregatedScore aggregation, final Li
String.valueOf(subScore.getHighSeveritySize()),
String.valueOf(subScore.getNormalSeveritySize()),
String.valueOf(subScore.getLowSeveritySize()),
String.valueOf(subScore.getTotalSize()),
String.valueOf(subScore.getImpact())))
String.valueOf(subScore.getTotalSize())))
.addTextIf(formatColumns(String.valueOf(subScore.getImpact())), score.hasMaxScore())
.addNewline());

if (score.getSubScores().size() > 1) {

Check warning on line 52 in src/main/java/edu/hm/hafner/grading/AnalysisMarkdown.java

View check run for this annotation

GitHub Actions / Quality Checks

Mutation survived

One mutation survived in line 52 (ConditionalsBoundaryMutator)
Raw output
Survived mutations:
- changed conditional boundary (org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator)
Expand All @@ -54,41 +55,26 @@ protected void createSpecificDetails(final AggregatedScore aggregation, final Li
sum(aggregation, AnalysisScore::getHighSeveritySize),
sum(aggregation, AnalysisScore::getNormalSeveritySize),
sum(aggregation, AnalysisScore::getLowSeveritySize),
sum(aggregation, AnalysisScore::getTotalSize),
sum(aggregation, AnalysisScore::getImpact)))
sum(aggregation, AnalysisScore::getTotalSize)))
.addTextIf(formatBoldColumns(sum(aggregation, AnalysisScore::getImpact)), score.hasMaxScore())
.addNewline();
}

var configuration = score.getConfiguration();
details.addText(formatColumns(IMPACT))
.addText(formatItalicColumns(
renderImpact(configuration.getErrorImpact()),
renderImpact(configuration.getHighImpact()),
renderImpact(configuration.getNormalImpact()),
renderImpact(configuration.getLowImpact())))
.addText(formatColumns(TOTAL, LEDGER))
.addNewline();
if (score.hasMaxScore()) {
var configuration = score.getConfiguration();
details.addText(formatColumns(IMPACT))
.addText(formatItalicColumns(
renderImpact(configuration.getErrorImpact()),
renderImpact(configuration.getHighImpact()),
renderImpact(configuration.getNormalImpact()),
renderImpact(configuration.getLowImpact())))
.addText(formatColumns(TOTAL, LEDGER))
.addNewline();
}
}
}

private int sum(final AggregatedScore score, final Function<AnalysisScore, Integer> property) {
return score.getAnalysisScores().stream().map(property).reduce(Integer::sum).orElse(0);
}

@Override
protected void createSpecificSummary(final AnalysisScore score, final StringBuilder summary) {
if (score.getReport().isEmpty()) {
summary.append("No warnings found");
}
else {
summary.append(String.format("%d warning%s found (%d error%s, %d high, %d normal, %d low)",
score.getTotalSize(), plural(score.getTotalSize()),
score.getErrorSize(), plural(score.getErrorSize()),
score.getHighSeveritySize(), score.getNormalSeveritySize(), score.getLowSeveritySize()));
}
}

private String plural(final int score) {
return score > 1 ? "s" : "";
}
}
17 changes: 17 additions & 0 deletions src/main/java/edu/hm/hafner/grading/AnalysisScore.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,23 @@ public int getTotalSize() {
return getErrorSize() + getHighSeveritySize() + getNormalSeveritySize() + getLowSeveritySize();
}

@Override
protected String createSummary() {
if (getReport().isEmpty()) {
return "No warnings found";
}
else {
return String.format("%d warning%s found (%d error%s, %d high, %d normal, %d low)",
getTotalSize(), plural(getTotalSize()),
getErrorSize(), plural(getErrorSize()),
getHighSeveritySize(), getNormalSeveritySize(), getLowSeveritySize());
}
}

private String plural(final int score) {
return score > 1 ? "s" : "";
}

@Override @Generated
public boolean equals(final Object o) {
if (this == o) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/edu/hm/hafner/grading/AutoGradingRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public AutoGradingRunner() {
* @return the grading score
*/
public AggregatedScore run() {
var log = new FilteredLog("Autograding Action Errors:");
var log = new FilteredLog("Errors:");

var logHandler = new LogHandler(outputStream, log);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class CodeCoverageMarkdown extends CoverageMarkdown {
* Creates a new Markdown renderer for code coverage results.
*/
public CodeCoverageMarkdown() {
super(TYPE, "footprints", "Covered %", "Missed %", "coverage achieved");
super(TYPE, "footprints", "Covered %", "Missed %");
}

@Override
Expand Down
15 changes: 13 additions & 2 deletions src/main/java/edu/hm/hafner/grading/CoverageConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public final class CoverageConfiguration extends Configuration {
@Serial
private static final long serialVersionUID = 3L;
private static final String COVERAGE_ID = "coverage";
static final String[] MUTATION_IDS = {"pitest", "mutation", "pit"};
private static final String[] MUTATION_IDS = {"pitest", "mutation", "pit"};

/**
* Converts the specified JSON object to a list of {@link CoverageConfiguration} instances.
Expand Down Expand Up @@ -55,7 +55,8 @@ protected String getDefaultName() {
return "Code Coverage";
}

@Override @JsonIgnore
@Override
@JsonIgnore
public boolean isPositive() {
return coveredPercentageImpact >= 0 && missedPercentageImpact >= 0;

Check warning on line 61 in src/main/java/edu/hm/hafner/grading/CoverageConfiguration.java

View check run for this annotation

GitHub Actions / Quality Checks

Partially covered line

Line 61 is only partially covered, one branch is missing

Check warning on line 61 in src/main/java/edu/hm/hafner/grading/CoverageConfiguration.java

View check run for this annotation

GitHub Actions / Quality Checks

Mutation survived

2 mutations survived in line 61
Raw output
Survived mutations:
- changed conditional boundary (org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator)
- changed conditional boundary (org.pitest.mutationtest.engine.gregor.mutators.ConditionalsBoundaryMutator)
}
Expand All @@ -68,6 +69,16 @@ public int getMissedPercentageImpact() {
return missedPercentageImpact;
}

/**
* Determines whether the specified ID or name are related to mutation coverage or to code coverage.
*
* @return {@code true} if this configuration is for mutation coverage, {@code false} if this configuration is for
* code coverage
*/
public boolean isMutationCoverage() {
return StringUtils.containsAnyIgnoreCase(getId() + getName(), CoverageConfiguration.MUTATION_IDS);
}

@Override
public boolean equals(final Object o) {
if (this == o) {
Expand Down
44 changes: 18 additions & 26 deletions src/main/java/edu/hm/hafner/grading/CoverageMarkdown.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,12 @@
abstract class CoverageMarkdown extends ScoreMarkdown<CoverageScore, CoverageConfiguration> {
private final String coveredText;
private final String missedText;
private final String summaryText;

CoverageMarkdown(final String type, final String icon, final String coveredText, final String missedText,
final String summaryText) {
CoverageMarkdown(final String type, final String icon, final String coveredText, final String missedText) {
super(type, icon);

this.coveredText = coveredText;
this.missedText = missedText;
this.summaryText = summaryText;
}

@Override
Expand All @@ -30,43 +27,38 @@ protected void createSpecificDetails(final AggregatedScore aggregation, final Li
for (CoverageScore score : scores) {
details.addText(getTitle(score, 2))
.addNewline()
.addText(formatColumns("Name", coveredText, missedText, "Impact"))
.addText(formatColumns("Name", coveredText, missedText))
.addTextIf(formatColumns("Impact"), score.hasMaxScore())
.addNewline()
.addText(formatColumns(":-:", ":-:", ":-:", ":-:"))
.addText(formatColumns(":-:", ":-:", ":-:"))
.addTextIf(formatColumns(":-:"), score.hasMaxScore())
.addNewline();

score.getSubScores().forEach(subScore -> details
.addText(formatColumns(
subScore.getName(),
String.valueOf(subScore.getCoveredPercentage()),
String.valueOf(subScore.getMissedPercentage()),
String.valueOf(subScore.getImpact())))
String.valueOf(subScore.getMissedPercentage())))
.addTextIf(formatColumns(String.valueOf(subScore.getImpact())), score.hasMaxScore())
.addNewline());

if (score.getSubScores().size() > 1) {
details.addText(formatBoldColumns("Total Ø",
score.getCoveredPercentage(),
score.getMissedPercentage(),
score.getImpact()))
score.getMissedPercentage()))
.addTextIf(formatBoldColumns(score.getImpact()), score.hasMaxScore())
.addNewline();
}

var configuration = score.getConfiguration();
details.addText(formatColumns(IMPACT))
.addText(formatItalicColumns(
renderImpact(configuration.getCoveredPercentageImpact()),
renderImpact(configuration.getMissedPercentageImpact())))
.addText(formatColumns(LEDGER))
.addNewline();
if (score.hasMaxScore()) {
var configuration = score.getConfiguration();
details.addText(formatColumns(IMPACT))
.addText(formatItalicColumns(
renderImpact(configuration.getCoveredPercentageImpact()),
renderImpact(configuration.getMissedPercentageImpact())))
.addText(formatColumns(LEDGER))
.addNewline();
}
}
}

@Override
protected void createSpecificSummary(final CoverageScore score, final StringBuilder summary) {
summary.append(String.format("%d%% %s", score.getCoveredPercentage(), getPlainText(summaryText)));
}

private String getPlainText(final String label) {
return label.replace("%", "");
}
}
9 changes: 9 additions & 0 deletions src/main/java/edu/hm/hafner/grading/CoverageScore.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,15 @@ public int getMissedPercentage() {
return 100 - coveredPercentage;
}

@Override
protected String createSummary() {
return String.format("%d%% %s", getCoveredPercentage(), getItemName());
}

private String getItemName() {
return getConfiguration().isMutationCoverage() ? "mutations killed" : "coverage achieved";
}

@Override
@Generated
public boolean equals(final Object o) {
Expand Down
Loading

0 comments on commit 938bfcd

Please sign in to comment.