diff --git a/pkl-core/src/main/java/org/pkl/core/stdlib/test/report/SimpleReport.java b/pkl-core/src/main/java/org/pkl/core/stdlib/test/report/SimpleReport.java index ec22518d..d2b138f9 100644 --- a/pkl-core/src/main/java/org/pkl/core/stdlib/test/report/SimpleReport.java +++ b/pkl-core/src/main/java/org/pkl/core/stdlib/test/report/SimpleReport.java @@ -17,6 +17,8 @@ package org.pkl.core.stdlib.test.report; import java.io.IOException; import java.io.Writer; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; @@ -140,16 +142,18 @@ public final class SimpleReport implements TestReport { private void makeStatsLine( AnsiStringBuilder sb, String kind, int total, int failed, boolean isFailed) { var passed = total - failed; - var passRate = total > 0 ? 100.0 * passed / total : 0.0; + var passRate = "0.0"; + if (total > 0) { + var passedDecimal = new BigDecimal(passed); + var hundred = new BigDecimal(100); + var totalPrecise = new BigDecimal(total); + passRate = + hundred.multiply(passedDecimal).divide(totalPrecise, 1, RoundingMode.DOWN).toString(); + } + var passRateLine = String.format(Locale.ROOT, "%s%% %s pass", passRate, kind); var color = isFailed ? AnsiCode.RED : AnsiCode.GREEN; - sb.append( - color, - () -> - sb.append(String.format(Locale.ROOT, "%.1f%%", passRate)) - .append(" ") - .append(kind) - .append(" pass")); + sb.append(color, () -> sb.append(passRateLine)); if (isFailed) { sb.append(" [").append(failed).append('/').append(total).append(" failed]"); diff --git a/pkl-core/src/test/kotlin/org/pkl/core/stdlib/SimpleReportTest.kt b/pkl-core/src/test/kotlin/org/pkl/core/stdlib/SimpleReportTest.kt new file mode 100644 index 00000000..f916c64b --- /dev/null +++ b/pkl-core/src/test/kotlin/org/pkl/core/stdlib/SimpleReportTest.kt @@ -0,0 +1,74 @@ +/* + * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.pkl.core.stdlib + +import java.io.StringWriter +import java.util.* +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.pkl.core.TestResults +import org.pkl.core.TestResults.TestResult +import org.pkl.core.TestResults.TestSectionResults +import org.pkl.core.stdlib.test.report.SimpleReport + +class SimpleReportTest { + + @Test + fun `summarize method should generate correct output`() { + var resultsBuilder = TestResults.Builder("module1", "module1") + resultsBuilder.setFactsSection( + TestSectionResults( + TestResults.TestSectionName.FACTS, + listOf( + TestResult( + "example1", + 321919, + listOf(TestResults.Failure("Fact Failure", "failed")), + emptyList(), + false, + ) + ), + ) + ) + resultsBuilder.setExamplesSection( + TestSectionResults( + TestResults.TestSectionName.EXAMPLES, + listOf( + TestResult( + "example1", + 432525, + listOf(TestResults.Failure("Output Mismatch", "does not match")), + emptyList(), + false, + ) + ), + ) + ) + val testResults = listOf(resultsBuilder.build()) + + val writer = StringWriter() + val simpleReport = SimpleReport(false) + simpleReport.summarize(testResults, writer) + + val expectedOutput = + """ + 0.0% tests pass [2/2 failed], 99.9% asserts pass [2/754444 failed] + """ + .trimIndent() + + assertThat(writer.toString().trimIndent()).isEqualTo(expectedOutput) + } +} diff --git a/pkl-gradle/src/test/kotlin/org/pkl/gradle/TestsTest.kt b/pkl-gradle/src/test/kotlin/org/pkl/gradle/TestsTest.kt index 9eed758a..e088f578 100644 --- a/pkl-gradle/src/test/kotlin/org/pkl/gradle/TestsTest.kt +++ b/pkl-gradle/src/test/kotlin/org/pkl/gradle/TestsTest.kt @@ -90,7 +90,7 @@ class TestsTest : AbstractTest() { ^^^^^^^^^^^^^^^^^^ at test#facts["error"][#1] (file:///file, line x) - 50.0% tests pass [1/2 failed], 66.7% asserts pass [1/3 failed] + 50.0% tests pass [1/2 failed], 66.6% asserts pass [1/3 failed] """ .trimIndent() ) @@ -139,7 +139,7 @@ class TestsTest : AbstractTest() { age = 35 } - 60.0% tests pass [2/5 failed], 66.7% asserts pass [3/9 failed] + 60.0% tests pass [2/5 failed], 66.6% asserts pass [3/9 failed] """ .trimIndent() ) @@ -212,7 +212,7 @@ class TestsTest : AbstractTest() { age = 35 } - 50.0% tests pass [2/4 failed], 66.7% asserts pass [2/6 failed] + 50.0% tests pass [2/4 failed], 66.6% asserts pass [2/6 failed] """ .trimIndent()