From 5d60314f3fb3c5cad09a270c7ec605538ed77eac Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Tue, 17 Feb 2026 21:57:34 +0100 Subject: [PATCH 1/7] suppression of log for non-failing test classes Test utilities are shared via gradles `java-test-fixture` plugin. --- build.gradle | 18 +++---- key.util/build.gradle | 10 ++++ .../uka/ilkd/key/testfixtures/TestLogMgr.java | 52 +++++++++++++++++++ .../org.junit.jupiter.api.extension.Extension | 1 + .../resources/junit-platform.properties | 1 + .../src/testFixtures}/resources/logback.xml | 0 6 files changed, 71 insertions(+), 11 deletions(-) create mode 100644 key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java create mode 100644 key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension create mode 100644 key.util/src/testFixtures/resources/junit-platform.properties rename {key.core/src/test => key.util/src/testFixtures}/resources/logback.xml (100%) diff --git a/build.gradle b/build.gradle index 1dbf5aefa3b..3781848414d 100644 --- a/build.gradle +++ b/build.gradle @@ -62,7 +62,6 @@ subprojects { } dependencies { - implementation("org.slf4j:slf4j-api:2.0.17") implementation("org.slf4j:slf4j-api:2.0.17") testImplementation("ch.qos.logback:logback-classic:1.5.27") @@ -76,23 +75,20 @@ subprojects { checkerFramework "io.github.eisop:checker-qual:$eisop_version" checkerFramework "io.github.eisop:checker:$eisop_version" - testImplementation("ch.qos.logback:logback-classic:1.5.27") - testImplementation("org.assertj:assertj-core:3.27.7") testImplementation("ch.qos.logback:logback-classic:1.5.27") testImplementation(platform("org.junit:junit-bom:5.14.2")) - testImplementation ("org.junit.jupiter:junit-jupiter-api") - testImplementation ("org.junit.jupiter:junit-jupiter-params") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine") - testRuntimeOnly ("org.junit.platform:junit-platform-launcher") - testImplementation ("org.assertj:assertj-core:3.27.7") - testImplementation project(':key.util') + testImplementation("org.junit.jupiter:junit-jupiter-api") + testImplementation("org.junit.jupiter:junit-jupiter-params") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testImplementation("org.assertj:assertj-core:3.27.7") + testImplementation(project(':key.util')) + testImplementation(testFixtures(project(":key.util"))) // test fixtures testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.21.0") testImplementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.21.0") - - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' } tasks.withType(JavaCompile).configureEach { diff --git a/key.util/build.gradle b/key.util/build.gradle index cd0a45de4ae..7151e1cb321 100644 --- a/key.util/build.gradle +++ b/key.util/build.gradle @@ -1,7 +1,17 @@ +plugins { + id 'java-test-fixtures' +} + description = "Utility library of the key-project" dependencies { implementation("org.jspecify:jspecify:1.0.0") + + testFixturesApi(platform("org.junit:junit-bom:5.14.2")) + testFixturesApi("org.junit.jupiter:junit-jupiter-api") + testFixturesApi("org.junit.jupiter:junit-jupiter-params") + testFixturesApi("org.assertj:assertj-core:3.27.7") + testFixturesApi("ch.qos.logback:logback-classic:1.5.27") } checkerFramework { diff --git a/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java b/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java new file mode 100644 index 00000000000..aa0921ea0fc --- /dev/null +++ b/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java @@ -0,0 +1,52 @@ +package de.uka.ilkd.key.testfixtures; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.encoder.LayoutWrappingEncoder; +import ch.qos.logback.core.testUtil.StringListAppender; +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.BeforeTestExecutionCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.slf4j.LoggerFactory; + +/** + * Extension of JUnit 5 that suppress logging of non-failing tests. + * + * @author Alexander Weigl + * @version 1 (2/17/26) + */ +public class TestLogMgr implements AfterTestExecutionCallback, BeforeTestExecutionCallback { + private static ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory + .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + + private static final ConsoleAppender consoleAppender; + + private static final StringListAppender listAppender = new StringListAppender<>(); + + static { + consoleAppender = (ConsoleAppender) root.getAppender("STDOUT"); + listAppender.setContext(consoleAppender.getContext()); + listAppender.setLayout(((LayoutWrappingEncoder) consoleAppender.getEncoder()).getLayout()); + listAppender.start(); + } + + @Override + public void afterTestExecution(ExtensionContext context) { + root.detachAppender(listAppender); + root.addAppender(consoleAppender); + if (context.getExecutionException().isPresent()) { + for (var s : listAppender.strList) { + System.out.print(s); + } + System.out.flush(); + } + listAppender.strList.clear(); + } + + @Override + public void beforeTestExecution(ExtensionContext context) { + System.out.flush(); + root.detachAppender(consoleAppender); + root.addAppender(listAppender); + } +} diff --git a/key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension new file mode 100644 index 00000000000..8d2ead25738 --- /dev/null +++ b/key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -0,0 +1 @@ +de.uka.ilkd.key.testfixtures.TestLogMgr \ No newline at end of file diff --git a/key.util/src/testFixtures/resources/junit-platform.properties b/key.util/src/testFixtures/resources/junit-platform.properties new file mode 100644 index 00000000000..b059a65dc46 --- /dev/null +++ b/key.util/src/testFixtures/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled=true \ No newline at end of file diff --git a/key.core/src/test/resources/logback.xml b/key.util/src/testFixtures/resources/logback.xml similarity index 100% rename from key.core/src/test/resources/logback.xml rename to key.util/src/testFixtures/resources/logback.xml From ba2dd61fad06f323e1f309a14a316f3b9c7821f6 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 20 Feb 2026 22:16:55 +0100 Subject: [PATCH 2/7] fix the ugly test output dependency using java-test-fixtures of Gradle --- key.core.infflow/build.gradle | 3 +- .../informationflow/GenerateUnitTests.java | 6 +- .../key/informationflow/InfFlowTests.java | 17 ++ key.core.symbolic_execution/build.gradle | 1 - key.core.wd/build.gradle | 3 +- .../de/uka/ilkd/key/wd/GenerateUnitTests.java | 6 +- .../de/uka/ilkd/key/wd/WdProofCollection.java | 6 +- .../test/java/de/uka/ilkd/key/wd/WdTests.java | 17 ++ key.core/build.gradle | 6 + .../proof/runallproofs/GenerateUnitTests.java | 154 +-------------- .../proof/runallproofs/ProofCollections.java | 14 +- ...AllProofsTestWithComputeCostProfiling.java | 6 +- .../runallproofs/GenerateUnitTestsUtil.java | 186 ++++++++++++++++++ .../proof/runallproofs/JunitXmlWriter.java | 6 +- .../key/proof/runallproofs/ProveTest.java | 15 +- .../runallproofs/RunAllProofsDirectories.java | 0 .../proof/runallproofs/RunAllProofsTest.java | 0 .../runallproofs/RunAllProofsTestUnit.java | 4 +- .../key/proof/runallproofs/TestResult.java | 2 + .../performance/DataRecordingStrategy.java | 0 .../performance/DataRecordingTable.java | 0 .../performance/DataRecordingTestFile.java | 0 .../performance/FunctionPerformanceData.java | 0 .../runallproofs/performance/NodeData.java | 0 .../performance/ProfilingDirectories.java | 0 .../runallproofs/performance/RuleData.java | 0 .../performance/RuleIndependentData.java | 0 .../proofcollection/ForkMode.java | 0 .../proofcollection/ForkedTestFileRunner.java | 0 .../GroupedProofCollectionUnit.java | 0 .../proofcollection/ProofCollection.java | 0 .../ProofCollectionSettings.java | 0 .../proofcollection/ProofCollectionUnit.java | 0 .../SingletonProofCollectionUnit.java | 0 .../proofcollection/StatisticsFile.java | 0 .../proofcollection/TestFile.java | 0 .../proofcollection/TestProperty.java | 0 .../de/uka/ilkd/key/util/IOForwarder.java | 0 .../runallproofs/automaticJAVADL.properties | 0 key.util/build.gradle | 1 + .../uka/ilkd/key/testfixtures/TestLogMgr.java | 14 +- 41 files changed, 268 insertions(+), 199 deletions(-) create mode 100644 key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/InfFlowTests.java create mode 100644 key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdTests.java rename key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/{performance => }/RunAllProofsTestWithComputeCostProfiling.java (93%) create mode 100644 key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTestsUtil.java rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/JunitXmlWriter.java (95%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/ProveTest.java (95%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsDirectories.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTest.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestUnit.java (98%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/TestResult.java (94%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingStrategy.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTable.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTestFile.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/FunctionPerformanceData.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/NodeData.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/ProfilingDirectories.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleData.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleIndependentData.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkMode.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkedTestFileRunner.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/GroupedProofCollectionUnit.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollection.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionSettings.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionUnit.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/SingletonProofCollectionUnit.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/StatisticsFile.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestFile.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestProperty.java (100%) rename key.core/src/{test => testFixtures}/java/de/uka/ilkd/key/util/IOForwarder.java (100%) rename key.core/src/{test => testFixtures}/resources/de/uka/ilkd/key/proof/runallproofs/automaticJAVADL.properties (100%) diff --git a/key.core.infflow/build.gradle b/key.core.infflow/build.gradle index 9edc6360b73..611ee906629 100644 --- a/key.core.infflow/build.gradle +++ b/key.core.infflow/build.gradle @@ -2,7 +2,8 @@ dependencies { api(project(":key.core")) - testImplementation(project(":key.core").sourceSets.test.output) + + testImplementation(testFixtures(project(":key.core"))) } diff --git a/key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/GenerateUnitTests.java b/key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/GenerateUnitTests.java index 42c0bfe73ef..ea0106313bd 100644 --- a/key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/GenerateUnitTests.java +++ b/key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/GenerateUnitTests.java @@ -7,12 +7,10 @@ import java.nio.file.Paths; import java.util.*; -import de.uka.ilkd.key.proof.runallproofs.ProofCollections; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static de.uka.ilkd.key.proof.runallproofs.GenerateUnitTests.*; +import static de.uka.ilkd.key.proof.runallproofs.GenerateUnitTestsUtil.*; /** * Generation of test cases (JUnit) for given proof collection files. @@ -21,7 +19,7 @@ * {@code generateRunAllProofs}. *

* The considered proof collections files are configured statically in - * {@link ProofCollections}. + * {@link InfFlowProofCollection}. * * @author Alexander Weigl * @version 1 (6/14/20) diff --git a/key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/InfFlowTests.java b/key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/InfFlowTests.java new file mode 100644 index 00000000000..566f0d9a6c3 --- /dev/null +++ b/key.core.infflow/src/test/java/de/uka/ilkd/key/informationflow/InfFlowTests.java @@ -0,0 +1,17 @@ +/* This file is part of KeY - https://key-project.org + * KeY is licensed under the GNU General Public License Version 2 + * SPDX-License-Identifier: GPL-2.0-only */ +package de.uka.ilkd.key.informationflow; + +import org.junit.jupiter.api.Test; + +/** + * + * @author Alexander Weigl + * @version 1 (2/20/26) + */ +public class InfFlowTests { + // Empty test to trick or non-empty test case requirements. + @Test + public void testInfFlowEmpty() {} +} diff --git a/key.core.symbolic_execution/build.gradle b/key.core.symbolic_execution/build.gradle index 697c8045706..42d92ad7f6c 100644 --- a/key.core.symbolic_execution/build.gradle +++ b/key.core.symbolic_execution/build.gradle @@ -2,7 +2,6 @@ description = "API for using KeY as a symbolic execution engine for Java program dependencies { implementation project(":key.core") - testImplementation project(":key.core").sourceSets.test.output } test { diff --git a/key.core.wd/build.gradle b/key.core.wd/build.gradle index cbf92d09e6a..f457b5cb1f1 100644 --- a/key.core.wd/build.gradle +++ b/key.core.wd/build.gradle @@ -1,6 +1,7 @@ dependencies { api(project(":key.core")) - testImplementation(project(":key.core").sourceSets.test.output) + + testImplementation(testFixtures(project(":key.core"))) } tasks.register('testRunAllWdProofs', Test) { diff --git a/key.core.wd/src/test/java/de/uka/ilkd/key/wd/GenerateUnitTests.java b/key.core.wd/src/test/java/de/uka/ilkd/key/wd/GenerateUnitTests.java index fa607a3ccce..592df6437bc 100644 --- a/key.core.wd/src/test/java/de/uka/ilkd/key/wd/GenerateUnitTests.java +++ b/key.core.wd/src/test/java/de/uka/ilkd/key/wd/GenerateUnitTests.java @@ -7,13 +7,11 @@ import java.nio.file.Paths; import java.util.List; -import de.uka.ilkd.key.proof.runallproofs.ProofCollections; +import de.uka.ilkd.key.proof.runallproofs.GenerateUnitTestsUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static de.uka.ilkd.key.proof.runallproofs.GenerateUnitTests.*; - /** * Generation of test cases (JUnit) for given proof collection files. *

@@ -36,6 +34,6 @@ public static void main(String[] args) throws IOException { System.exit(1); } var outputFolder = Paths.get(args[0]); - run(outputFolder, collections); + GenerateUnitTestsUtil.run(outputFolder, collections); } } diff --git a/key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdProofCollection.java b/key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdProofCollection.java index c59302fea3f..2b1c83ef459 100644 --- a/key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdProofCollection.java +++ b/key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdProofCollection.java @@ -10,7 +10,7 @@ import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollection; import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollectionSettings; -import static de.uka.ilkd.key.proof.runallproofs.ProofCollections.loadFromFile; +import static de.uka.ilkd.key.proof.runallproofs.GenerateUnitTestsUtil.loadFromFile; import static org.assertj.core.api.Assertions.assertThat; public class WdProofCollection { @@ -147,10 +147,10 @@ public static ProofCollection automaticWd() throws IOException { g.provable("./firstTouch/10-SITA/SITA3_rearrangeWithWDLoop.key"); g.provable("./firstTouch/10-SITA/SITA3_swapWD.key"); - g = c.group("wd_blockcontracts"); + // g = c.group("wd_blockcontracts"); // g.notprovable("./heap/block_contracts/GreatestCommonDivisor_ofWithWD.key"); - g = c.group("wd_fm12_01_LRS"); + // g = c.group("wd_fm12_01_LRS"); // g.notprovable("./heap/fm12_01_LRS/LCP_lcpWD.key"); // g.notprovable("./heap/fm12_01_LRS/LRS_doLRSWD.key"); // g.notprovable("./heap/fm12_01_LRS/SuffixArray_invariantWD.key"); diff --git a/key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdTests.java b/key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdTests.java new file mode 100644 index 00000000000..437b26a70c1 --- /dev/null +++ b/key.core.wd/src/test/java/de/uka/ilkd/key/wd/WdTests.java @@ -0,0 +1,17 @@ +/* This file is part of KeY - https://key-project.org + * KeY is licensed under the GNU General Public License Version 2 + * SPDX-License-Identifier: GPL-2.0-only */ +package de.uka.ilkd.key.wd; + +import org.junit.jupiter.api.Test; + +/** + * + * @author Alexander Weigl + * @version 1 (2/20/26) + */ +public class WdTests { + // Empty test to trick or non-empty test case requirements. + @Test + public void testInfFlowEmpty() {} +} diff --git a/key.core/build.gradle b/key.core/build.gradle index 2645553ba50..a5e0a5137e5 100644 --- a/key.core/build.gradle +++ b/key.core/build.gradle @@ -1,5 +1,7 @@ plugins { id 'org.javacc.javacc' version '4.0.3' + + id 'java-test-fixtures' } description = "Core functionality (terms, rules, prover, ...) for deductive verification of Java programs" @@ -19,6 +21,10 @@ dependencies { antlr4 "org.antlr:antlr4:4.13.2" api "org.antlr:antlr4-runtime:4.13.2" + + // test fixtures + + testFixturesApi(testFixtures(project(":key.util"))) } // The target directory for JavaCC (parser generation) diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTests.java b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTests.java index 6561317547d..4d308b91b12 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTests.java +++ b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTests.java @@ -4,16 +4,8 @@ package de.uka.ilkd.key.proof.runallproofs; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollection; -import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollectionSettings; -import de.uka.ilkd.key.proof.runallproofs.proofcollection.TestFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,150 +32,6 @@ public static void main(String[] args) throws IOException { System.exit(1); } var outputFolder = Paths.get(args[0]); - run(outputFolder, collections); - } - - public static void run(Path outputFolder, List collections) - throws IOException { - LOGGER.info("Output folder {}", outputFolder); - - outputFolder = outputFolder.toAbsolutePath(); - Files.createDirectories(outputFolder); - - for (var col : collections) { - for (RunAllProofsTestUnit unit : col.createRunAllProofsTestUnits()) { - createUnitClass(outputFolder, unit); - } - } - } - - private static final String TEMPLATE_CONTENT = - """ - /* This file is part of KeY - https://key-project.org - * KeY is licensed under the GNU General Public License Version 2 - * SPDX-License-Identifier: GPL-2.0-only */ - - package $packageName; - - import org.junit.jupiter.api.*; - import static org.junit.jupiter.api.Assertions.*; - - public class $className extends de.uka.ilkd.key.proof.runallproofs.ProveTest { - public static final String STATISTIC_FILE = "$statisticsFile"; - - { // initialize during construction - this.baseDirectory = "$baseDirectory"; - this.statisticsFile = STATISTIC_FILE; - this.name = "$name"; - this.reloadEnabled = $reloadEnabled; - this.tempDir = "$tempDir"; - - this.globalSettings = "$keySettings"; - this.localSettings = "$localSettings"; - } - - $timeout - $methods - } - """; - - /** - * Generates the test classes for the given proof collection, and writes the - * java files. - * - * @param unit a group of proof collection units - * @throws IOException if the file is not writable - */ - private static void createUnitClass(Path outputFolder, RunAllProofsTestUnit unit) - throws IOException { - String packageName = "de.uka.ilkd.key.proof.runallproofs.gen"; - String name = unit.getTestName(); - String className = '_' + name // avoids name clashes, i.e., group "switch" - .replaceAll("\\.java", "") - .replaceAll("\\.key", "") - .replaceAll("[^a-zA-Z0-9]+", "_"); - - ProofCollectionSettings settings = unit.getSettings(); - Map vars = new TreeMap<>(); - vars.put("className", className); - vars.put("packageName", packageName); - vars.put("baseDirectory", settings.getBaseDirectory().getAbsolutePath() - .replaceAll("\\\\", "/")); - vars.put("statisticsFile", - settings.getStatisticsFile().getStatisticsFile().getAbsolutePath() - .replaceAll("\\\\", "/")); - vars.put("name", name); - vars.put("reloadEnabled", String.valueOf(settings.reloadEnabled())); - vars.put("tempDir", settings.getTempDir().getAbsolutePath() - .replaceAll("\\\\", "/")); - - vars.put("globalSettings", settings.getGlobalKeYSettings().replace("\n", "\\n")); - vars.put("localSettings", - (settings.getLocalKeYSettings() == null ? "" : settings.getLocalKeYSettings()) - .replace("\n", "\\n")); - - vars.put("timeout", ""); - - if (false) {// disabled - int globalTimeout = 0; - if (globalTimeout > 0) { - vars.put("timeout", - "@Rule public Timeout globalTimeout = Timeout.seconds(" + globalTimeout + ");"); - } - } - - StringBuilder methods = new StringBuilder(); - Set usedMethodNames = new TreeSet<>(); - int clashCounter = 0; - - for (TestFile file : unit.getTestFiles()) { - Path keyFile = file.getKeYFile(); - String testName = keyFile.getFileName().toString() - .replaceAll("\\.java", "") - .replaceAll("\\.key", "") - .replaceAll("[^a-zA-Z0-9]+", "_"); - - if (usedMethodNames.contains(testName)) { - testName += "_" + (++clashCounter); - } - usedMethodNames.add(testName); - - // int timeout = 0; (timeout <= 0 ? parent.timeout : 0) - String to = ""; // timeout > 0 ? "timeout=${1000 * timeout}" : ""; - methods.append("\n"); - methods.append("@Test(").append(to).append(")") - // .append("@TestName(\"").append(keyFile.getName()).append("\")") - .append("void test").append(testName).append("() throws Exception {\n"); - // "// This tests is based on").append(keyFile.toAbsolutePath()).append("\n"); - - switch (file.getTestProperty()) { - case PROVABLE -> methods.append("assertProvability(\"") - .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) - .append("\");"); - case NOTPROVABLE -> methods.append("assertUnProvability(\"") - .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) - .append("\");"); - case LOADABLE -> methods.append("assertLoadability(\"") - .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) - .append("\");"); - case NOTLOADABLE -> methods.append("assertUnLoadability(\"") - .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) - .append("\");"); - } - methods.append("}"); - } - vars.put("methods", methods.toString()); - - Pattern regex = Pattern.compile("[$](\\w+)"); - Matcher m = regex.matcher(TEMPLATE_CONTENT); - StringBuilder sb = new StringBuilder(); - while (m.find()) { - String key = m.group(1); - m.appendReplacement(sb, vars.getOrDefault(key, "/*not-found*/")); - } - m.appendTail(sb); - var folder = outputFolder.resolve(packageName.replace('.', '/')); - Files.createDirectories(folder); - Files.writeString(folder.resolve(className + ".java"), sb.toString()); + GenerateUnitTestsUtil.run(outputFolder, collections); } } diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java index e1878096ce5..d841393314f 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java +++ b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java @@ -11,10 +11,6 @@ import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollection; import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollectionSettings; -import org.key_project.util.java.IOUtil; - -import org.junit.jupiter.api.Assertions; - /** * This class configuress the "runAllProofs" test runs. * @@ -108,7 +104,7 @@ public static ProofCollection automaticJavaDL() throws IOException { // runOnlyOn = group1, group2 (the space after each comma is mandatory) // settings.setRunOnlyOn("performance, performancePOConstruction"); - settings.setKeySettings(loadFromFile("automaticJAVADL.properties")); + settings.setKeySettings(GenerateUnitTestsUtil.loadFromFile("automaticJAVADL.properties")); var c = new ProofCollection(settings); @@ -1008,12 +1004,4 @@ public static ProofCollection automaticJavaDL() throws IOException { } return c; } - - - public static String loadFromFile(String name) throws IOException { - var stream = ProofCollections.class.getResourceAsStream(name); - Assertions.assertNotNull(stream, "Failed to find " + name); - return IOUtil.readFrom(stream); - } - } diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/RunAllProofsTestWithComputeCostProfiling.java b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestWithComputeCostProfiling.java similarity index 93% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/RunAllProofsTestWithComputeCostProfiling.java rename to key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestWithComputeCostProfiling.java index 030baf7de9a..b5eec32dc8d 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/RunAllProofsTestWithComputeCostProfiling.java +++ b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestWithComputeCostProfiling.java @@ -1,7 +1,7 @@ /* This file is part of KeY - https://key-project.org * KeY is licensed under the GNU General Public License Version 2 * SPDX-License-Identifier: GPL-2.0-only */ -package de.uka.ilkd.key.proof.runallproofs.performance; +package de.uka.ilkd.key.proof.runallproofs; import java.io.File; import java.io.IOException; @@ -9,9 +9,7 @@ import java.util.Objects; import java.util.stream.Stream; -import de.uka.ilkd.key.proof.runallproofs.ProofCollections; -import de.uka.ilkd.key.proof.runallproofs.RunAllProofsFunctional; -import de.uka.ilkd.key.proof.runallproofs.RunAllProofsTest; +import de.uka.ilkd.key.proof.runallproofs.performance.ProfilingDirectories; import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollection; import org.key_project.prover.rules.RuleApp; diff --git a/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTestsUtil.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTestsUtil.java new file mode 100644 index 00000000000..b2115223d65 --- /dev/null +++ b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/GenerateUnitTestsUtil.java @@ -0,0 +1,186 @@ +/* This file is part of KeY - https://key-project.org + * KeY is licensed under the GNU General Public License Version 2 + * SPDX-License-Identifier: GPL-2.0-only */ +package de.uka.ilkd.key.proof.runallproofs; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollection; +import de.uka.ilkd.key.proof.runallproofs.proofcollection.ProofCollectionSettings; +import de.uka.ilkd.key.proof.runallproofs.proofcollection.TestFile; + +import org.key_project.util.java.IOUtil; + +import org.junit.jupiter.api.Assertions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Generation of test cases (JUnit) for given proof collection files. + *

+ * This class is intended to be called from gradle. See the gradle task + * {@code generateRunAllProofs}. + *

+ * The considered proof collections files are configured statically in the source code. + * + * @author Alexander Weigl + * @version 1 (6/14/20) + */ +public class GenerateUnitTestsUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(GenerateUnitTestsUtil.class); + + public static void run(Path outputFolder, List collections) + throws IOException { + LOGGER.info("Output folder {}", outputFolder); + + outputFolder = outputFolder.toAbsolutePath(); + Files.createDirectories(outputFolder); + + for (var col : collections) { + for (RunAllProofsTestUnit unit : col.createRunAllProofsTestUnits()) { + createUnitClass(outputFolder, unit); + } + } + } + + private static final String TEMPLATE_CONTENT = + """ + /* This file is part of KeY - https://key-project.org + * KeY is licensed under the GNU General Public License Version 2 + * SPDX-License-Identifier: GPL-2.0-only */ + + package $packageName; + + import org.junit.jupiter.api.*; + import static org.junit.jupiter.api.Assertions.*; + + public class $className extends de.uka.ilkd.key.proof.runallproofs.ProveTest { + public static final String STATISTIC_FILE = "$statisticsFile"; + + { // initialize during construction + this.baseDirectory = "$baseDirectory"; + this.statisticsFile = STATISTIC_FILE; + this.name = "$name"; + this.reloadEnabled = $reloadEnabled; + this.tempDir = "$tempDir"; + + this.globalSettings = "$keySettings"; + this.localSettings = "$localSettings"; + } + + $timeout + $methods + } + """; + + /** + * Generates the test classes for the given proof collection, and writes the + * java files. + * + * @param unit a group of proof collection units + * @throws IOException if the file is not writable + */ + private static void createUnitClass(Path outputFolder, RunAllProofsTestUnit unit) + throws IOException { + String packageName = "de.uka.ilkd.key.proof.runallproofs.gen"; + String name = unit.getTestName(); + String className = '_' + name // avoids name clashes, i.e., group "switch" + .replaceAll("\\.java", "") + .replaceAll("\\.key", "") + .replaceAll("[^a-zA-Z0-9]+", "_"); + + ProofCollectionSettings settings = unit.getSettings(); + Map vars = new TreeMap<>(); + vars.put("className", className); + vars.put("packageName", packageName); + vars.put("baseDirectory", settings.getBaseDirectory().getAbsolutePath() + .replaceAll("\\\\", "/")); + vars.put("statisticsFile", + settings.getStatisticsFile().getStatisticsFile().getAbsolutePath() + .replaceAll("\\\\", "/")); + vars.put("name", name); + vars.put("reloadEnabled", String.valueOf(settings.reloadEnabled())); + vars.put("tempDir", settings.getTempDir().getAbsolutePath() + .replaceAll("\\\\", "/")); + + vars.put("globalSettings", settings.getGlobalKeYSettings().replace("\n", "\\n")); + vars.put("localSettings", + (settings.getLocalKeYSettings() == null ? "" : settings.getLocalKeYSettings()) + .replace("\n", "\\n")); + + vars.put("timeout", ""); + + if (false) {// disabled + int globalTimeout = 0; + if (globalTimeout > 0) { + vars.put("timeout", + "@Rule public Timeout globalTimeout = Timeout.seconds(" + globalTimeout + ");"); + } + } + + StringBuilder methods = new StringBuilder(); + Set usedMethodNames = new TreeSet<>(); + int clashCounter = 0; + + for (TestFile file : unit.getTestFiles()) { + Path keyFile = file.getKeYFile(); + String testName = keyFile.getFileName().toString() + .replaceAll("\\.java", "") + .replaceAll("\\.key", "") + .replaceAll("[^a-zA-Z0-9]+", "_"); + + if (usedMethodNames.contains(testName)) { + testName += "_" + (++clashCounter); + } + usedMethodNames.add(testName); + + // int timeout = 0; (timeout <= 0 ? parent.timeout : 0) + String to = ""; // timeout > 0 ? "timeout=${1000 * timeout}" : ""; + methods.append("\n"); + methods.append("@Test(").append(to).append(")") + // .append("@TestName(\"").append(keyFile.getName()).append("\")") + .append("void test").append(testName).append("() throws Exception {\n"); + // "// This tests is based on").append(keyFile.toAbsolutePath()).append("\n"); + + switch (file.getTestProperty()) { + case PROVABLE -> methods.append("assertProvability(\"") + .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) + .append("\");"); + case NOTPROVABLE -> methods.append("assertUnProvability(\"") + .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) + .append("\");"); + case LOADABLE -> methods.append("assertLoadability(\"") + .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) + .append("\");"); + case NOTLOADABLE -> methods.append("assertUnLoadability(\"") + .append(keyFile.toAbsolutePath().toString().replaceAll("\\\\", "/")) + .append("\");"); + } + methods.append("}"); + } + vars.put("methods", methods.toString()); + + Pattern regex = Pattern.compile("[$](\\w+)"); + Matcher m = regex.matcher(TEMPLATE_CONTENT); + StringBuilder sb = new StringBuilder(); + while (m.find()) { + String key = m.group(1); + m.appendReplacement(sb, vars.getOrDefault(key, "/*not-found*/")); + } + m.appendTail(sb); + var folder = outputFolder.resolve(packageName.replace('.', '/')); + Files.createDirectories(folder); + Files.writeString(folder.resolve(className + ".java"), sb.toString()); + } + + public static String loadFromFile(String name) throws IOException { + var stream = GenerateUnitTestsUtil.class.getResourceAsStream(name); + Assertions.assertNotNull(stream, "Failed to find " + name); + return IOUtil.readFrom(stream); + } +} diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/JunitXmlWriter.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/JunitXmlWriter.java similarity index 95% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/JunitXmlWriter.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/JunitXmlWriter.java index 5ec9b0924b2..c525da310e4 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/JunitXmlWriter.java +++ b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/JunitXmlWriter.java @@ -9,7 +9,9 @@ /** * This class allows to write test-results into XML like JUnit. - * https://stackoverflow.com/questions/4922867/what-is-the-junit-xml-format-specification-that-hudson-supports + * JUNIT + * Format * * @author Alexander Weigl * @version 1 (8/5/20) @@ -91,7 +93,7 @@ public void addTestcase( time)); } - enum TestCaseState { + public enum TestCaseState { FAILED, ERROR, SUCCESS, diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProveTest.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/ProveTest.java similarity index 95% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProveTest.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/ProveTest.java index 7ccecc800fb..db9b0e0012e 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProveTest.java +++ b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/ProveTest.java @@ -24,11 +24,10 @@ import org.key_project.util.collection.Pair; +import org.junit.jupiter.api.Assertions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.junit.jupiter.api.Assertions.*; - /** * This class provides an API for running proves in JUnit test cases. @@ -44,7 +43,7 @@ * * @author Alexander Weigl * @version 1 (12.07.19) - * @see GenerateUnitTests + * @see GenerateUnitTestsUtil */ public class ProveTest { private static final Logger LOGGER = LoggerFactory.getLogger(ProveTest.class); @@ -93,7 +92,7 @@ private void runKey(String file, TestProperty testProperty) throws Exception { LOGGER.info("({}) Active Settings: {}", caseId, ProofSettings.DEFAULT_SETTINGS.settingsToString()); - assertTrue(Files.exists(keyFile), "File " + keyFile + " does not exists"); + Assertions.assertTrue(Files.exists(keyFile), "File " + keyFile + " does not exists"); // File that the created proof will be saved to. var proofFile = Paths.get(keyFile.toAbsolutePath() + ".proof"); @@ -121,11 +120,11 @@ private void runKey(String file, TestProperty testProperty) throws Exception { } if (testProperty == TestProperty.NOTLOADABLE) { - assertTrue(replayResult.hasErrors(), + Assertions.assertTrue(replayResult.hasErrors(), "Loading problem file succeeded but it shouldn't"); success = true; } else { - assertFalse(replayResult.hasErrors(), "Loading problem file failed"); + Assertions.assertFalse(replayResult.hasErrors(), "Loading problem file failed"); // For a reload test we are done at this point. Loading was successful. if (testProperty == TestProperty.LOADABLE) { @@ -158,7 +157,7 @@ private void runKey(String file, TestProperty testProperty) throws Exception { success ? " was successful " : " failed ", keyFile); if (!success) { - fail(message); + Assertions.fail(message); } } @@ -172,7 +171,7 @@ private void reload(Path proofFile, Proof loadedProof) throws Exception { ProofSaver.saveToFile(proofFile, loadedProof); boolean reloadedClosed = reloadProof(proofFile); - assertEquals(loadedProof.closed(), reloadedClosed, + Assertions.assertEquals(loadedProof.closed(), reloadedClosed, "Reloaded proof did not close: " + proofFile); debugOut("... success: reloaded."); } diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsDirectories.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsDirectories.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsDirectories.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsDirectories.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTest.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTest.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTest.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTest.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestUnit.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestUnit.java similarity index 98% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestUnit.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestUnit.java index f6954a255b5..6170395d4b0 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestUnit.java +++ b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/RunAllProofsTestUnit.java @@ -5,6 +5,7 @@ import java.io.File; import java.io.IOException; +import java.io.Serial; import java.io.Serializable; import java.nio.file.Files; import java.nio.file.Path; @@ -22,8 +23,9 @@ * @author Kai Wallisch */ public final class RunAllProofsTestUnit implements Serializable { + @Serial private static final long serialVersionUID = -2406881153415390252L; - private static final Logger LOGGER = LoggerFactory.getLogger(StatisticsFile.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RunAllProofsTestUnit.class); /** * The name of this test. diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/TestResult.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/TestResult.java similarity index 94% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/TestResult.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/TestResult.java index b5a846e5a9b..69ea36c2359 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/TestResult.java +++ b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/TestResult.java @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.proof.runallproofs; +import java.io.Serial; import java.io.Serializable; /** @@ -10,6 +11,7 @@ * which specifies whether a test run was successful or not. */ public record TestResult(String message, boolean success) implements Serializable { + @Serial private static final long serialVersionUID = 7635762713077999920L; } diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingStrategy.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingStrategy.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingStrategy.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingStrategy.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTable.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTable.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTable.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTable.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTestFile.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTestFile.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTestFile.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/DataRecordingTestFile.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/FunctionPerformanceData.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/FunctionPerformanceData.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/FunctionPerformanceData.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/FunctionPerformanceData.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/NodeData.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/NodeData.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/NodeData.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/NodeData.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/ProfilingDirectories.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/ProfilingDirectories.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/ProfilingDirectories.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/ProfilingDirectories.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleData.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleData.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleData.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleData.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleIndependentData.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleIndependentData.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleIndependentData.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/performance/RuleIndependentData.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkMode.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkMode.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkMode.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkMode.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkedTestFileRunner.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkedTestFileRunner.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkedTestFileRunner.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ForkedTestFileRunner.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/GroupedProofCollectionUnit.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/GroupedProofCollectionUnit.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/GroupedProofCollectionUnit.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/GroupedProofCollectionUnit.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollection.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollection.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollection.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollection.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionSettings.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionSettings.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionSettings.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionSettings.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionUnit.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionUnit.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionUnit.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/ProofCollectionUnit.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/SingletonProofCollectionUnit.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/SingletonProofCollectionUnit.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/SingletonProofCollectionUnit.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/SingletonProofCollectionUnit.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/StatisticsFile.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/StatisticsFile.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/StatisticsFile.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/StatisticsFile.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestFile.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestFile.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestFile.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestFile.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestProperty.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestProperty.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestProperty.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/proof/runallproofs/proofcollection/TestProperty.java diff --git a/key.core/src/test/java/de/uka/ilkd/key/util/IOForwarder.java b/key.core/src/testFixtures/java/de/uka/ilkd/key/util/IOForwarder.java similarity index 100% rename from key.core/src/test/java/de/uka/ilkd/key/util/IOForwarder.java rename to key.core/src/testFixtures/java/de/uka/ilkd/key/util/IOForwarder.java diff --git a/key.core/src/test/resources/de/uka/ilkd/key/proof/runallproofs/automaticJAVADL.properties b/key.core/src/testFixtures/resources/de/uka/ilkd/key/proof/runallproofs/automaticJAVADL.properties similarity index 100% rename from key.core/src/test/resources/de/uka/ilkd/key/proof/runallproofs/automaticJAVADL.properties rename to key.core/src/testFixtures/resources/de/uka/ilkd/key/proof/runallproofs/automaticJAVADL.properties diff --git a/key.util/build.gradle b/key.util/build.gradle index 7151e1cb321..3616f584c11 100644 --- a/key.util/build.gradle +++ b/key.util/build.gradle @@ -12,6 +12,7 @@ dependencies { testFixturesApi("org.junit.jupiter:junit-jupiter-params") testFixturesApi("org.assertj:assertj-core:3.27.7") testFixturesApi("ch.qos.logback:logback-classic:1.5.27") + testFixturesApi("org.jspecify:jspecify:1.0.0") } checkerFramework { diff --git a/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java b/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java index aa0921ea0fc..fe0f06cae0c 100644 --- a/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java +++ b/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/TestLogMgr.java @@ -1,3 +1,6 @@ +/* This file is part of KeY - https://key-project.org + * KeY is licensed under the GNU General Public License Version 2 + * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.testfixtures; import ch.qos.logback.classic.spi.ILoggingEvent; @@ -16,17 +19,20 @@ * @version 1 (2/17/26) */ public class TestLogMgr implements AfterTestExecutionCallback, BeforeTestExecutionCallback { - private static ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory - .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + private static ch.qos.logback.classic.Logger root = + (ch.qos.logback.classic.Logger) LoggerFactory + .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); private static final ConsoleAppender consoleAppender; - private static final StringListAppender listAppender = new StringListAppender<>(); + private static final StringListAppender listAppender = + new StringListAppender<>(); static { consoleAppender = (ConsoleAppender) root.getAppender("STDOUT"); listAppender.setContext(consoleAppender.getContext()); - listAppender.setLayout(((LayoutWrappingEncoder) consoleAppender.getEncoder()).getLayout()); + listAppender.setLayout( + ((LayoutWrappingEncoder) consoleAppender.getEncoder()).getLayout()); listAppender.start(); } From 98b05b803bf19394c98f792804ef9b8e535fd118 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 20 Feb 2026 22:20:08 +0100 Subject: [PATCH 3/7] add missing modules to the Github CI tests --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 80755646908..5ed0d6e93e9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,7 +27,7 @@ jobs: modules: [ keyext.exploration, keyext.slicing, key.ncore, key.ui, key.core, key.core.rifl, key.core.testgen, keyext.isabelletranslation, keyext.ui.testgen, key.ncore.calculus, - key.util, key.core.example, keyext.caching, + key.util, key.core.example, keyext.caching, key.core.wd, key.core.infflow, keyext.proofmanagement, key.removegenerics ] continue-on-error: true runs-on: ${{ matrix.os }} From 2f98015edf41fe8176c8f829dd6cc6038ccee66a Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Mon, 23 Feb 2026 16:02:04 +0100 Subject: [PATCH 4/7] logback.xml is now provided via textFixtures --- .../src/main/resources/logback.xml | 56 ------------------- .../src/test/resources/logback.xml | 14 ----- .../src/test/resources/logback.xml | 16 ------ .../src/test/resources/logback.xml | 13 ----- .../src/test/resources/logback.xml | 14 ----- key.ui/src/main/resources/logback.xml | 56 ------------------- key.ui/src/test/resources/logback.xml | 14 ----- key.util/src/test/resources/logback.xml | 14 ----- 8 files changed, 197 deletions(-) delete mode 100644 key.core.example/src/main/resources/logback.xml delete mode 100644 key.core.proof_references/src/test/resources/logback.xml delete mode 100644 key.core.symbolic_execution/src/test/resources/logback.xml delete mode 100644 key.core.testgen/src/test/resources/logback.xml delete mode 100644 key.removegenerics/src/test/resources/logback.xml delete mode 100644 key.ui/src/main/resources/logback.xml delete mode 100644 key.ui/src/test/resources/logback.xml delete mode 100644 key.util/src/test/resources/logback.xml diff --git a/key.core.example/src/main/resources/logback.xml b/key.core.example/src/main/resources/logback.xml deleted file mode 100644 index de2952bde1c..00000000000 --- a/key.core.example/src/main/resources/logback.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - ${user.home}/.key/logs/key_${timestamp}.log - false - - UTF-8 - - %date|%level|%thread|%logger|%file:%line|%replace(%msg){'[\n\r]','\\n'}|%replace(%ex){'[\n\r]','\\n'}%nopex|%n - true - - - - - - [%date{HH:mm:ss.SSS}] %highlight(%-5level) %cyan(%logger{0}) - %msg%ex%n - - - - INFO - - - - - - - - - - - - [%relative] %highlight(%-5level) %cyan(%logger{0}): %msg %n - - - TRACE - - - - - - - diff --git a/key.core.proof_references/src/test/resources/logback.xml b/key.core.proof_references/src/test/resources/logback.xml deleted file mode 100644 index 875e9e091de..00000000000 --- a/key.core.proof_references/src/test/resources/logback.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - key.log - false - - %-10relative %-5level %-15thread %-25logger{5} %msg %ex{short}%n - - - - - - - \ No newline at end of file diff --git a/key.core.symbolic_execution/src/test/resources/logback.xml b/key.core.symbolic_execution/src/test/resources/logback.xml deleted file mode 100644 index c96e3c9f3f3..00000000000 --- a/key.core.symbolic_execution/src/test/resources/logback.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - key.log - false - - %-10relative %-5level %-15thread %-25logger{5} %msg %ex{short}%n - - - - - - - \ No newline at end of file diff --git a/key.core.testgen/src/test/resources/logback.xml b/key.core.testgen/src/test/resources/logback.xml deleted file mode 100644 index cb61ddc4380..00000000000 --- a/key.core.testgen/src/test/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - key.log - false - - %-10relative %-5level %-15thread %-25logger{5} %msg %ex{short}%n - - - - - - - \ No newline at end of file diff --git a/key.removegenerics/src/test/resources/logback.xml b/key.removegenerics/src/test/resources/logback.xml deleted file mode 100644 index 875e9e091de..00000000000 --- a/key.removegenerics/src/test/resources/logback.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - key.log - false - - %-10relative %-5level %-15thread %-25logger{5} %msg %ex{short}%n - - - - - - - \ No newline at end of file diff --git a/key.ui/src/main/resources/logback.xml b/key.ui/src/main/resources/logback.xml deleted file mode 100644 index f22b587756a..00000000000 --- a/key.ui/src/main/resources/logback.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - ${user.home}/.key/logs/key_${timestamp}.log - false - - UTF-8 - - %date|%level|%thread|%logger|%file:%line|%replace(%msg){'[\n\r]','\\n'}|%replace(%ex){'[\n\r]','\\n'}%nopex|%n - true - - - - - - [%date{HH:mm:ss.SSS}] %highlight(%-5level) %cyan(%logger{0}) - %msg%ex%n - - - - INFO - - - - - - - - - - - - [%relative] %highlight(%-5level) %cyan(%logger{0}): %msg %n - - - TRACE - - - - - - - diff --git a/key.ui/src/test/resources/logback.xml b/key.ui/src/test/resources/logback.xml deleted file mode 100644 index eefd443474d..00000000000 --- a/key.ui/src/test/resources/logback.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - key.log - false - - %-10relative %-5level %-15thread %-25logger{5} %msg %ex%n - - - - - - - diff --git a/key.util/src/test/resources/logback.xml b/key.util/src/test/resources/logback.xml deleted file mode 100644 index 875e9e091de..00000000000 --- a/key.util/src/test/resources/logback.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - key.log - false - - %-10relative %-5level %-15thread %-25logger{5} %msg %ex{short}%n - - - - - - - \ No newline at end of file From 07b07bf01142b7417b894f58d855f90771edcee4 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Mon, 23 Feb 2026 21:43:38 +0100 Subject: [PATCH 5/7] added GithubTestPrinter --- .github/workflows/code_quality.yml | 2 +- .../key/testfixtures/GithubTestPrinter.java | 83 +++++++++++++++++++ .../org.junit.jupiter.api.extension.Extension | 3 +- 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/GithubTestPrinter.java diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml index c962aa4a212..256132a6171 100644 --- a/.github/workflows/code_quality.yml +++ b/.github/workflows/code_quality.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v5 - name: Build with Gradle - run: ./gradlew -DENABLE_NULLNESS=true compileTest + run: ./gradlew -DENABLE_NULLNESS=true compileTestJava formatting: runs-on: ubuntu-latest diff --git a/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/GithubTestPrinter.java b/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/GithubTestPrinter.java new file mode 100644 index 00000000000..58afda17f72 --- /dev/null +++ b/key.util/src/testFixtures/java/de/uka/ilkd/key/testfixtures/GithubTestPrinter.java @@ -0,0 +1,83 @@ +/* This file is part of KeY - https://key-project.org + * KeY is licensed under the GNU General Public License Version 2 + * SPDX-License-Identifier: GPL-2.0-only */ +package de.uka.ilkd.key.testfixtures; + +import java.util.Optional; + +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestWatcher; + +/// A JUnit extension to print out workflow commands of Github actions to make logs more accessible. +/// +/// [See Github's +/// documentation.](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-commands#grouping-log-lines) +/// +/// @author Alexander Weigl +/// @version 1 (2026-02-23) +public class GithubTestPrinter implements TestWatcher, BeforeAllCallback, AfterAllCallback { + private static final boolean ENABLED = "true".equals(System.getenv("CI")); + + @Override + public void testAborted(ExtensionContext context, Throwable cause) { + if (ENABLED) { + return; + } + System.out.format("::error title=Test aborted %s::Test %s#%s aborted due to \"%s: %s\"%n", + context.getDisplayName(), + context.getRequiredTestClass().getName(), + context.getRequiredTestMethod().getName(), + cause.getClass().getName(), cause.getMessage()); + } + + @Override + public void testDisabled(ExtensionContext context, Optional reason) { + if (ENABLED) { + return; + } + System.out.format("::notice title=Disabled test %s::Test %s#%s disabled due to %s%n", + context.getDisplayName(), + context.getRequiredTestClass().getName(), + context.getRequiredTestMethod().getName(), + reason.orElse("no reason given")); + } + + @Override + public void testFailed(ExtensionContext context, Throwable cause) { + if (ENABLED) { + return; + } + System.out.format("::error title=Test failed %s::Test %s#%s aborted due to \"%s: %s\"%n", + context.getDisplayName(), + context.getRequiredTestClass().getName(), + context.getRequiredTestMethod().getName(), + cause.getClass().getName(), cause.getMessage()); + } + + @Override + public void testSuccessful(ExtensionContext context) { + if (ENABLED) { + return; + } + System.out.format("::debug::SUCCESS:%s%n", context.getDisplayName()); + } + + + @Override + public void beforeAll(ExtensionContext context) { + if (ENABLED) { + return; + } + System.out.format("::group::%s%n", context.getDisplayName()); + } + + @Override + public void afterAll(ExtensionContext context) { + if (ENABLED) { + return; + } + System.out.format("::endgroup::"); + } +} diff --git a/key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension index 8d2ead25738..cf9ce50c0f2 100644 --- a/key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ b/key.util/src/testFixtures/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -1 +1,2 @@ -de.uka.ilkd.key.testfixtures.TestLogMgr \ No newline at end of file +de.uka.ilkd.key.testfixtures.TestLogMgr +de.uka.ilkd.key.testfixtures.GithubTestPrinter \ No newline at end of file From d04581762f98b6351beec33d9e2a9e4bdbc89c96 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Wed, 25 Feb 2026 00:02:15 +0100 Subject: [PATCH 6/7] fix classpath of checkerFramework --- build.gradle | 15 --------------- key.util/build.gradle | 12 ++++++++++++ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index 3781848414d..70593d9220f 100644 --- a/build.gradle +++ b/build.gradle @@ -63,8 +63,6 @@ subprojects { dependencies { implementation("org.slf4j:slf4j-api:2.0.17") - testImplementation("ch.qos.logback:logback-classic:1.5.27") - compileOnly("org.jspecify:jspecify:1.0.0") testCompileOnly("org.jspecify:jspecify:1.0.0") @@ -75,20 +73,7 @@ subprojects { checkerFramework "io.github.eisop:checker-qual:$eisop_version" checkerFramework "io.github.eisop:checker:$eisop_version" - testImplementation("ch.qos.logback:logback-classic:1.5.27") - - testImplementation(platform("org.junit:junit-bom:5.14.2")) - testImplementation("org.junit.jupiter:junit-jupiter-api") - testImplementation("org.junit.jupiter:junit-jupiter-params") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") - testImplementation("org.assertj:assertj-core:3.27.7") - testImplementation(project(':key.util')) testImplementation(testFixtures(project(":key.util"))) - - // test fixtures - testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.21.0") - testImplementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.21.0") } tasks.withType(JavaCompile).configureEach { diff --git a/key.util/build.gradle b/key.util/build.gradle index 3616f584c11..63ea3fb5be5 100644 --- a/key.util/build.gradle +++ b/key.util/build.gradle @@ -7,12 +7,24 @@ description = "Utility library of the key-project" dependencies { implementation("org.jspecify:jspecify:1.0.0") + // we also export these dependency into src/test/java. + testFixturesApi(project(':key.util')) + testFixturesApi(platform("org.junit:junit-bom:5.14.2")) testFixturesApi("org.junit.jupiter:junit-jupiter-api") testFixturesApi("org.junit.jupiter:junit-jupiter-params") testFixturesApi("org.assertj:assertj-core:3.27.7") testFixturesApi("ch.qos.logback:logback-classic:1.5.27") testFixturesApi("org.jspecify:jspecify:1.0.0") + + testFixturesApi("ch.qos.logback:logback-classic:1.5.27") + + // test fixtures + testFixturesApi("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.21.0") + testFixturesApi("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.21.0") + + def eisop_version = "3.49.3-eisop1" + testFixturesCompileOnly( "io.github.eisop:checker-qual:$eisop_version") } checkerFramework { From 4fe7c34e2403d9f7388ca51ccefab505d9032708 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Wed, 25 Feb 2026 00:16:23 +0100 Subject: [PATCH 7/7] restore old deps --- build.gradle | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/build.gradle b/build.gradle index 70593d9220f..f7431e3bb6c 100644 --- a/build.gradle +++ b/build.gradle @@ -74,6 +74,22 @@ subprojects { checkerFramework "io.github.eisop:checker:$eisop_version" testImplementation(testFixtures(project(":key.util"))) + + testImplementation("ch.qos.logback:logback-classic:1.5.27") + + testImplementation(platform("org.junit:junit-bom:5.14.2")) + testImplementation ("org.junit.jupiter:junit-jupiter-api") + testImplementation ("org.junit.jupiter:junit-jupiter-params") + testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine") + testRuntimeOnly ("org.junit.platform:junit-platform-launcher") + testImplementation ("org.assertj:assertj-core:3.27.7") + testImplementation project(':key.util') + + // test fixtures + testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.21.0") + testImplementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.21.0") + + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' } tasks.withType(JavaCompile).configureEach {