From 276f3858c6c6b057a036c5eaa6b55e3328f528e6 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Sun, 30 Jun 2024 20:53:39 +0200 Subject: [PATCH] Do not convert complexity density into a percentage. The density should be reported as a float value. --- .../metrics/model/ElementFormatter.java | 18 +++++-- .../metrics/steps/CoverageMetricColumn.java | 2 +- .../metrics/steps/CoverageTableModel.java | 8 +-- .../metrics/model/ElementFormatterTest.java | 51 +++++++++++++++++++ .../metrics/restapi/CoverageApiITest.java | 2 +- ...-publisher-overview.checks-expected-result | 2 +- ...e-publisher-summary.checks-expected-result | 2 +- ...ality-gate-overview.checks-expected-result | 2 +- ...lisher-s+b-overview.checks-expected-result | 4 +- ...s+mcdc+fcc-overview.checks-expected-result | 2 +- ...her-s+mcdc-overview.checks-expected-result | 2 +- ...e-publisher-summary.checks-expected-result | 2 +- 12 files changed, 80 insertions(+), 17 deletions(-) diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatter.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatter.java index dceb0923..fac008d3 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatter.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatter.java @@ -51,7 +51,11 @@ public String getTooltip(final Value value) { if (value instanceof IntegerValue) { return String.format("%s: %d", getLabel(value.getMetric()), ((IntegerValue) value).getValue()); } - return formatValueWithMetric(value) + " (" + formatAdditionalInformation(value) + ")"; + var additional = formatAdditionalInformation(value); + if (additional.isBlank()) { + return formatValueWithMetric(value); + } + return formatValueWithMetric(value) + " (" + additional + ")"; } /** @@ -88,6 +92,9 @@ public String format(final Value value, final Locale locale) { return String.valueOf(((IntegerValue) value).getValue()); } if (value instanceof FractionValue) { + if (value.getMetric() == Metric.COMPLEXITY_DENSITY) { + return String.format(locale, "%.2f", ((FractionValue) value).getFraction().doubleValue()); + } return formatDelta(((FractionValue) value).getFraction(), value.getMetric(), locale); } return value.toString(); @@ -119,7 +126,7 @@ public String formatDetails(final Value value) { * * @return the formatted value as plain text */ - public String formatDetails(final Value value, final Locale locale) { + private String formatDetails(final Value value, final Locale locale) { if (value instanceof Coverage) { var coverage = (Coverage) value; return formatPercentage(coverage, locale) @@ -129,6 +136,9 @@ public String formatDetails(final Value value, final Locale locale) { return String.valueOf(((IntegerValue) value).getValue()); } if (value instanceof FractionValue) { + if (value.getMetric() == Metric.COMPLEXITY_DENSITY) { + return String.format(locale, "%.2f", ((FractionValue) value).getFraction().doubleValue()); + } return String.format(locale, "%.2f%%", ((FractionValue) value).getFraction().doubleValue()); } return value.toString(); @@ -210,7 +220,6 @@ else if (value instanceof FractionValue) { * * @return the value formatted as a string */ - @SuppressWarnings("unused") // Called by jelly view public String formatValue(final Value value) { return formatDetails(value, Functions.getCurrentLocale()); } @@ -353,6 +362,9 @@ public String formatDelta(final Fraction fraction, final Metric metric, final Lo || metric.equals(Metric.TESTS)) { return String.format(locale, "%+d", fraction.intValue()); } + if (metric == Metric.COMPLEXITY_DENSITY) { + return String.format(locale, "%+.2f", fraction.doubleValue()); + } return String.format(locale, "%+.2f%%", new SafeFraction(fraction).multiplyBy(HUNDRED).doubleValue()); } diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageMetricColumn.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageMetricColumn.java index 8a54a9b5..bfc8e463 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageMetricColumn.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageMetricColumn.java @@ -132,7 +132,7 @@ public String formatMetric(final Value value) { */ @SuppressWarnings("unused") // Called by jelly view public String formatValue(final Value value) { - return FORMATTER.formatDetails(value, Functions.getCurrentLocale()); + return FORMATTER.formatValue(value); } /** diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTableModel.java b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTableModel.java index cb9f5e05..bfedfe9b 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTableModel.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/metrics/steps/CoverageTableModel.java @@ -6,6 +6,7 @@ import java.util.Locale; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.Fraction; import edu.hm.hafner.coverage.Coverage; @@ -35,7 +36,6 @@ import io.jenkins.plugins.datatables.TableConfiguration; import io.jenkins.plugins.datatables.TableConfiguration.SelectStyle; import io.jenkins.plugins.datatables.TableModel; -import org.apache.commons.lang3.StringUtils; import static j2html.TagCreator.*; @@ -119,11 +119,11 @@ public List getColumns() { Messages.Column_DeltaLineCoverage("Δ"), columns); configureValueColumn("branchCoverage", Metric.BRANCH, Messages.Column_BranchCoverage(), Messages.Column_DeltaBranchCoverage("Δ"), columns); - + /* VectorCAST metrics */ - configureValueColumn("mcdcPairCoverage", Metric.MCDC_PAIR, Messages.Column_MCDCPairs(), + configureValueColumn("mcdcPairCoverage", Metric.MCDC_PAIR, Messages.Column_MCDCPairs(), "", columns); - configureValueColumn("functionCallCoverage", Metric.FUNCTION_CALL, Messages.Column_FunctionCall(), + configureValueColumn("functionCallCoverage", Metric.FUNCTION_CALL, Messages.Column_FunctionCall(), "", columns); configureValueColumn("mutationCoverage", Metric.MUTATION, Messages.Column_MutationCoverage(), diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatterTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatterTest.java index 3f81582a..dbfb9ad8 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatterTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/model/ElementFormatterTest.java @@ -6,12 +6,63 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; +import org.junitpioneer.jupiter.DefaultLocale; +import edu.hm.hafner.coverage.Coverage; +import edu.hm.hafner.coverage.FractionValue; +import edu.hm.hafner.coverage.LinesOfCode; import edu.hm.hafner.coverage.Metric; import static org.assertj.core.api.Assertions.*; +@DefaultLocale("en") class ElementFormatterTest { + @Test + void shouldFormatTooltip() { + var formatter = new ElementFormatter(); + + var density = new FractionValue(Metric.COMPLEXITY_DENSITY, 33, 100); + assertThat(formatter.getTooltip(density)).isEqualTo("Complexity Density: 0.33"); + assertThat(formatter.format(density)).isEqualTo("0.33"); + assertThat(formatter.formatDetails(density)).isEqualTo("0.33"); + assertThat(formatter.formatValue(density)).isEqualTo("0.33"); + assertThat(formatter.formatAdditionalInformation(density)).isEmpty(); + + var loc = new LinesOfCode(123); + assertThat(formatter.getTooltip(loc)).isEqualTo("LOC: 123"); + assertThat(formatter.format(loc)).isEqualTo("123"); + assertThat(formatter.formatDetails(loc)).isEqualTo("123"); + assertThat(formatter.formatValue(loc)).isEqualTo("123"); + assertThat(formatter.formatAdditionalInformation(loc)).isEmpty(); + + var empty = Coverage.nullObject(Metric.BRANCH); + assertThat(formatter.getTooltip(empty)).isEqualTo("Branch Coverage: -"); + assertThat(formatter.format(empty)).isEqualTo("-"); + assertThat(formatter.formatDetails(empty)).isEqualTo("-"); + assertThat(formatter.formatValue(empty)).isEqualTo("-"); + assertThat(formatter.formatAdditionalInformation(empty)).isEmpty(); + + var line = Coverage.valueOf("LINE: 3/4"); + assertThat(formatter.getTooltip(line)).isEqualTo("Line Coverage: 75.00% (Covered: 3 - Missed: 1)"); + assertThat(formatter.format(line)).isEqualTo("75.00%"); + assertThat(formatter.formatDetails(line)).isEqualTo("75.00% (3/4)"); + assertThat(formatter.formatValue(line)).isEqualTo("75.00% (3/4)"); + assertThat(formatter.formatAdditionalInformation(line)).isEqualTo("Covered: 3 - Missed: 1"); + + var mutation = Coverage.valueOf("MUTATION: 3/4"); + assertThat(formatter.getTooltip(mutation)).isEqualTo("Mutation Coverage: 75.00% (Killed: 3 - Survived: 1)"); + assertThat(formatter.format(mutation)).isEqualTo("75.00%"); + assertThat(formatter.formatDetails(mutation)).isEqualTo("75.00% (3/4)"); + assertThat(formatter.formatValue(mutation)).isEqualTo("75.00% (3/4)"); + assertThat(formatter.formatAdditionalInformation(mutation)).isEqualTo("Killed: 3 - Survived: 1"); + + var delta = new FractionValue(Metric.FILE, 1, 5); + assertThat(formatter.getTooltip(delta)).isEqualTo("File Coverage: +20.00%"); + assertThat(formatter.format(delta)).isEqualTo("+20.00%"); + // assertThat(formatter.formatDetails(delta)).isEqualTo("+20.00%"); + assertThat(formatter.formatAdditionalInformation(delta)).isEmpty(); + } + @Test void shouldHandleOverflowGracefully() { var formatter = new ElementFormatter(); diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/restapi/CoverageApiITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/restapi/CoverageApiITest.java index d30debdf..f70c0a1c 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/restapi/CoverageApiITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/metrics/restapi/CoverageApiITest.java @@ -39,7 +39,7 @@ void shouldProvideRemoteApi() { .node("projectStatistics").isEqualTo("{\n" + " \"branch\": \"88.28%\",\n" + " \"complexity\": \"2558\",\n" - + " \"complexity-density\": \"+44.12%\",\n" + + " \"complexity-density\": \"0.44\",\n" + " \"complexity-maximum\": \"21\",\n" + " \"file\": \"99.67%\",\n" + " \"instruction\": \"96.11%\",\n" diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-overview.checks-expected-result b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-overview.checks-expected-result index 4bc1b41e..40ee6674 100644 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-overview.checks-expected-result +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-overview.checks-expected-result @@ -3,5 +3,5 @@ No changes detected, that affect the code coverage. * Line Coverage: 91.02% (294/323) * Branch Coverage: 93.97% (109/116) -* Complexity Density: 0.50% +* Complexity Density: 0.50 * Lines of Code: 323 diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result index 14c58b12..b420f497 100644 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/coverage-publisher-summary.checks-expected-result @@ -9,7 +9,7 @@ * **[Overall project (difference to reference job)](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#overview)** * Line Coverage: 91.02% (294/323) - Delta: +50.00% * Branch Coverage: 93.97% (109/116) - * Complexity Density: 0.50% + * Complexity Density: 0.50 * Lines of Code: 323 * **[Modified files (difference to reference job)](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#modifiedFilesCoverage)** * Line Coverage: 50.00% (1/2) - Delta: +50.00% diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-quality-gate-overview.checks-expected-result b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-quality-gate-overview.checks-expected-result index 1b33ab3c..568bdb50 100644 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-quality-gate-overview.checks-expected-result +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-quality-gate-overview.checks-expected-result @@ -6,7 +6,7 @@ No changes detected, that affect the code coverage. * Branch Coverage: 66.18% (180/272) * MC/DC Pair Coverage: 40.68% (24/59) * Function Call Coverage: 78.48% (62/79) -* Complexity Density: 0.34% +* Complexity Density: 0.34 * Lines of Code: 294 #### Quality Gates Summary diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+b-overview.checks-expected-result b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+b-overview.checks-expected-result index 78d6ad2b..6f70c557 100644 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+b-overview.checks-expected-result +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+b-overview.checks-expected-result @@ -3,9 +3,9 @@ No changes detected, that affect the code coverage. * Line Coverage: 65.00% (52/80) * Branch Coverage: 67.65% (23/34) -* Complexity Density: 0.31% +* Complexity Density: 0.31 * Lines of Code: 80 #### Quality Gates Summary -No active quality gates. \ No newline at end of file +No active quality gates. diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc+fcc-overview.checks-expected-result b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc+fcc-overview.checks-expected-result index cb1e02f5..0d889d1a 100644 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc+fcc-overview.checks-expected-result +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc+fcc-overview.checks-expected-result @@ -6,7 +6,7 @@ No changes detected, that affect the code coverage. * Branch Coverage: 66.18% (180/272) * MC/DC Pair Coverage: 40.68% (24/59) * Function Call Coverage: 78.48% (62/79) -* Complexity Density: 0.34% +* Complexity Density: 0.34 * Lines of Code: 294 #### Quality Gates Summary diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc-overview.checks-expected-result b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc-overview.checks-expected-result index 5538923d..4ce962ff 100644 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc-overview.checks-expected-result +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-s+mcdc-overview.checks-expected-result @@ -4,7 +4,7 @@ No changes detected, that affect the code coverage. * Line Coverage: 65.22% (45/69) * Branch Coverage: 71.43% (20/28) * MC/DC Pair Coverage: 66.67% (8/12) -* Complexity Density: 0.36% +* Complexity Density: 0.36 * Lines of Code: 69 #### Quality Gates Summary diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-summary.checks-expected-result b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-summary.checks-expected-result index 14c58b12..b420f497 100644 --- a/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-summary.checks-expected-result +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/metrics/steps/vectorcast-coverage-publisher-summary.checks-expected-result @@ -9,7 +9,7 @@ * **[Overall project (difference to reference job)](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#overview)** * Line Coverage: 91.02% (294/323) - Delta: +50.00% * Branch Coverage: 93.97% (109/116) - * Complexity Density: 0.50% + * Complexity Density: 0.50 * Lines of Code: 323 * **[Modified files (difference to reference job)](http://127.0.0.1:8080/job/pipeline-coding-style/job/5/coverage#modifiedFilesCoverage)** * Line Coverage: 50.00% (1/2) - Delta: +50.00%