From 3b82bf137f125de9e9723f7805506b8d33bc1b61 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Wed, 26 Feb 2025 15:07:46 +0100 Subject: [PATCH] Fix broken default configuration --- .../hafner/grading/CodeCoverageMarkdown.java | 1 - .../edu/hm/hafner/grading/GradingReport.java | 37 +++++++++++++----- .../edu/hm/hafner/grading/ScoreMarkdown.java | 15 ++++++-- src/main/resources/default-config.json | 21 +++++----- .../resources/default-no-score-config.json | 21 +++++----- .../hafner/grading/AggregatedScoreTest.java | 38 ++++++++++--------- .../hm/hafner/grading/GradingReportTest.java | 9 +++++ 7 files changed, 91 insertions(+), 51 deletions(-) diff --git a/src/main/java/edu/hm/hafner/grading/CodeCoverageMarkdown.java b/src/main/java/edu/hm/hafner/grading/CodeCoverageMarkdown.java index 2d2ef476..dc169d7b 100644 --- a/src/main/java/edu/hm/hafner/grading/CodeCoverageMarkdown.java +++ b/src/main/java/edu/hm/hafner/grading/CodeCoverageMarkdown.java @@ -8,7 +8,6 @@ * @author Tobias Effner * @author Ullrich Hafner */ -// FIXME: This class is not used and can be removed? public class CodeCoverageMarkdown extends CoverageMarkdown { static final String TYPE = "Code Coverage Score"; diff --git a/src/main/java/edu/hm/hafner/grading/GradingReport.java b/src/main/java/edu/hm/hafner/grading/GradingReport.java index 3041f36e..b18f7058 100644 --- a/src/main/java/edu/hm/hafner/grading/GradingReport.java +++ b/src/main/java/edu/hm/hafner/grading/GradingReport.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.exception.ExceptionUtils; import java.util.List; +import java.util.StringJoiner; import java.util.stream.Collectors; /** @@ -80,7 +81,8 @@ public String getMarkdownSummary(final AggregatedScore score, final String title * @param title * the title of the summary * @param showHeaders - * determines whether headers should be shown for the subsections or not + * determines whether headers should be shown for the subsections or not + * * @return Markdown text */ public String getMarkdownSummary(final AggregatedScore score, final String title, final boolean showHeaders) { @@ -115,23 +117,39 @@ public StringBuilder getSubScoreDetails(final AggregatedScore score) { * @param score * the aggregated score * @param showHeaders - * determines whether headers should be shown for the subsections or not + * determines whether headers should be shown for the subsections or not * * @return Markdown text */ public StringBuilder getSubScoreDetails(final AggregatedScore score, final boolean showHeaders) { var summary = new StringBuilder(); - summary.append(createPercentage(score)) - .append(TEST_MARKDOWN.createSummary(score, showHeaders)) - .append(CODE_COVERAGE_MARKDOWN.createSummary(score, showHeaders)) - .append(MUTATION_COVERAGE_MARKDOWN.createSummary(score, showHeaders)) - .append(ANALYSIS_MARKDOWN.createSummary(score, showHeaders)) - .append(METRIC_MARKDOWN.createSummary(score, showHeaders)); + summary.append(createPercentage(score)); + summary.append(joinSummaries(score, showHeaders)); return summary; } + private String joinSummaries(final AggregatedScore score, final boolean showHeaders) { + var joiner = new StringJoiner(showHeaders ? ScoreMarkdown.PARAGRAPH : ScoreMarkdown.LINE_BREAK_PARAGRAPH); + + add(score, showHeaders, joiner, TEST_MARKDOWN); + add(score, showHeaders, joiner, CODE_COVERAGE_MARKDOWN); + add(score, showHeaders, joiner, MUTATION_COVERAGE_MARKDOWN); + add(score, showHeaders, joiner, ANALYSIS_MARKDOWN); + add(score, showHeaders, joiner, METRIC_MARKDOWN); + + return joiner.toString(); + } + + private void add(final AggregatedScore score, final boolean showHeaders, final StringJoiner joiner, + final ScoreMarkdown markdown) { + var summary = markdown.createSummary(score, showHeaders); + if (!summary.isBlank()) { + joiner.add(summary); + } + } + /** * Creates a detailed description of the grading results in Markdown. * @@ -166,7 +184,8 @@ public String getMarkdownDetails(final AggregatedScore score, final String title * @param title * the title of the details * @param showDisabled - * determines whether disabled scores should be shown or skipped + * determines whether disabled scores should be shown or skipped + * * @return Markdown text */ public String getMarkdownDetails(final AggregatedScore score, final String title, final boolean showDisabled) { diff --git a/src/main/java/edu/hm/hafner/grading/ScoreMarkdown.java b/src/main/java/edu/hm/hafner/grading/ScoreMarkdown.java index 0f25928b..1cdab111 100644 --- a/src/main/java/edu/hm/hafner/grading/ScoreMarkdown.java +++ b/src/main/java/edu/hm/hafner/grading/ScoreMarkdown.java @@ -7,6 +7,7 @@ import edu.hm.hafner.grading.TruncatedString.TruncatedStringBuilder; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -42,6 +43,7 @@ abstract class ScoreMarkdown, C extends Configuration> { private static final String TRUNCATION_TEXT = "\n\nToo many test failures. Grading output truncated.\n\n"; private static final int HUNDRED_PERCENT = 100; + // FIXME: type is not used, Should we remove default name from score? private final String type; private final String icon; @@ -166,15 +168,20 @@ public String createSummary(final AggregatedScore aggregation) { * @return returns the summary in Markdown */ public String createSummary(final AggregatedScore aggregation, final boolean showHeaders) { - var summaries = new StringBuilder(1024); + var summaries = new ArrayList(); for (S score : createScores(aggregation)) { + var builder = new StringBuilder(); if (showHeaders) { - summaries.append(getTitle(score, 3)).append(PARAGRAPH); + builder.append(getTitle(score, 3)).append(PARAGRAPH); } var subScores = createSummaryOfSubScores(score); - summaries.append(String.join(LINE_BREAK_PARAGRAPH, subScores)); + builder.append(String.join(LINE_BREAK_PARAGRAPH, subScores)); + summaries.add(builder.toString()); } - return summaries.toString(); + if (showHeaders) { + return String.join(PARAGRAPH, summaries); + } + return String.join(LINE_BREAK_PARAGRAPH, summaries); } private List createSummaryOfSubScores(final S score) { diff --git a/src/main/resources/default-config.json b/src/main/resources/default-config.json index 776eac6c..88de5b34 100644 --- a/src/main/resources/default-config.json +++ b/src/main/resources/default-config.json @@ -1,16 +1,15 @@ { "tests": { "name": "Tests", + "id": "tests", "tools": [ { - "id": "test", - "name": "Tests", + "id": "junit", + "name": "JUnit Tests", "pattern": "**/target/*-reports/TEST*.xml" } ], - "passedImpact": 0, - "skippedImpact": -1, - "failureImpact": -5, + "failureRateImpact": -1, "maxScore": 100 }, "analysis": [ @@ -20,12 +19,10 @@ "tools": [ { "id": "checkstyle", - "name": "CheckStyle", "pattern": "**/target/**checkstyle-result.xml" }, { "id": "pmd", - "name": "PMD", "pattern": "**/target/**pmd.xml" } ], @@ -42,7 +39,6 @@ "tools": [ { "id": "spotbugs", - "name": "SpotBugs", "sourcePath": "src/main/java", "pattern": "**/target/spotbugsXml.xml" } @@ -60,14 +56,12 @@ "tools": [ { "id": "jacoco", - "name": "Line Coverage", "metric": "line", "sourcePath": "src/main/java", "pattern": "**/target/site/jacoco/jacoco.xml" }, { "id": "jacoco", - "name": "Branch Coverage", "metric": "branch", "sourcePath": "src/main/java", "pattern": "**/target/site/jacoco/jacoco.xml" @@ -81,10 +75,15 @@ "tools": [ { "id": "pit", - "name": "Mutation Coverage", "metric": "mutation", "sourcePath": "src/main/java", "pattern": "**/target/pit-reports/mutations.xml" + }, + { + "id": "pit", + "metric": "test-strength", + "sourcePath": "src/main/java", + "pattern": "**/target/pit-reports/mutations.xml" } ], "maxScore": 100, diff --git a/src/main/resources/default-no-score-config.json b/src/main/resources/default-no-score-config.json index 16d86ed1..9dc0d118 100644 --- a/src/main/resources/default-no-score-config.json +++ b/src/main/resources/default-no-score-config.json @@ -1,13 +1,14 @@ { "tests": { + "name": "Tests", + "id": "tests", "tools": [ { - "id": "test", - "name": "Tests", + "id": "junit", + "name": "JUnit Tests", "pattern": "**/target/*-reports/TEST*.xml" } - ], - "name": "Tests" + ] }, "analysis": [ { @@ -16,12 +17,10 @@ "tools": [ { "id": "checkstyle", - "name": "CheckStyle", "pattern": "**/target/**checkstyle-result.xml" }, { "id": "pmd", - "name": "PMD", "pattern": "**/target/**pmd.xml" } ] @@ -33,7 +32,6 @@ "tools": [ { "id": "spotbugs", - "name": "SpotBugs", "sourcePath": "src/main/java", "pattern": "**/target/spotbugsXml.xml" } @@ -46,14 +44,12 @@ "tools": [ { "id": "jacoco", - "name": "Line Coverage", "metric": "line", "sourcePath": "src/main/java", "pattern": "**/target/site/jacoco/jacoco.xml" }, { "id": "jacoco", - "name": "Branch Coverage", "metric": "branch", "sourcePath": "src/main/java", "pattern": "**/target/site/jacoco/jacoco.xml" @@ -69,6 +65,13 @@ "metric": "mutation", "sourcePath": "src/main/java", "pattern": "**/target/pit-reports/mutations.xml" + }, + { + "id": "pit", + "name": "Test Strength", + "metric": "test-strength", + "sourcePath": "src/main/java", + "pattern": "**/target/pit-reports/mutations.xml" } ] } diff --git a/src/test/java/edu/hm/hafner/grading/AggregatedScoreTest.java b/src/test/java/edu/hm/hafner/grading/AggregatedScoreTest.java index 5428a612..2e3e1e85 100644 --- a/src/test/java/edu/hm/hafner/grading/AggregatedScoreTest.java +++ b/src/test/java/edu/hm/hafner/grading/AggregatedScoreTest.java @@ -1,13 +1,5 @@ package edu.hm.hafner.grading; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.util.Objects; - import org.junit.jupiter.api.Test; import com.google.errorprone.annotations.MustBeClosed; @@ -26,6 +18,14 @@ import edu.hm.hafner.util.SerializableTest; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Objects; + import static edu.hm.hafner.grading.assertions.Assertions.*; class AggregatedScoreTest extends SerializableTest { @@ -242,19 +242,22 @@ class AggregatedScoreTest extends SerializableTest { private static final String QUALITY_CONFIGURATION = """ { "tests": [{ + "name": "JUnit Tests", + "icon": "construction", "tools": [ - { - "id": "itest", + { + "icon": "vertical_traffic_light", + "id": "junit", "name": "Integrationstests", "pattern": "target/i-junit.xml" }, { - "id": "mtest", + "icon": "vertical_traffic_light", + "id": "junit", "name": "Modultests", "pattern": "target/u-junit.xml" } - ], - "name": "JUnit" + ] }], "analysis": [ { @@ -283,6 +286,7 @@ class AggregatedScoreTest extends SerializableTest { ], "coverage": [ { + "name": "Code Coverage", "tools": [ { "id": "jacoco", @@ -296,10 +300,11 @@ class AggregatedScoreTest extends SerializableTest { "metric": "branch", "pattern": "target/jacoco.xml" } - ], - "name": "JaCoCo" + ] }, { + "name": "Mutation Coverage", + "icon": "microscope", "tools": [ { "id": "pit", @@ -307,8 +312,7 @@ class AggregatedScoreTest extends SerializableTest { "metric": "mutation", "pattern": "target/pit.xml" } - ], - "name": "PIT" + ] } ] } diff --git a/src/test/java/edu/hm/hafner/grading/GradingReportTest.java b/src/test/java/edu/hm/hafner/grading/GradingReportTest.java index cb30fc70..51b465e0 100644 --- a/src/test/java/edu/hm/hafner/grading/GradingReportTest.java +++ b/src/test/java/edu/hm/hafner/grading/GradingReportTest.java @@ -132,6 +132,9 @@ void shouldCreateAllGradingResults() { "Cognitive Complexity: 100", "N-Path Complexity: ", "Non Commenting Source Statements: "); + assertThat(results.getMarkdownSummary(score, "Summary")) + .isEqualTo("Strange"); + assertThat(results.getTextSummary(score)).isEqualTo( "Autograding score - 167 of 500 (33%)"); assertThat(results.getMarkdownDetails(score)).contains( @@ -157,6 +160,12 @@ void shouldCreateAllQualityResults() { var results = new GradingReport(); var score = AggregatedScoreTest.createQualityAggregation(); + + assertThat(results.getMarkdownSummary(score, "Summary", true)) + .contains("JUnit Tests", "Code Coverage", "Mutation Coverage", "Style"); + assertThat(results.getMarkdownSummary(score, "Summary")) + .doesNotContain("JUnit Tests", "Code Coverage", "Style"); + assertThat(results.getMarkdownSummary(score, "Summary")).contains( "Integrationstests: 42% successful", "4 failed", "5 passed", "3 skipped", "Modultests: 0% successful", "10 failed",