From 2f0ce4421198d1023a7976d121792cfb0cdef1a5 Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Thu, 16 Feb 2023 10:41:26 +0000 Subject: [PATCH 1/5] Implement JUnit5 support and parameterize tests --- examples/java/greetings_project/BUILD.bazel | 0 examples/java/greetings_project/WORKSPACE | 27 + .../java/greetings_project/greeting_lib/BUILD | 47 +- .../example/{ => junit4}/GreetingTest.java | 3 +- .../junit4/ParameterizedGreetingTest.java | 30 + .../com/example/junit5/GreetingTest.java | 34 + .../junit5/ParameterizedGreetingTest.java | 23 + .../java/greetings_project/hi/hi.bazelproject | 2 +- .../java/greetings_project/junit5_deps.bzl | 60 + .../java/greetings_project/maven_install.json | 1944 +++++++++++++++++ .../blaze/java/run/JUnitTestHeuristic.java | 69 +- .../producers/BlazeJUnitTestFilterFlags.java | 41 +- ...AbstractTestCaseConfigurationProducer.java | 16 +- .../java/run/CombinedTestHeuristicTest.java | 17 +- .../java/run/JUnitTestHeuristicTest.java | 43 +- ...zeJUnitTestFilterFlagsIntegrationTest.java | 114 +- ...ractTestCaseConfigurationProducerTest.java | 161 +- ...avaTestClassConfigurationProducerTest.java | 157 +- ...vaTestMethodConfigurationProducerTest.java | 88 +- ...pleJavaClassesTestContextProviderTest.java | 145 +- ...JUnitRunConfigurationProducerTestCase.java | 59 + .../idea/blaze/java/utils/JUnitTestUtils.java | 95 + .../BlazeJUnitTestFilterFlagsTest.java | 38 + 23 files changed, 2681 insertions(+), 532 deletions(-) create mode 100644 examples/java/greetings_project/BUILD.bazel rename examples/java/greetings_project/greeting_lib/tests/com/example/{ => junit4}/GreetingTest.java (94%) create mode 100644 examples/java/greetings_project/greeting_lib/tests/com/example/junit4/ParameterizedGreetingTest.java create mode 100644 examples/java/greetings_project/greeting_lib/tests/com/example/junit5/GreetingTest.java create mode 100644 examples/java/greetings_project/greeting_lib/tests/com/example/junit5/ParameterizedGreetingTest.java create mode 100644 examples/java/greetings_project/junit5_deps.bzl create mode 100644 examples/java/greetings_project/maven_install.json create mode 100644 java/tests/integrationtests/com/google/idea/blaze/java/utils/BlazeJUnitRunConfigurationProducerTestCase.java create mode 100644 java/tests/integrationtests/com/google/idea/blaze/java/utils/JUnitTestUtils.java diff --git a/examples/java/greetings_project/BUILD.bazel b/examples/java/greetings_project/BUILD.bazel new file mode 100644 index 00000000000..e69de29bb2d diff --git a/examples/java/greetings_project/WORKSPACE b/examples/java/greetings_project/WORKSPACE index 2431ba32276..0251ecbc3bc 100644 --- a/examples/java/greetings_project/WORKSPACE +++ b/examples/java/greetings_project/WORKSPACE @@ -1,4 +1,5 @@ load("@bazel_tools//tools/build_defs/repo:jvm.bzl", "jvm_maven_import_external") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") jvm_maven_import_external( name = "junit", @@ -7,3 +8,29 @@ jvm_maven_import_external( licenses = ["notice"], # Common Public License 1.0 server_urls = ["https://repo1.maven.org/maven2"], ) + +# JUnit 5 + +load("//:junit5_deps.bzl", "instantiate_junit5_deps") + +instantiate_junit5_deps() + +# `contrib_rules_jvm` gives us access to `java_test_suite` and the JUnit5 runner. +CONTRIB_RULES_JVM_VERSION = "0.9.0" + +CONTRIB_RULES_JVM_SHA = "548f0583192ff79c317789b03b882a7be9b1325eb5d3da5d7fdcc4b7ca69d543" + +http_archive( + name = "contrib_rules_jvm", + sha256 = CONTRIB_RULES_JVM_SHA, + strip_prefix = "rules_jvm-%s" % CONTRIB_RULES_JVM_VERSION, + url = "https://github.com/bazel-contrib/rules_jvm/archive/refs/tags/v%s.tar.gz" % CONTRIB_RULES_JVM_VERSION, +) + +load("@contrib_rules_jvm//:repositories.bzl", "contrib_rules_jvm_deps") + +contrib_rules_jvm_deps() + +load("@contrib_rules_jvm//:setup.bzl", "contrib_rules_jvm_setup") + +contrib_rules_jvm_setup() diff --git a/examples/java/greetings_project/greeting_lib/BUILD b/examples/java/greetings_project/greeting_lib/BUILD index ab0fd803ef4..a11a6ed197e 100644 --- a/examples/java/greetings_project/greeting_lib/BUILD +++ b/examples/java/greetings_project/greeting_lib/BUILD @@ -1,3 +1,6 @@ +load("@contrib_rules_jvm//java:defs.bzl", "java_junit5_test", "java_test_suite") +load("//:junit5_deps.bzl", "JUNIT5_DEPS") + java_library( name = "greeting_lib", srcs = ["src/com/example/Greeting.java"], @@ -5,11 +8,49 @@ java_library( ) java_test( - name = "greeting_test", - srcs = ["tests/com/example/GreetingTest.java"], - test_class = "com.example.GreetingTest", + name = "greeting_test_junit4", + srcs = [ + "tests/com/example/junit4/GreetingTest.java", + ], + test_class = "com.example.junit4.GreetingTest", + deps = [ + ":greeting_lib", + "@junit//jar", + ], +) + +java_test( + name = "parameterized_greeting_test_junit4", + srcs = [ + "tests/com/example/junit4/ParameterizedGreetingTest.java", + ], + test_class = "com.example.junit4.ParameterizedGreetingTest", deps = [ ":greeting_lib", "@junit//jar", ], ) + +java_junit5_test( + name = "greeting_test_junit5", + size = "small", + srcs = [ + "tests/com/example/junit5/GreetingTest.java", + ], + test_class = "com.example.junit5.GreetingTest", + deps = [ + ":greeting_lib", + ] + JUNIT5_DEPS, +) + +java_junit5_test( + name = "parameterized_greeting_test_junit5", + size = "small", + srcs = [ + "tests/com/example/junit5/ParameterizedGreetingTest.java", + ], + test_class = "com.example.junit5.ParameterizedGreetingTest", + deps = [ + ":greeting_lib", + ] + JUNIT5_DEPS, +) diff --git a/examples/java/greetings_project/greeting_lib/tests/com/example/GreetingTest.java b/examples/java/greetings_project/greeting_lib/tests/com/example/junit4/GreetingTest.java similarity index 94% rename from examples/java/greetings_project/greeting_lib/tests/com/example/GreetingTest.java rename to examples/java/greetings_project/greeting_lib/tests/com/example/junit4/GreetingTest.java index c3d11cc485f..1202474e7a6 100644 --- a/examples/java/greetings_project/greeting_lib/tests/com/example/GreetingTest.java +++ b/examples/java/greetings_project/greeting_lib/tests/com/example/junit4/GreetingTest.java @@ -1,6 +1,7 @@ -package com.example; +package com.example.junit4; import org.junit.Test; +import com.example.Greeting; import java.util.Arrays; import java.util.Collections; diff --git a/examples/java/greetings_project/greeting_lib/tests/com/example/junit4/ParameterizedGreetingTest.java b/examples/java/greetings_project/greeting_lib/tests/com/example/junit4/ParameterizedGreetingTest.java new file mode 100644 index 00000000000..5ba39b333f3 --- /dev/null +++ b/examples/java/greetings_project/greeting_lib/tests/com/example/junit4/ParameterizedGreetingTest.java @@ -0,0 +1,30 @@ +package com.example.junit4; + +import com.example.Greeting; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +@RunWith(Parameterized.class) +public class ParameterizedGreetingTest { + @Parameterized.Parameter + public String name; + + @Parameterized.Parameters(name = "Test name {0}") + public static String[] names() { + return new String[]{"Henry", "Roberta"}; + } + + @Test + public void testGreetOneName() { + List got = Greeting.getGreetings("greetings", Collections.singletonList(name)); + assertEquals(1, got.size()); + String expected = "greetings " + name + "!"; + assertEquals(expected, got.get(0)); + } +} diff --git a/examples/java/greetings_project/greeting_lib/tests/com/example/junit5/GreetingTest.java b/examples/java/greetings_project/greeting_lib/tests/com/example/junit5/GreetingTest.java new file mode 100644 index 00000000000..4916328bac6 --- /dev/null +++ b/examples/java/greetings_project/greeting_lib/tests/com/example/junit5/GreetingTest.java @@ -0,0 +1,34 @@ +package com.example.junit5; + +import com.example.Greeting; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GreetingTest { + @Test + public void testGreetNoNames() { + List got = Greeting.getGreetings("greetings", Collections.emptyList()); + assertEquals(0, got.size()); + } + + @Test + public void testGreetOneName() { + List got = Greeting.getGreetings("greetings", Collections.singletonList("name")); + assertEquals(1, got.size()); + assertEquals("greetings name!", got.get(0)); + } + + @Test + public void testGreetMultipleNames() { + List got = Greeting.getGreetings("greetings", Arrays.asList("name1", "name2", "name3")); + assertEquals(3, got.size()); + assertEquals("greetings name1!", got.get(0)); + assertEquals("greetings name2!", got.get(1)); + assertEquals("greetings name3!", got.get(2)); + } +} diff --git a/examples/java/greetings_project/greeting_lib/tests/com/example/junit5/ParameterizedGreetingTest.java b/examples/java/greetings_project/greeting_lib/tests/com/example/junit5/ParameterizedGreetingTest.java new file mode 100644 index 00000000000..9d88cdaf8bf --- /dev/null +++ b/examples/java/greetings_project/greeting_lib/tests/com/example/junit5/ParameterizedGreetingTest.java @@ -0,0 +1,23 @@ +package com.example.junit5; + +import com.example.Greeting; + +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ParameterizedGreetingTest { + @ParameterizedTest + @ValueSource(strings = { "Henry", "Roberta" }) + public void testGreetOneName(String name) { + List got = Greeting.getGreetings("greetings", Collections.singletonList(name)); + assertEquals(1, got.size()); + String expected = "greetings " + name + "!"; + assertEquals(expected, got.get(0)); + } +} diff --git a/examples/java/greetings_project/hi/hi.bazelproject b/examples/java/greetings_project/hi/hi.bazelproject index af1c090b509..b75cd84f53b 100644 --- a/examples/java/greetings_project/hi/hi.bazelproject +++ b/examples/java/greetings_project/hi/hi.bazelproject @@ -18,4 +18,4 @@ additional_languages: # dart # kotlin # python - # scala \ No newline at end of file + # scala diff --git a/examples/java/greetings_project/junit5_deps.bzl b/examples/java/greetings_project/junit5_deps.bzl new file mode 100644 index 00000000000..88816130398 --- /dev/null +++ b/examples/java/greetings_project/junit5_deps.bzl @@ -0,0 +1,60 @@ +load("@bazel_tools//tools/build_defs/repo:jvm.bzl", "jvm_maven_import_external") + +JUNIT_JUPITER_VERSION = "5.9.2" + +JUNIT_PLATFORM_VERSION = "1.9.2" + +_JUNIT5_DEPS_TO_FETCH = [ + { + "name": "junit_platform_launcher", + "coords": "org.junit.platform:junit-platform-launcher:%s" % JUNIT_PLATFORM_VERSION, + "artifact_sha256": "eef139eb09c98e9cdd358b6ce4c6cdd59b30c6a88096e369c33ba96e67edf0e4", + }, + { + "name": "junit_platform_reporting", + "coords": "org.junit.platform:junit-platform-reporting:%s" % JUNIT_PLATFORM_VERSION, + "artifact_sha256": "d6788db1c941c1247e07d8104f57c3f06175cadfd43060a792493fe9195671db", + }, + { + "name": "junit_platform_commons", + "coords": "org.junit.platform:junit-platform-commons:%s" % JUNIT_PLATFORM_VERSION, + "artifact_sha256": "624a3d745ef1d28e955a6a67af8edba0fdfc5c9bad680a73f67a70bb950a683d", + }, + { + "name": "junit_platform_engine", + "coords": "org.junit.platform:junit-platform-engine:%s" % JUNIT_PLATFORM_VERSION, + "artifact_sha256": "25f23dc535a091e9dc80c008faf29dcb92be902e6911f77a736fbaf019908367", + }, + { + "name": "junit_jupiter_api", + "coords": "org.junit.jupiter:junit-jupiter-api:%s" % JUNIT_JUPITER_VERSION, + "artifact_sha256": "f767a170f97127b0ad3582bf3358eabbbbe981d9f96411853e629d9276926fd5", + }, + { + "name": "junit_jupiter_params", + "coords": "org.junit.jupiter:junit-jupiter-params:%s" % JUNIT_JUPITER_VERSION, + "artifact_sha256": "bde91900a5ce5d6663bb44bc708494b35daefcd73e1bb7afa61a4affe38ea97d", + }, + { + "name": "junit_jupiter_engine", + "coords": "org.junit.jupiter:junit-jupiter-engine:%s" % JUNIT_JUPITER_VERSION, + "artifact_sha256": "74cfc49388f760413ff348ca2c9ab39527484b57deecd157f2275a5f8a5fe971", + }, + { + "name": "opentest4j", + "coords": "org.opentest4j:opentest4j:1.2.0", + "artifact_sha256": "58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2", + }, +] + +JUNIT5_DEPS = ["@{name}//jar".format(name = dep["name"]) for dep in _JUNIT5_DEPS_TO_FETCH] + +def instantiate_junit5_deps(): + for dep in _JUNIT5_DEPS_TO_FETCH: + jvm_maven_import_external( + name = dep["name"], + artifact = dep["coords"], + artifact_sha256 = dep["artifact_sha256"], + licenses = ["notice"], # Common Public License 1.0 + server_urls = ["https://repo1.maven.org/maven2"], + ) diff --git a/examples/java/greetings_project/maven_install.json b/examples/java/greetings_project/maven_install.json new file mode 100644 index 00000000000..88d52c2534e --- /dev/null +++ b/examples/java/greetings_project/maven_install.json @@ -0,0 +1,1944 @@ +{ + "dependency_tree": { + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": 1873575879, + "__RESOLVED_ARTIFACTS_HASH": -15346957, + "conflict_resolution": { + "org.junit.jupiter:junit-jupiter-api:5.8.2": "org.junit.jupiter:junit-jupiter-api:5.9.2", + "org.junit.jupiter:junit-jupiter-engine:5.8.2": "org.junit.jupiter:junit-jupiter-engine:5.9.2", + "org.junit.platform:junit-platform-commons:1.8.2": "org.junit.platform:junit-platform-commons:1.9.2", + "org.junit.platform:junit-platform-engine:1.8.2": "org.junit.platform:junit-platform-engine:1.9.2" + }, + "dependencies": [ + { + "coord": "com.apple.pcl:pcl-codegen-java:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-commons-cli:0.23.2", + "com.apple.pcl:pcl-commons:0.23.2", + "com.apple.pcl:pcl-core:0.23.2", + "com.squareup:javapoet:1.13.0", + "com.tunnelvisionlabs:antlr4-runtime:4.9.0", + "net.sf.jopt-simple:jopt-simple:5.0.4", + "org.graalvm.sdk:graal-sdk:22.0.0.2", + "org.graalvm.truffle:truffle-api:22.0.0.2", + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "org.jetbrains:annotations:13.0", + "org.organicdesign:Paguro:3.10.3", + "org.snakeyaml:snakeyaml-engine:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-commons-cli:0.23.2", + "com.apple.pcl:pcl-commons:0.23.2", + "com.apple.pcl:pcl-core:0.23.2", + "com.squareup:javapoet:1.13.0", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-codegen-java/0.23.2/pcl-codegen-java-0.23.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-codegen-java/0.23.2/pcl-codegen-java-0.23.2.jar" + ], + "packages": [ + "com.apple.pcl.codegen.java" + ], + "sha256": "da40cc90cff703034f334620e5bf772b205a50be54738473e41ca50d5f3a152d", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-codegen-java/0.23.2/pcl-codegen-java-0.23.2.jar" + }, + { + "coord": "com.apple.pcl:pcl-codegen-java:jar:sources:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-commons-cli:jar:sources:0.23.2", + "com.apple.pcl:pcl-commons:jar:sources:0.23.2", + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "com.squareup:javapoet:jar:sources:1.13.0", + "com.tunnelvisionlabs:antlr4-runtime:jar:sources:4.9.0", + "net.sf.jopt-simple:jopt-simple:jar:sources:5.0.4", + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2", + "org.graalvm.truffle:truffle-api:jar:sources:22.0.0.2", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0", + "org.organicdesign:Paguro:jar:sources:3.10.3", + "org.snakeyaml:snakeyaml-engine:jar:sources:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-commons-cli:jar:sources:0.23.2", + "com.apple.pcl:pcl-commons:jar:sources:0.23.2", + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "com.squareup:javapoet:jar:sources:1.13.0", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-codegen-java/0.23.2/pcl-codegen-java-0.23.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-codegen-java/0.23.2/pcl-codegen-java-0.23.2-sources.jar" + ], + "packages": [], + "sha256": "004f683ff4fa8eeb33ff10cb000f33e5d6563d1e98268bcc300f78034517896c", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-codegen-java/0.23.2/pcl-codegen-java-0.23.2-sources.jar" + }, + { + "coord": "com.apple.pcl:pcl-commons-cli:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-commons:0.23.2", + "com.apple.pcl:pcl-core:0.23.2", + "com.tunnelvisionlabs:antlr4-runtime:4.9.0", + "net.sf.jopt-simple:jopt-simple:5.0.4", + "org.graalvm.sdk:graal-sdk:22.0.0.2", + "org.graalvm.truffle:truffle-api:22.0.0.2", + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "org.jetbrains:annotations:13.0", + "org.organicdesign:Paguro:3.10.3", + "org.snakeyaml:snakeyaml-engine:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-commons:0.23.2", + "com.apple.pcl:pcl-core:0.23.2", + "net.sf.jopt-simple:jopt-simple:5.0.4", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons-cli/0.23.2/pcl-commons-cli-0.23.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons-cli/0.23.2/pcl-commons-cli-0.23.2.jar" + ], + "packages": [ + "com.apple.pcl.commons.cli" + ], + "sha256": "47d57461a28cf2aea8b98029455f853d9289a571238caa05f7bb384e938be39d", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons-cli/0.23.2/pcl-commons-cli-0.23.2.jar" + }, + { + "coord": "com.apple.pcl:pcl-commons-cli:jar:sources:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-commons:jar:sources:0.23.2", + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "com.tunnelvisionlabs:antlr4-runtime:jar:sources:4.9.0", + "net.sf.jopt-simple:jopt-simple:jar:sources:5.0.4", + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2", + "org.graalvm.truffle:truffle-api:jar:sources:22.0.0.2", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0", + "org.organicdesign:Paguro:jar:sources:3.10.3", + "org.snakeyaml:snakeyaml-engine:jar:sources:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-commons:jar:sources:0.23.2", + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "net.sf.jopt-simple:jopt-simple:jar:sources:5.0.4", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons-cli/0.23.2/pcl-commons-cli-0.23.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons-cli/0.23.2/pcl-commons-cli-0.23.2-sources.jar" + ], + "packages": [], + "sha256": "37349bc620a4f692df0124aef94705886fded7ecd4fcecacf1076c85419d044c", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons-cli/0.23.2/pcl-commons-cli-0.23.2-sources.jar" + }, + { + "coord": "com.apple.pcl:pcl-commons:0.23.2", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "org.jetbrains:annotations:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons/0.23.2/pcl-commons-0.23.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons/0.23.2/pcl-commons-0.23.2.jar" + ], + "packages": [ + "com.apple.pcl.commons" + ], + "sha256": "1a4884ed6e0f91f15f14b8098231429639f660dc57eba2e52d5345d23c3e44df", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons/0.23.2/pcl-commons-0.23.2.jar" + }, + { + "coord": "com.apple.pcl:pcl-commons:jar:sources:0.23.2", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons/0.23.2/pcl-commons-0.23.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons/0.23.2/pcl-commons-0.23.2-sources.jar" + ], + "packages": [], + "sha256": "da4833d250e51e88d850a997b2af4e7782028a32a0e69938d4312cf2396d756d", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-commons/0.23.2/pcl-commons-0.23.2-sources.jar" + }, + { + "coord": "com.apple.pcl:pcl-config-java:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-core:0.23.2", + "com.tunnelvisionlabs:antlr4-runtime:4.9.0", + "io.leangen.geantyref:geantyref:1.3.13", + "org.graalvm.sdk:graal-sdk:22.0.0.2", + "org.graalvm.truffle:truffle-api:22.0.0.2", + "org.organicdesign:Paguro:3.10.3", + "org.snakeyaml:snakeyaml-engine:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-core:0.23.2", + "io.leangen.geantyref:geantyref:1.3.13" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-config-java/0.23.2/pcl-config-java-0.23.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-config-java/0.23.2/pcl-config-java-0.23.2.jar" + ], + "packages": [ + "com.apple.pcl.config.java", + "com.apple.pcl.config.java.mapper" + ], + "sha256": "d5b762058c9e44bd833aca057415dc258c223525768e291616ab8e09e358235b", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-config-java/0.23.2/pcl-config-java-0.23.2.jar" + }, + { + "coord": "com.apple.pcl:pcl-config-java:jar:sources:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "com.tunnelvisionlabs:antlr4-runtime:jar:sources:4.9.0", + "io.leangen.geantyref:geantyref:jar:sources:1.3.13", + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2", + "org.graalvm.truffle:truffle-api:jar:sources:22.0.0.2", + "org.organicdesign:Paguro:jar:sources:3.10.3", + "org.snakeyaml:snakeyaml-engine:jar:sources:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "io.leangen.geantyref:geantyref:jar:sources:1.3.13" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-config-java/0.23.2/pcl-config-java-0.23.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-config-java/0.23.2/pcl-config-java-0.23.2-sources.jar" + ], + "packages": [], + "sha256": "6381651a3ce8b34644890f16eaced9075fa94ba017e0660ec689aa5942857592", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-config-java/0.23.2/pcl-config-java-0.23.2-sources.jar" + }, + { + "coord": "com.apple.pcl:pcl-core:0.23.2", + "dependencies": [ + "com.tunnelvisionlabs:antlr4-runtime:4.9.0", + "org.graalvm.sdk:graal-sdk:22.0.0.2", + "org.graalvm.truffle:truffle-api:22.0.0.2", + "org.organicdesign:Paguro:3.10.3", + "org.snakeyaml:snakeyaml-engine:2.3" + ], + "directDependencies": [ + "com.tunnelvisionlabs:antlr4-runtime:4.9.0", + "org.graalvm.sdk:graal-sdk:22.0.0.2", + "org.graalvm.truffle:truffle-api:22.0.0.2", + "org.organicdesign:Paguro:3.10.3", + "org.snakeyaml:snakeyaml-engine:2.3" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-core/0.23.2/pcl-core-0.23.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-core/0.23.2/pcl-core-0.23.2.jar" + ], + "packages": [ + "com.apple.pcl.core", + "com.apple.pcl.core.ast", + "com.apple.pcl.core.ast.builder", + "com.apple.pcl.core.ast.expression", + "com.apple.pcl.core.ast.expression.binary", + "com.apple.pcl.core.ast.expression.generator", + "com.apple.pcl.core.ast.expression.literal", + "com.apple.pcl.core.ast.expression.member", + "com.apple.pcl.core.ast.expression.primary", + "com.apple.pcl.core.ast.expression.ternary", + "com.apple.pcl.core.ast.expression.unary", + "com.apple.pcl.core.ast.frame", + "com.apple.pcl.core.ast.internal", + "com.apple.pcl.core.ast.lambda", + "com.apple.pcl.core.ast.member", + "com.apple.pcl.core.ast.repl", + "com.apple.pcl.core.ast.type", + "com.apple.pcl.core.module", + "com.apple.pcl.core.parser", + "com.apple.pcl.core.parser.antlr", + "com.apple.pcl.core.repl", + "com.apple.pcl.core.resource", + "com.apple.pcl.core.runtime", + "com.apple.pcl.core.service", + "com.apple.pcl.core.settings", + "com.apple.pcl.core.stdlib", + "com.apple.pcl.core.stdlib.base", + "com.apple.pcl.core.stdlib.benchmark", + "com.apple.pcl.core.stdlib.info", + "com.apple.pcl.core.stdlib.json", + "com.apple.pcl.core.stdlib.jsonnet", + "com.apple.pcl.core.stdlib.math", + "com.apple.pcl.core.stdlib.platform", + "com.apple.pcl.core.stdlib.protobuf", + "com.apple.pcl.core.stdlib.reflect", + "com.apple.pcl.core.stdlib.registry", + "com.apple.pcl.core.stdlib.release", + "com.apple.pcl.core.stdlib.test", + "com.apple.pcl.core.stdlib.xml", + "com.apple.pcl.core.stdlib.yaml", + "com.apple.pcl.core.util", + "com.apple.pcl.core.util.json", + "com.apple.pcl.core.util.properties", + "com.apple.pcl.core.util.xml", + "com.apple.pcl.core.util.yaml", + "com.apple.pcl.core.util.yaml.snake" + ], + "sha256": "59639ad6f3de8bdaecbfcabb39f2f97e7fcd1f694afe7a1184fed3fe73e66666", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-core/0.23.2/pcl-core-0.23.2.jar" + }, + { + "coord": "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "dependencies": [ + "com.tunnelvisionlabs:antlr4-runtime:jar:sources:4.9.0", + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2", + "org.graalvm.truffle:truffle-api:jar:sources:22.0.0.2", + "org.organicdesign:Paguro:jar:sources:3.10.3", + "org.snakeyaml:snakeyaml-engine:jar:sources:2.3" + ], + "directDependencies": [ + "com.tunnelvisionlabs:antlr4-runtime:jar:sources:4.9.0", + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2", + "org.graalvm.truffle:truffle-api:jar:sources:22.0.0.2", + "org.organicdesign:Paguro:jar:sources:3.10.3", + "org.snakeyaml:snakeyaml-engine:jar:sources:2.3" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-core/0.23.2/pcl-core-0.23.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-core/0.23.2/pcl-core-0.23.2-sources.jar" + ], + "packages": [], + "sha256": "b7936097825d0311c35083794d4faa03a93afca5acda1cae4942a4b11a7f2d02", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-core/0.23.2/pcl-core-0.23.2-sources.jar" + }, + { + "coord": "com.apple.pcl:pcl-doc:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-commons-cli:0.23.2", + "com.apple.pcl:pcl-commons:0.23.2", + "com.apple.pcl:pcl-core:0.23.2", + "com.tunnelvisionlabs:antlr4-runtime:4.9.0", + "net.sf.jopt-simple:jopt-simple:5.0.4", + "org.commonmark:commonmark-ext-gfm-tables:0.19.0", + "org.commonmark:commonmark:0.19.0", + "org.graalvm.sdk:graal-sdk:22.0.0.2", + "org.graalvm.truffle:truffle-api:22.0.0.2", + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "org.jetbrains.kotlinx:kotlinx-html-jvm:0.8.0", + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.4.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0", + "org.jetbrains:annotations:13.0", + "org.organicdesign:Paguro:3.10.3", + "org.snakeyaml:snakeyaml-engine:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-commons-cli:0.23.2", + "com.apple.pcl:pcl-commons:0.23.2", + "com.apple.pcl:pcl-core:0.23.2", + "net.sf.jopt-simple:jopt-simple:5.0.4", + "org.commonmark:commonmark-ext-gfm-tables:0.19.0", + "org.commonmark:commonmark:0.19.0", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10", + "org.jetbrains.kotlinx:kotlinx-html-jvm:0.8.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-doc/0.23.2/pcl-doc-0.23.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-doc/0.23.2/pcl-doc-0.23.2.jar" + ], + "packages": [ + "com.apple.pcl.doc" + ], + "sha256": "98d62f68bc0f479267610ddd1c5899e383dedb207db40ee3e3899c8ef858ab4b", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-doc/0.23.2/pcl-doc-0.23.2.jar" + }, + { + "coord": "com.apple.pcl:pcl-doc:jar:sources:0.23.2", + "dependencies": [ + "com.apple.pcl:pcl-commons-cli:jar:sources:0.23.2", + "com.apple.pcl:pcl-commons:jar:sources:0.23.2", + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "com.tunnelvisionlabs:antlr4-runtime:jar:sources:4.9.0", + "net.sf.jopt-simple:jopt-simple:jar:sources:5.0.4", + "org.commonmark:commonmark-ext-gfm-tables:jar:sources:0.19.0", + "org.commonmark:commonmark:jar:sources:0.19.0", + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2", + "org.graalvm.truffle:truffle-api:jar:sources:22.0.0.2", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "org.jetbrains.kotlinx:kotlinx-html-jvm:jar:sources:0.8.0", + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources:1.4.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:sources:1.4.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json:jar:sources:1.4.0", + "org.jetbrains:annotations:jar:sources:13.0", + "org.organicdesign:Paguro:jar:sources:3.10.3", + "org.snakeyaml:snakeyaml-engine:jar:sources:2.3" + ], + "directDependencies": [ + "com.apple.pcl:pcl-commons-cli:jar:sources:0.23.2", + "com.apple.pcl:pcl-commons:jar:sources:0.23.2", + "com.apple.pcl:pcl-core:jar:sources:0.23.2", + "net.sf.jopt-simple:jopt-simple:jar:sources:5.0.4", + "org.commonmark:commonmark-ext-gfm-tables:jar:sources:0.19.0", + "org.commonmark:commonmark:jar:sources:0.19.0", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10", + "org.jetbrains.kotlinx:kotlinx-html-jvm:jar:sources:0.8.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json:jar:sources:1.4.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-doc/0.23.2/pcl-doc-0.23.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-doc/0.23.2/pcl-doc-0.23.2-sources.jar" + ], + "packages": [], + "sha256": "e9f93474eeca445fc8133ac1dc6c473788ae9572ef00e2a60fe6730cdd6c904c", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-doc/0.23.2/pcl-doc-0.23.2-sources.jar" + }, + { + "coord": "com.apple.pcl:pcl-tools:0.23.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-tools/0.23.2/pcl-tools-0.23.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-tools/0.23.2/pcl-tools-0.23.2.jar" + ], + "packages": [ + "com.apple.pcl.apple", + "com.apple.pcl.cli", + "com.apple.pcl.cli.repl", + "com.apple.pcl.codegen.java", + "com.apple.pcl.codegen.kotlin", + "com.apple.pcl.commons", + "com.apple.pcl.commons.cli", + "com.apple.pcl.config.java", + "com.apple.pcl.config.java.mapper", + "com.apple.pcl.core", + "com.apple.pcl.core.ast", + "com.apple.pcl.core.ast.builder", + "com.apple.pcl.core.ast.expression", + "com.apple.pcl.core.ast.expression.binary", + "com.apple.pcl.core.ast.expression.generator", + "com.apple.pcl.core.ast.expression.literal", + "com.apple.pcl.core.ast.expression.member", + "com.apple.pcl.core.ast.expression.primary", + "com.apple.pcl.core.ast.expression.ternary", + "com.apple.pcl.core.ast.expression.unary", + "com.apple.pcl.core.ast.frame", + "com.apple.pcl.core.ast.internal", + "com.apple.pcl.core.ast.lambda", + "com.apple.pcl.core.ast.member", + "com.apple.pcl.core.ast.repl", + "com.apple.pcl.core.ast.type", + "com.apple.pcl.core.module", + "com.apple.pcl.core.parser", + "com.apple.pcl.core.parser.antlr", + "com.apple.pcl.core.repl", + "com.apple.pcl.core.resource", + "com.apple.pcl.core.runtime", + "com.apple.pcl.core.service", + "com.apple.pcl.core.settings", + "com.apple.pcl.core.stdlib", + "com.apple.pcl.core.stdlib.base", + "com.apple.pcl.core.stdlib.benchmark", + "com.apple.pcl.core.stdlib.info", + "com.apple.pcl.core.stdlib.json", + "com.apple.pcl.core.stdlib.jsonnet", + "com.apple.pcl.core.stdlib.math", + "com.apple.pcl.core.stdlib.platform", + "com.apple.pcl.core.stdlib.protobuf", + "com.apple.pcl.core.stdlib.reflect", + "com.apple.pcl.core.stdlib.registry", + "com.apple.pcl.core.stdlib.release", + "com.apple.pcl.core.stdlib.test", + "com.apple.pcl.core.stdlib.xml", + "com.apple.pcl.core.stdlib.yaml", + "com.apple.pcl.core.util", + "com.apple.pcl.core.util.json", + "com.apple.pcl.core.util.properties", + "com.apple.pcl.core.util.xml", + "com.apple.pcl.core.util.yaml", + "com.apple.pcl.core.util.yaml.snake", + "com.apple.pcl.doc", + "com.apple.pcl.server", + "com.apple.pcl.thirdparty", + "com.apple.pcl.thirdparty.antlr.v4.runtime", + "com.apple.pcl.thirdparty.antlr.v4.runtime.atn", + "com.apple.pcl.thirdparty.antlr.v4.runtime.dfa", + "com.apple.pcl.thirdparty.antlr.v4.runtime.misc", + "com.apple.pcl.thirdparty.antlr.v4.runtime.tree", + "com.apple.pcl.thirdparty.antlr.v4.runtime.tree.pattern", + "com.apple.pcl.thirdparty.antlr.v4.runtime.tree.xpath", + "com.apple.pcl.thirdparty.commonmark", + "com.apple.pcl.thirdparty.commonmark.ext.gfm.tables", + "com.apple.pcl.thirdparty.commonmark.ext.gfm.tables.internal", + "com.apple.pcl.thirdparty.commonmark.internal", + "com.apple.pcl.thirdparty.commonmark.internal.inline", + "com.apple.pcl.thirdparty.commonmark.internal.renderer", + "com.apple.pcl.thirdparty.commonmark.internal.renderer.text", + "com.apple.pcl.thirdparty.commonmark.internal.util", + "com.apple.pcl.thirdparty.commonmark.node", + "com.apple.pcl.thirdparty.commonmark.parser", + "com.apple.pcl.thirdparty.commonmark.parser.block", + "com.apple.pcl.thirdparty.commonmark.parser.delimiter", + "com.apple.pcl.thirdparty.commonmark.renderer", + "com.apple.pcl.thirdparty.commonmark.renderer.html", + "com.apple.pcl.thirdparty.commonmark.renderer.text", + "com.apple.pcl.thirdparty.geantyref", + "com.apple.pcl.thirdparty.graalvm.collections", + "com.apple.pcl.thirdparty.graalvm.home", + "com.apple.pcl.thirdparty.graalvm.home.impl", + "com.apple.pcl.thirdparty.graalvm.nativeimage", + "com.apple.pcl.thirdparty.graalvm.nativeimage.c", + "com.apple.pcl.thirdparty.graalvm.nativeimage.c.constant", + "com.apple.pcl.thirdparty.graalvm.nativeimage.c.function", + "com.apple.pcl.thirdparty.graalvm.nativeimage.c.struct", + "com.apple.pcl.thirdparty.graalvm.nativeimage.c.type", + "com.apple.pcl.thirdparty.graalvm.nativeimage.hosted", + "com.apple.pcl.thirdparty.graalvm.nativeimage.impl", + "com.apple.pcl.thirdparty.graalvm.nativeimage.impl.clinit", + "com.apple.pcl.thirdparty.graalvm.options", + "com.apple.pcl.thirdparty.graalvm.polyglot", + "com.apple.pcl.thirdparty.graalvm.polyglot.impl", + "com.apple.pcl.thirdparty.graalvm.polyglot.io", + "com.apple.pcl.thirdparty.graalvm.polyglot.management", + "com.apple.pcl.thirdparty.graalvm.polyglot.proxy", + "com.apple.pcl.thirdparty.graalvm.word", + "com.apple.pcl.thirdparty.graalvm.word.impl", + "com.apple.pcl.thirdparty.intellij.lang.annotations", + "com.apple.pcl.thirdparty.jansiinternal", + "com.apple.pcl.thirdparty.jansiio", + "com.apple.pcl.thirdparty.javapoet", + "com.apple.pcl.thirdparty.jetbrains.annotations", + "com.apple.pcl.thirdparty.jline.keymap", + "com.apple.pcl.thirdparty.jline.reader", + "com.apple.pcl.thirdparty.jline.reader.impl", + "com.apple.pcl.thirdparty.jline.reader.impl.completer", + "com.apple.pcl.thirdparty.jline.reader.impl.history", + "com.apple.pcl.thirdparty.jline.terminal", + "com.apple.pcl.thirdparty.jline.terminal.impl", + "com.apple.pcl.thirdparty.jline.terminal.impl.jansi", + "com.apple.pcl.thirdparty.jline.terminal.impl.jansi.freebsd", + "com.apple.pcl.thirdparty.jline.terminal.impl.jansi.linux", + "com.apple.pcl.thirdparty.jline.terminal.impl.jansi.osx", + "com.apple.pcl.thirdparty.jline.terminal.impl.jansi.solaris", + "com.apple.pcl.thirdparty.jline.terminal.impl.jansi.win", + "com.apple.pcl.thirdparty.jline.terminal.spi", + "com.apple.pcl.thirdparty.jline.utils", + "com.apple.pcl.thirdparty.joptsimple", + "com.apple.pcl.thirdparty.joptsimple.internal", + "com.apple.pcl.thirdparty.joptsimple.util", + "com.apple.pcl.thirdparty.kotlin", + "com.apple.pcl.thirdparty.kotlin.annotation", + "com.apple.pcl.thirdparty.kotlin.collections", + "com.apple.pcl.thirdparty.kotlin.collections.builders", + "com.apple.pcl.thirdparty.kotlin.collections.jdk8", + "com.apple.pcl.thirdparty.kotlin.collections.unsigned", + "com.apple.pcl.thirdparty.kotlin.comparisons", + "com.apple.pcl.thirdparty.kotlin.concurrent", + "com.apple.pcl.thirdparty.kotlin.contracts", + "com.apple.pcl.thirdparty.kotlin.coroutines", + "com.apple.pcl.thirdparty.kotlin.coroutines.cancellation", + "com.apple.pcl.thirdparty.kotlin.coroutines.intrinsics", + "com.apple.pcl.thirdparty.kotlin.coroutines.jvm.internal", + "com.apple.pcl.thirdparty.kotlin.experimental", + "com.apple.pcl.thirdparty.kotlin.internal", + "com.apple.pcl.thirdparty.kotlin.internal.jdk7", + "com.apple.pcl.thirdparty.kotlin.internal.jdk8", + "com.apple.pcl.thirdparty.kotlin.io", + "com.apple.pcl.thirdparty.kotlin.io.path", + "com.apple.pcl.thirdparty.kotlin.jdk7", + "com.apple.pcl.thirdparty.kotlin.js", + "com.apple.pcl.thirdparty.kotlin.jvm", + "com.apple.pcl.thirdparty.kotlin.jvm.functions", + "com.apple.pcl.thirdparty.kotlin.jvm.internal", + "com.apple.pcl.thirdparty.kotlin.jvm.internal.markers", + "com.apple.pcl.thirdparty.kotlin.jvm.internal.unsafe", + "com.apple.pcl.thirdparty.kotlin.jvm.jdk8", + "com.apple.pcl.thirdparty.kotlin.jvm.optionals", + "com.apple.pcl.thirdparty.kotlin.math", + "com.apple.pcl.thirdparty.kotlin.properties", + "com.apple.pcl.thirdparty.kotlin.random", + "com.apple.pcl.thirdparty.kotlin.random.jdk8", + "com.apple.pcl.thirdparty.kotlin.ranges", + "com.apple.pcl.thirdparty.kotlin.reflect", + "com.apple.pcl.thirdparty.kotlin.reflect.full", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.calls", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.builtins", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.builtins.functions", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.builtins.jvm", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.descriptors", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.descriptors.annotations", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.descriptors.deserialization", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.descriptors.impl", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.descriptors.java", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.descriptors.runtime.components", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.incremental", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.incremental.components", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.components", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.descriptors", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.lazy", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.lazy.types", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.sources", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.structure", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.java.typeEnhancement", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.kotlin", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.load.kotlin.header", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.metadata", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.metadata.builtins", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.metadata.deserialization", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.metadata.jvm", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.metadata.jvm.deserialization", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.name", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.platform", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.protobuf", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.renderer", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.calls.inference", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.constants", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.deprecation", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.descriptorUtil", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.jvm", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.sam", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.scopes", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.resolve.scopes.receivers", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.serialization", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.serialization.deserialization", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.storage", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.types", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.types.checker", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.types.error", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.types.extensions", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.types.model", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.types.typeUtil", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.types.typesApproximation", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.util", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.util.capitalizeDecapitalize", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.util.collectionUtils", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.impl.utils", + "com.apple.pcl.thirdparty.kotlin.reflect.jvm.internal.pcollections", + "com.apple.pcl.thirdparty.kotlin.sequences", + "com.apple.pcl.thirdparty.kotlin.streams.jdk8", + "com.apple.pcl.thirdparty.kotlin.system", + "com.apple.pcl.thirdparty.kotlin.text", + "com.apple.pcl.thirdparty.kotlin.text.jdk8", + "com.apple.pcl.thirdparty.kotlin.time", + "com.apple.pcl.thirdparty.kotlin.time.jdk8", + "com.apple.pcl.thirdparty.kotlinpoet", + "com.apple.pcl.thirdparty.kotlinpoet.jvm", + "com.apple.pcl.thirdparty.kotlinx.html", + "com.apple.pcl.thirdparty.kotlinx.html.attributes", + "com.apple.pcl.thirdparty.kotlinx.html.consumers", + "com.apple.pcl.thirdparty.kotlinx.html.dom", + "com.apple.pcl.thirdparty.kotlinx.html.impl", + "com.apple.pcl.thirdparty.kotlinx.html.org.w3c.dom.events", + "com.apple.pcl.thirdparty.kotlinx.html.stream", + "com.apple.pcl.thirdparty.kotlinx.serialization", + "com.apple.pcl.thirdparty.kotlinx.serialization.builtins", + "com.apple.pcl.thirdparty.kotlinx.serialization.descriptors", + "com.apple.pcl.thirdparty.kotlinx.serialization.encoding", + "com.apple.pcl.thirdparty.kotlinx.serialization.internal", + "com.apple.pcl.thirdparty.kotlinx.serialization.json", + "com.apple.pcl.thirdparty.kotlinx.serialization.json.internal", + "com.apple.pcl.thirdparty.kotlinx.serialization.modules", + "com.apple.pcl.thirdparty.msgpack.core", + "com.apple.pcl.thirdparty.msgpack.core.annotations", + "com.apple.pcl.thirdparty.msgpack.core.buffer", + "com.apple.pcl.thirdparty.msgpack.value", + "com.apple.pcl.thirdparty.msgpack.value.impl", + "com.apple.pcl.thirdparty.paguro", + "com.apple.pcl.thirdparty.paguro.collections", + "com.apple.pcl.thirdparty.paguro.function", + "com.apple.pcl.thirdparty.paguro.indent", + "com.apple.pcl.thirdparty.paguro.oneOf", + "com.apple.pcl.thirdparty.paguro.tuple", + "com.apple.pcl.thirdparty.paguro.type", + "com.apple.pcl.thirdparty.paguro.xform", + "com.apple.pcl.thirdparty.snakeyaml.engine.external.com.google.gdata.util.common.base", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.api", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.api.lowlevel", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.comments", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.common", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.composer", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.constructor", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.emitter", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.env", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.events", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.exceptions", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.nodes", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.parser", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.representer", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.resolver", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.scanner", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.serializer", + "com.apple.pcl.thirdparty.snakeyaml.engine.v2.tokens", + "com.oracle.truffle.api", + "com.oracle.truffle.api.debug", + "com.oracle.truffle.api.debug.impl", + "com.oracle.truffle.api.dsl", + "com.oracle.truffle.api.exception", + "com.oracle.truffle.api.frame", + "com.oracle.truffle.api.impl", + "com.oracle.truffle.api.impl.asm", + "com.oracle.truffle.api.impl.asm.commons", + "com.oracle.truffle.api.impl.asm.signature", + "com.oracle.truffle.api.impl.asm.tree", + "com.oracle.truffle.api.impl.asm.tree.analysis", + "com.oracle.truffle.api.instrumentation", + "com.oracle.truffle.api.interop", + "com.oracle.truffle.api.io", + "com.oracle.truffle.api.library", + "com.oracle.truffle.api.memory", + "com.oracle.truffle.api.nodes", + "com.oracle.truffle.api.object", + "com.oracle.truffle.api.profiles", + "com.oracle.truffle.api.source", + "com.oracle.truffle.api.staticobject", + "com.oracle.truffle.api.utilities", + "com.oracle.truffle.host", + "com.oracle.truffle.host.adapters", + "com.oracle.truffle.object", + "com.oracle.truffle.object.basic", + "com.oracle.truffle.polyglot" + ], + "sha256": "4e5f0ec89ddb7aa97991ac25d0604052ad3a1d32ac9958f88619778ba8369fd8", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-tools/0.23.2/pcl-tools-0.23.2.jar" + }, + { + "coord": "com.apple.pcl:pcl-tools:jar:sources:0.23.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/com/apple/pcl/pcl-tools/0.23.2/pcl-tools-0.23.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-tools/0.23.2/pcl-tools-0.23.2-sources.jar" + ], + "packages": [], + "sha256": "196268a16abec08c64ffbe18d160b85a023f50f5221c7b779750d39d0685ff28", + "url": "https://artifacts.apple.com/libs-release/com/apple/pcl/pcl-tools/0.23.2/pcl-tools-0.23.2-sources.jar" + }, + { + "coord": "com.squareup:javapoet:1.13.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar" + ], + "packages": [ + "com.squareup.javapoet" + ], + "sha256": "4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291", + "url": "https://artifacts.apple.com/libs-release/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar" + }, + { + "coord": "com.squareup:javapoet:jar:sources:1.13.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/com/squareup/javapoet/1.13.0/javapoet-1.13.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/squareup/javapoet/1.13.0/javapoet-1.13.0-sources.jar" + ], + "packages": [], + "sha256": "d1699067787846453fdcc104aeba3946f070fb2c167cfb3445838e4c86bb1f11", + "url": "https://artifacts.apple.com/libs-release/com/squareup/javapoet/1.13.0/javapoet-1.13.0-sources.jar" + }, + { + "coord": "com.tunnelvisionlabs:antlr4-runtime:4.9.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0.jar" + ], + "packages": [ + "org.antlr.v4.runtime", + "org.antlr.v4.runtime.atn", + "org.antlr.v4.runtime.dfa", + "org.antlr.v4.runtime.misc", + "org.antlr.v4.runtime.tree", + "org.antlr.v4.runtime.tree.pattern", + "org.antlr.v4.runtime.tree.xpath" + ], + "sha256": "e4193ba8034cedf920905bdb318b8a5097d767f999f87ba97a4298de69f3ffab", + "url": "https://artifacts.apple.com/libs-release/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0.jar" + }, + { + "coord": "com.tunnelvisionlabs:antlr4-runtime:jar:sources:4.9.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0-sources.jar" + ], + "packages": [], + "sha256": "966a7af88a5a77e31250f554917a245585ee9cb3e41f3b7ca926b25a8a77c974", + "url": "https://artifacts.apple.com/libs-release/com/tunnelvisionlabs/antlr4-runtime/4.9.0/antlr4-runtime-4.9.0-sources.jar" + }, + { + "coord": "io.leangen.geantyref:geantyref:1.3.13", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/io/leangen/geantyref/geantyref/1.3.13/geantyref-1.3.13.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/io/leangen/geantyref/geantyref/1.3.13/geantyref-1.3.13.jar" + ], + "packages": [ + "io.leangen.geantyref" + ], + "sha256": "d6df060ab0fbf6c58b0dc8145622ab774bf3bf958bd3feb6774cc8d3ce756eda", + "url": "https://artifacts.apple.com/libs-release/io/leangen/geantyref/geantyref/1.3.13/geantyref-1.3.13.jar" + }, + { + "coord": "io.leangen.geantyref:geantyref:jar:sources:1.3.13", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/io/leangen/geantyref/geantyref/1.3.13/geantyref-1.3.13-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/io/leangen/geantyref/geantyref/1.3.13/geantyref-1.3.13-sources.jar" + ], + "packages": [], + "sha256": "1902140e4eca681c6cff2bd20b81e190dd05bde2efcedfefb65a70667e3c6e35", + "url": "https://artifacts.apple.com/libs-release/io/leangen/geantyref/geantyref/1.3.13/geantyref-1.3.13-sources.jar" + }, + { + "coord": "net.sf.jopt-simple:jopt-simple:5.0.4", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar" + ], + "packages": [ + "joptsimple", + "joptsimple.internal", + "joptsimple.util" + ], + "sha256": "df26cc58f235f477db07f753ba5a3ab243ebe5789d9f89ecf68dd62ea9a66c28", + "url": "https://artifacts.apple.com/libs-release/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar" + }, + { + "coord": "net.sf.jopt-simple:jopt-simple:jar:sources:5.0.4", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4-sources.jar" + ], + "packages": [], + "sha256": "06b283801a5a94ef697b7f2c79a048c4e2f848b3daddda61cab74d882bdd97a5", + "url": "https://artifacts.apple.com/libs-release/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4-sources.jar" + }, + { + "coord": "org.apiguardian:apiguardian-api:1.1.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar" + ], + "packages": [ + "org.apiguardian.api" + ], + "sha256": "b509448ac506d607319f182537f0b35d71007582ec741832a1f111e5b5b70b38", + "url": "https://artifacts.apple.com/libs-release/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar" + }, + { + "coord": "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2-sources.jar" + ], + "packages": [], + "sha256": "277a7a4315412817beb6655b324dc7276621e95ebff00b8bf65e17a27b685e2d", + "url": "https://artifacts.apple.com/libs-release/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2-sources.jar" + }, + { + "coord": "org.commonmark:commonmark-ext-gfm-tables:0.19.0", + "dependencies": [ + "org.commonmark:commonmark:0.19.0" + ], + "directDependencies": [ + "org.commonmark:commonmark:0.19.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/commonmark/commonmark-ext-gfm-tables/0.19.0/commonmark-ext-gfm-tables-0.19.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/commonmark/commonmark-ext-gfm-tables/0.19.0/commonmark-ext-gfm-tables-0.19.0.jar" + ], + "packages": [ + "org.commonmark.ext.gfm.tables", + "org.commonmark.ext.gfm.tables.internal" + ], + "sha256": "9fccc172fd3c58278028bb1e0f9cc6473f757348ad6688c475bacd7a2dc25471", + "url": "https://artifacts.apple.com/libs-release/org/commonmark/commonmark-ext-gfm-tables/0.19.0/commonmark-ext-gfm-tables-0.19.0.jar" + }, + { + "coord": "org.commonmark:commonmark-ext-gfm-tables:jar:sources:0.19.0", + "dependencies": [ + "org.commonmark:commonmark:jar:sources:0.19.0" + ], + "directDependencies": [ + "org.commonmark:commonmark:jar:sources:0.19.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/commonmark/commonmark-ext-gfm-tables/0.19.0/commonmark-ext-gfm-tables-0.19.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/commonmark/commonmark-ext-gfm-tables/0.19.0/commonmark-ext-gfm-tables-0.19.0-sources.jar" + ], + "packages": [], + "sha256": "7acb86ae4c00b76201f4099ed8ad428e0cea9095994f6e6f81b6553901cad189", + "url": "https://artifacts.apple.com/libs-release/org/commonmark/commonmark-ext-gfm-tables/0.19.0/commonmark-ext-gfm-tables-0.19.0-sources.jar" + }, + { + "coord": "org.commonmark:commonmark:0.19.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/commonmark/commonmark/0.19.0/commonmark-0.19.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/commonmark/commonmark/0.19.0/commonmark-0.19.0.jar" + ], + "packages": [ + "org.commonmark", + "org.commonmark.internal", + "org.commonmark.internal.inline", + "org.commonmark.internal.renderer", + "org.commonmark.internal.renderer.text", + "org.commonmark.internal.util", + "org.commonmark.node", + "org.commonmark.parser", + "org.commonmark.parser.block", + "org.commonmark.parser.delimiter", + "org.commonmark.renderer", + "org.commonmark.renderer.html", + "org.commonmark.renderer.text" + ], + "sha256": "0429737bbc0d9cd356e437865fcffc2be39e8ead245f4f08f434f98247bf73f8", + "url": "https://artifacts.apple.com/libs-release/org/commonmark/commonmark/0.19.0/commonmark-0.19.0.jar" + }, + { + "coord": "org.commonmark:commonmark:jar:sources:0.19.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/commonmark/commonmark/0.19.0/commonmark-0.19.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/commonmark/commonmark/0.19.0/commonmark-0.19.0-sources.jar" + ], + "packages": [], + "sha256": "959c4bbbd909645c33f4a6f822c5a0381b83a0928d28f061d22bf0891288b99e", + "url": "https://artifacts.apple.com/libs-release/org/commonmark/commonmark/0.19.0/commonmark-0.19.0-sources.jar" + }, + { + "coord": "org.graalvm.sdk:graal-sdk:22.0.0.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/graalvm/sdk/graal-sdk/22.0.0.2/graal-sdk-22.0.0.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/graalvm/sdk/graal-sdk/22.0.0.2/graal-sdk-22.0.0.2.jar" + ], + "packages": [ + "org.graalvm.collections", + "org.graalvm.home", + "org.graalvm.home.impl", + "org.graalvm.nativeimage", + "org.graalvm.nativeimage.c", + "org.graalvm.nativeimage.c.constant", + "org.graalvm.nativeimage.c.function", + "org.graalvm.nativeimage.c.struct", + "org.graalvm.nativeimage.c.type", + "org.graalvm.nativeimage.hosted", + "org.graalvm.nativeimage.impl", + "org.graalvm.nativeimage.impl.clinit", + "org.graalvm.options", + "org.graalvm.polyglot", + "org.graalvm.polyglot.impl", + "org.graalvm.polyglot.io", + "org.graalvm.polyglot.management", + "org.graalvm.polyglot.proxy", + "org.graalvm.word", + "org.graalvm.word.impl" + ], + "sha256": "843f8ff4825824861a4a67fa0c9828f381a3954d389eca16c4235c37779f6dc7", + "url": "https://artifacts.apple.com/libs-release/org/graalvm/sdk/graal-sdk/22.0.0.2/graal-sdk-22.0.0.2.jar" + }, + { + "coord": "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/graalvm/sdk/graal-sdk/22.0.0.2/graal-sdk-22.0.0.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/graalvm/sdk/graal-sdk/22.0.0.2/graal-sdk-22.0.0.2-sources.jar" + ], + "packages": [], + "sha256": "ee3b1e5eb05f888b15e298c7b2e4112d15727091f85c1648cb9f9a61b9918382", + "url": "https://artifacts.apple.com/libs-release/org/graalvm/sdk/graal-sdk/22.0.0.2/graal-sdk-22.0.0.2-sources.jar" + }, + { + "coord": "org.graalvm.truffle:truffle-api:22.0.0.2", + "dependencies": [ + "org.graalvm.sdk:graal-sdk:22.0.0.2" + ], + "directDependencies": [ + "org.graalvm.sdk:graal-sdk:22.0.0.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/graalvm/truffle/truffle-api/22.0.0.2/truffle-api-22.0.0.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/graalvm/truffle/truffle-api/22.0.0.2/truffle-api-22.0.0.2.jar" + ], + "packages": [ + "com.oracle.truffle.api", + "com.oracle.truffle.api.debug", + "com.oracle.truffle.api.debug.impl", + "com.oracle.truffle.api.dsl", + "com.oracle.truffle.api.exception", + "com.oracle.truffle.api.frame", + "com.oracle.truffle.api.impl", + "com.oracle.truffle.api.impl.asm", + "com.oracle.truffle.api.impl.asm.commons", + "com.oracle.truffle.api.impl.asm.signature", + "com.oracle.truffle.api.impl.asm.tree", + "com.oracle.truffle.api.impl.asm.tree.analysis", + "com.oracle.truffle.api.instrumentation", + "com.oracle.truffle.api.interop", + "com.oracle.truffle.api.io", + "com.oracle.truffle.api.library", + "com.oracle.truffle.api.memory", + "com.oracle.truffle.api.nodes", + "com.oracle.truffle.api.object", + "com.oracle.truffle.api.profiles", + "com.oracle.truffle.api.source", + "com.oracle.truffle.api.staticobject", + "com.oracle.truffle.api.utilities", + "com.oracle.truffle.host", + "com.oracle.truffle.host.adapters", + "com.oracle.truffle.object", + "com.oracle.truffle.object.basic", + "com.oracle.truffle.polyglot" + ], + "sha256": "0cf8cc1f99d9881ddc37a7e5de78304f08e5cbfe1ae7e8da67eec9722a1d8f3b", + "url": "https://artifacts.apple.com/libs-release/org/graalvm/truffle/truffle-api/22.0.0.2/truffle-api-22.0.0.2.jar" + }, + { + "coord": "org.graalvm.truffle:truffle-api:jar:sources:22.0.0.2", + "dependencies": [ + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2" + ], + "directDependencies": [ + "org.graalvm.sdk:graal-sdk:jar:sources:22.0.0.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/graalvm/truffle/truffle-api/22.0.0.2/truffle-api-22.0.0.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/graalvm/truffle/truffle-api/22.0.0.2/truffle-api-22.0.0.2-sources.jar" + ], + "packages": [], + "sha256": "5c1d3bd6e337eea670e6844f1a13191c1d48fa5717859abe5a460b1442765bb6", + "url": "https://artifacts.apple.com/libs-release/org/graalvm/truffle/truffle-api/22.0.0.2/truffle-api-22.0.0.2-sources.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.10/kotlin-stdlib-common-1.7.10.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.10/kotlin-stdlib-common-1.7.10.jar" + ], + "packages": [], + "sha256": "19f102efe9629f8eabc63853ad15c533e47c47f91fca09285c5bde86e59f91d4", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.10/kotlin-stdlib-common-1.7.10.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.10/kotlin-stdlib-common-1.7.10-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.10/kotlin-stdlib-common-1.7.10-sources.jar" + ], + "packages": [], + "sha256": "a00a41d8900d12e097a9227454c593c843069def0e52c788a658f24fc3dccf2e", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-common/1.7.10/kotlin-stdlib-common-1.7.10-sources.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "org.jetbrains:annotations:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.7.10/kotlin-stdlib-jdk7-1.7.10.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.7.10/kotlin-stdlib-jdk7-1.7.10.jar" + ], + "packages": [ + "kotlin.internal.jdk7", + "kotlin.io.path", + "kotlin.jdk7" + ], + "sha256": "54f61351b1936ad88f4e53059fe781e723eae51d78ed9e7422d8b403574ec682", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.7.10/kotlin-stdlib-jdk7-1.7.10.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.7.10/kotlin-stdlib-jdk7-1.7.10-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.7.10/kotlin-stdlib-jdk7-1.7.10-sources.jar" + ], + "packages": [], + "sha256": "9f5230a4301dcfe7047dd08f9b38811f76cfed60e6a10957bec7982c288f6c0e", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.7.10/kotlin-stdlib-jdk7-1.7.10-sources.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "org.jetbrains:annotations:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.7.10/kotlin-stdlib-jdk8-1.7.10.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.7.10/kotlin-stdlib-jdk8-1.7.10.jar" + ], + "packages": [ + "kotlin.collections.jdk8", + "kotlin.internal.jdk8", + "kotlin.jvm.jdk8", + "kotlin.jvm.optionals", + "kotlin.random.jdk8", + "kotlin.streams.jdk8", + "kotlin.text.jdk8", + "kotlin.time.jdk8" + ], + "sha256": "8aafdd60c94f454c92e5066d266a5ed53ecc63c78f623b3fd9db56fea4032873", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.7.10/kotlin-stdlib-jdk8-1.7.10.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.7.10/kotlin-stdlib-jdk8-1.7.10-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.7.10/kotlin-stdlib-jdk8-1.7.10-sources.jar" + ], + "packages": [], + "sha256": "32018630c0a1d42292b8e41960c4d0bea4f15be08c1761b14b1e87c09f75d467", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.7.10/kotlin-stdlib-jdk8-1.7.10-sources.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains:annotations:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains:annotations:13.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/kotlin-stdlib-1.7.10.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/kotlin-stdlib-1.7.10.jar" + ], + "packages": [ + "kotlin", + "kotlin.annotation", + "kotlin.collections", + "kotlin.collections.builders", + "kotlin.collections.unsigned", + "kotlin.comparisons", + "kotlin.concurrent", + "kotlin.contracts", + "kotlin.coroutines", + "kotlin.coroutines.cancellation", + "kotlin.coroutines.intrinsics", + "kotlin.coroutines.jvm.internal", + "kotlin.experimental", + "kotlin.internal", + "kotlin.io", + "kotlin.js", + "kotlin.jvm", + "kotlin.jvm.functions", + "kotlin.jvm.internal", + "kotlin.jvm.internal.markers", + "kotlin.jvm.internal.unsafe", + "kotlin.math", + "kotlin.properties", + "kotlin.random", + "kotlin.ranges", + "kotlin.reflect", + "kotlin.sequences", + "kotlin.system", + "kotlin.text", + "kotlin.time" + ], + "sha256": "e771fe74250a943e8f6346713201ff1d8cb95c3a5d1a91a22b65a9e04f6a8901", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/kotlin-stdlib-1.7.10.jar" + }, + { + "coord": "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/kotlin-stdlib-1.7.10-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/kotlin-stdlib-1.7.10-sources.jar" + ], + "packages": [], + "sha256": "2176274ecf922fffdd9a7eeec18f5e3a69f7ed53dadb5add3c9a706560ac9d7f", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlin/kotlin-stdlib/1.7.10/kotlin-stdlib-1.7.10-sources.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-html-jvm:0.8.0", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:1.7.10", + "org.jetbrains:annotations:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-html-jvm/0.8.0/kotlinx-html-jvm-0.8.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-html-jvm/0.8.0/kotlinx-html-jvm-0.8.0.jar" + ], + "packages": [ + "kotlinx.html", + "kotlinx.html.attributes", + "kotlinx.html.consumers", + "kotlinx.html.dom", + "kotlinx.html.impl", + "kotlinx.html.org.w3c.dom.events", + "kotlinx.html.stream" + ], + "sha256": "712184b0733445f05d2bea8051330c73de3abd9b393be0af304b77b7cee12f14", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-html-jvm/0.8.0/kotlinx-html-jvm-0.8.0.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-html-jvm:jar:sources:0.8.0", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.7.10", + "org.jetbrains:annotations:jar:sources:13.0" + ], + "directDependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.7.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.7.10" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-html-jvm/0.8.0/kotlinx-html-jvm-0.8.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-html-jvm/0.8.0/kotlinx-html-jvm-0.8.0-sources.jar" + ], + "packages": [], + "sha256": "8342059ca8a5aeed1dfe969087b20d9a2633dc2f502501fda5d68a4a0ac8143b", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-html-jvm/0.8.0/kotlinx-html-jvm-0.8.0-sources.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "org.jetbrains.kotlin:*" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-core-jvm/1.4.0/kotlinx-serialization-core-jvm-1.4.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-core-jvm/1.4.0/kotlinx-serialization-core-jvm-1.4.0.jar" + ], + "packages": [ + "kotlinx.serialization", + "kotlinx.serialization.builtins", + "kotlinx.serialization.descriptors", + "kotlinx.serialization.encoding", + "kotlinx.serialization.internal", + "kotlinx.serialization.modules" + ], + "sha256": "9edfab129cd0a219f06a01a5baf6c03a09b5db8b5a3bec4dd95071edd61d6271", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-core-jvm/1.4.0/kotlinx-serialization-core-jvm-1.4.0.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources:1.4.0", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "org.jetbrains.kotlin:*" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-core-jvm/1.4.0/kotlinx-serialization-core-jvm-1.4.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-core-jvm/1.4.0/kotlinx-serialization-core-jvm-1.4.0-sources.jar" + ], + "packages": [], + "sha256": "ec3284f8b714c1fcb2ae4c405e54cd57052ddfe59440a37174b4b225ef21c3ba", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-core-jvm/1.4.0/kotlinx-serialization-core-jvm-1.4.0-sources.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.4.0", + "dependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.0" + ], + "directDependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.0" + ], + "exclusions": [ + "org.jetbrains.kotlin:*" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json-jvm/1.4.0/kotlinx-serialization-json-jvm-1.4.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json-jvm/1.4.0/kotlinx-serialization-json-jvm-1.4.0.jar" + ], + "packages": [ + "kotlinx.serialization.json", + "kotlinx.serialization.json.internal" + ], + "sha256": "a1c344d0e21f14fd82edbcdac374cf160d7289459dcf75dec688a9fbdce6a099", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json-jvm/1.4.0/kotlinx-serialization-json-jvm-1.4.0.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:sources:1.4.0", + "dependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources:1.4.0" + ], + "directDependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources:1.4.0" + ], + "exclusions": [ + "org.jetbrains.kotlin:*" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json-jvm/1.4.0/kotlinx-serialization-json-jvm-1.4.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json-jvm/1.4.0/kotlinx-serialization-json-jvm-1.4.0-sources.jar" + ], + "packages": [], + "sha256": "4d1672886be9fbbebf1bda2b0159435567bc612106963a5fa7fc8fecc7116617", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json-jvm/1.4.0/kotlinx-serialization-json-jvm-1.4.0-sources.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0", + "dependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.4.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.4.0" + ], + "directDependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.4.0" + ], + "exclusions": [ + "org.jetbrains.kotlin:*" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json/1.4.0/kotlinx-serialization-json-1.4.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json/1.4.0/kotlinx-serialization-json-1.4.0.jar" + ], + "packages": [], + "sha256": "bb04df31115e95fcd58398bdc57338ebbd111c5956a54ac6e37ce1785bbdf67e", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json/1.4.0/kotlinx-serialization-json-1.4.0.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-serialization-json:jar:sources:1.4.0", + "dependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources:1.4.0", + "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:sources:1.4.0" + ], + "directDependencies": [ + "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:sources:1.4.0" + ], + "exclusions": [ + "org.jetbrains.kotlin:*" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json/1.4.0/kotlinx-serialization-json-1.4.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json/1.4.0/kotlinx-serialization-json-1.4.0-sources.jar" + ], + "packages": [], + "sha256": "ca08f98e0af6dba18f6a47e4ad94bee55c81ce9bae7d7d95a0923959d8f2ede5", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/kotlinx/kotlinx-serialization-json/1.4.0/kotlinx-serialization-json-1.4.0-sources.jar" + }, + { + "coord": "org.jetbrains:annotations:13.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/annotations/13.0/annotations-13.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/annotations/13.0/annotations-13.0.jar" + ], + "packages": [ + "org.intellij.lang.annotations", + "org.jetbrains.annotations" + ], + "sha256": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/annotations/13.0/annotations-13.0.jar" + }, + { + "coord": "org.jetbrains:annotations:jar:sources:13.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" + ], + "packages": [], + "sha256": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e", + "url": "https://artifacts.apple.com/libs-release/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-api:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-api/5.9.2/junit-jupiter-api-5.9.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-api/5.9.2/junit-jupiter-api-5.9.2.jar" + ], + "packages": [ + "org.junit.jupiter.api", + "org.junit.jupiter.api.condition", + "org.junit.jupiter.api.extension", + "org.junit.jupiter.api.extension.support", + "org.junit.jupiter.api.function", + "org.junit.jupiter.api.io", + "org.junit.jupiter.api.parallel" + ], + "sha256": "f767a170f97127b0ad3582bf3358eabbbbe981d9f96411853e629d9276926fd5", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-api/5.9.2/junit-jupiter-api-5.9.2.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-api:jar:sources:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-api/5.9.2/junit-jupiter-api-5.9.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-api/5.9.2/junit-jupiter-api-5.9.2-sources.jar" + ], + "packages": [], + "sha256": "2b04279c000da27679100d5854d3045a09c2a9a4cda942777f0b0519bb9f295d", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-api/5.9.2/junit-jupiter-api-5.9.2-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-engine:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.jupiter:junit-jupiter-api:5.9.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.junit.platform:junit-platform-engine:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.jupiter:junit-jupiter-api:5.9.2", + "org.junit.platform:junit-platform-engine:1.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2.jar" + ], + "packages": [ + "org.junit.jupiter.engine", + "org.junit.jupiter.engine.config", + "org.junit.jupiter.engine.descriptor", + "org.junit.jupiter.engine.discovery", + "org.junit.jupiter.engine.discovery.predicates", + "org.junit.jupiter.engine.execution", + "org.junit.jupiter.engine.extension", + "org.junit.jupiter.engine.support" + ], + "sha256": "74cfc49388f760413ff348ca2c9ab39527484b57deecd157f2275a5f8a5fe971", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-engine:jar:sources:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.9.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.9.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2-sources.jar" + ], + "packages": [], + "sha256": "69f50584372938e22cd7ceea5913a0c9bb4a0c9047be0ed6aa4f3045684e9fd2", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-engine/5.9.2/junit-jupiter-engine-5.9.2-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-params:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.jupiter:junit-jupiter-api:5.9.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.jupiter:junit-jupiter-api:5.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2.jar" + ], + "packages": [ + "org.junit.jupiter.params", + "org.junit.jupiter.params.aggregator", + "org.junit.jupiter.params.converter", + "org.junit.jupiter.params.provider", + "org.junit.jupiter.params.shadow.com.univocity.parsers.annotations", + "org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.beans", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.input", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.concurrent", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.iterators", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.record", + "org.junit.jupiter.params.shadow.com.univocity.parsers.common.routine", + "org.junit.jupiter.params.shadow.com.univocity.parsers.conversions", + "org.junit.jupiter.params.shadow.com.univocity.parsers.csv", + "org.junit.jupiter.params.shadow.com.univocity.parsers.fixed", + "org.junit.jupiter.params.shadow.com.univocity.parsers.tsv", + "org.junit.jupiter.params.support" + ], + "sha256": "bde91900a5ce5d6663bb44bc708494b35daefcd73e1bb7afa61a4affe38ea97d", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-params:jar:sources:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.9.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2-sources.jar" + ], + "packages": [], + "sha256": "b679bb967510ad4e26b78297148b0e16a3cee9e83cab1ac794f13dc4fd7c5e3e", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter-params/5.9.2/junit-jupiter-params-5.9.2-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.jupiter:junit-jupiter-api:5.9.2", + "org.junit.jupiter:junit-jupiter-engine:5.9.2", + "org.junit.jupiter:junit-jupiter-params:5.9.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.junit.platform:junit-platform-engine:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.junit.jupiter:junit-jupiter-api:5.9.2", + "org.junit.jupiter:junit-jupiter-engine:5.9.2", + "org.junit.jupiter:junit-jupiter-params:5.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter/5.9.2/junit-jupiter-5.9.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter/5.9.2/junit-jupiter-5.9.2.jar" + ], + "packages": [], + "sha256": "99d4c0f95cdfa9b74408ffefd6a13e347e73e5d6f5e05bd2e2920e8c3645eefd", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter/5.9.2/junit-jupiter-5.9.2.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter:jar:sources:5.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.9.2", + "org.junit.jupiter:junit-jupiter-engine:jar:sources:5.9.2", + "org.junit.jupiter:junit-jupiter-params:jar:sources:5.9.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.9.2", + "org.junit.jupiter:junit-jupiter-engine:jar:sources:5.9.2", + "org.junit.jupiter:junit-jupiter-params:jar:sources:5.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter/5.9.2/junit-jupiter-5.9.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter/5.9.2/junit-jupiter-5.9.2-sources.jar" + ], + "packages": [], + "sha256": "2d0cfc6150ce624fe19b039a483ef0a0ba54620916282b0e35ea78f7626abb50", + "url": "https://artifacts.apple.com/libs-release/org/junit/jupiter/junit-jupiter/5.9.2/junit-jupiter-5.9.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-commons:1.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2.jar" + ], + "packages": [ + "org.junit.platform.commons", + "org.junit.platform.commons.annotation", + "org.junit.platform.commons.function", + "org.junit.platform.commons.logging", + "org.junit.platform.commons.support", + "org.junit.platform.commons.util" + ], + "sha256": "624a3d745ef1d28e955a6a67af8edba0fdfc5c9bad680a73f67a70bb950a683d", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2-sources.jar" + ], + "packages": [], + "sha256": "35ad4740fd4388406044d288dac4059f01c484f30e2b2a931703aae9dbca08c3", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-commons/1.9.2/junit-platform-commons-1.9.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-engine:1.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2.jar" + ], + "packages": [ + "org.junit.platform.engine", + "org.junit.platform.engine.discovery", + "org.junit.platform.engine.reporting", + "org.junit.platform.engine.support.config", + "org.junit.platform.engine.support.descriptor", + "org.junit.platform.engine.support.discovery", + "org.junit.platform.engine.support.filter", + "org.junit.platform.engine.support.hierarchical" + ], + "sha256": "25f23dc535a091e9dc80c008faf29dcb92be902e6911f77a736fbaf019908367", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-engine:jar:sources:1.9.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2-sources.jar" + ], + "packages": [], + "sha256": "31906715fb92e10b96da6cdcd1c75066bd275e961949fcd0ab61b7501c867eb9", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-engine/1.9.2/junit-platform-engine-1.9.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-launcher:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.junit.platform:junit-platform-engine:1.9.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-engine:1.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar" + ], + "packages": [ + "org.junit.platform.launcher", + "org.junit.platform.launcher.core", + "org.junit.platform.launcher.listeners", + "org.junit.platform.launcher.listeners.discovery", + "org.junit.platform.launcher.listeners.session", + "org.junit.platform.launcher.tagexpression" + ], + "sha256": "822156409fd83e682e4c5199b3460054299b538a058c2c6d0f5c9b6a5bdb7594", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-launcher:jar:sources:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.9.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.9.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2-sources.jar" + ], + "packages": [], + "sha256": "ee8440e84c23e52519b57e77a30627f80d91ac148244162ee2eea1ba809c1bdc", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-reporting:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.9.2", + "org.junit.platform:junit-platform-engine:1.9.2", + "org.junit.platform:junit-platform-launcher:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-launcher:1.8.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2.jar" + ], + "packages": [ + "org.junit.platform.reporting.legacy", + "org.junit.platform.reporting.legacy.xml" + ], + "sha256": "d28048333b378d166f9ad38c2a8e34ac0fa1a29cc016cb279df53c8b54628fc3", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-reporting:jar:sources:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.9.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.9.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.8.2" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2-sources.jar" + ], + "packages": [], + "sha256": "489df906d84675ba6d078e076a5ffd8c8feec62e390539d6d61938de98b269f4", + "url": "https://artifacts.apple.com/libs-release/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2-sources.jar" + }, + { + "coord": "org.opentest4j:opentest4j:1.2.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar" + ], + "packages": [ + "org.opentest4j" + ], + "sha256": "58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2", + "url": "https://artifacts.apple.com/libs-release/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar" + }, + { + "coord": "org.opentest4j:opentest4j:jar:sources:1.2.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar" + ], + "packages": [], + "sha256": "b63495ef700fb2af2cdee8dd68659b27822650058234a602f9ed1d14b909a1a8", + "url": "https://artifacts.apple.com/libs-release/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar" + }, + { + "coord": "org.organicdesign:Paguro:3.10.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "org.jetbrains:annotations" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/organicdesign/Paguro/3.10.3/Paguro-3.10.3.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/organicdesign/Paguro/3.10.3/Paguro-3.10.3.jar" + ], + "packages": [ + "org.organicdesign.fp", + "org.organicdesign.fp.collections", + "org.organicdesign.fp.function", + "org.organicdesign.fp.indent", + "org.organicdesign.fp.oneOf", + "org.organicdesign.fp.tuple", + "org.organicdesign.fp.type", + "org.organicdesign.fp.xform" + ], + "sha256": "fd4cbd7ce24351eca10d359476a65fc50073dbd093944936f22fcb036ecfb421", + "url": "https://artifacts.apple.com/libs-release/org/organicdesign/Paguro/3.10.3/Paguro-3.10.3.jar" + }, + { + "coord": "org.organicdesign:Paguro:jar:sources:3.10.3", + "dependencies": [], + "directDependencies": [], + "exclusions": [ + "org.jetbrains:annotations" + ], + "file": "v1/https/artifacts.apple.com/libs-release/org/organicdesign/Paguro/3.10.3/Paguro-3.10.3-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/organicdesign/Paguro/3.10.3/Paguro-3.10.3-sources.jar" + ], + "packages": [], + "sha256": "99a11cf39466e56a5c134046fc06d297d9e57f09475c9f84f32ab942a7110065", + "url": "https://artifacts.apple.com/libs-release/org/organicdesign/Paguro/3.10.3/Paguro-3.10.3-sources.jar" + }, + { + "coord": "org.snakeyaml:snakeyaml-engine:2.3", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/snakeyaml/snakeyaml-engine/2.3/snakeyaml-engine-2.3.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/snakeyaml/snakeyaml-engine/2.3/snakeyaml-engine-2.3.jar" + ], + "packages": [ + "org.snakeyaml.engine.external.com.google.gdata.util.common.base", + "org.snakeyaml.engine.v2.api", + "org.snakeyaml.engine.v2.api.lowlevel", + "org.snakeyaml.engine.v2.comments", + "org.snakeyaml.engine.v2.common", + "org.snakeyaml.engine.v2.composer", + "org.snakeyaml.engine.v2.constructor", + "org.snakeyaml.engine.v2.emitter", + "org.snakeyaml.engine.v2.env", + "org.snakeyaml.engine.v2.events", + "org.snakeyaml.engine.v2.exceptions", + "org.snakeyaml.engine.v2.nodes", + "org.snakeyaml.engine.v2.parser", + "org.snakeyaml.engine.v2.representer", + "org.snakeyaml.engine.v2.resolver", + "org.snakeyaml.engine.v2.scanner", + "org.snakeyaml.engine.v2.serializer", + "org.snakeyaml.engine.v2.tokens" + ], + "sha256": "32dbdf0f426cbaf5a08e67c2e43383b63c5ffbed8063d2a56bc1f028eebd6cb1", + "url": "https://artifacts.apple.com/libs-release/org/snakeyaml/snakeyaml-engine/2.3/snakeyaml-engine-2.3.jar" + }, + { + "coord": "org.snakeyaml:snakeyaml-engine:jar:sources:2.3", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/artifacts.apple.com/libs-release/org/snakeyaml/snakeyaml-engine/2.3/snakeyaml-engine-2.3-sources.jar", + "mirror_urls": [ + "https://artifacts.apple.com/libs-release/org/snakeyaml/snakeyaml-engine/2.3/snakeyaml-engine-2.3-sources.jar" + ], + "packages": [], + "sha256": "f32b2f4fc2263d946b78318d2a2879039443e9affbbbd4d3ecc70fc4beba54f6", + "url": "https://artifacts.apple.com/libs-release/org/snakeyaml/snakeyaml-engine/2.3/snakeyaml-engine-2.3-sources.jar" + } + ], + "version": "0.1.0" + } +} diff --git a/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java b/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java index 0f8b26c0d5a..fcc4fa47ad7 100644 --- a/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java +++ b/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java @@ -19,18 +19,61 @@ import com.google.idea.blaze.base.dependencies.TestSize; import com.google.idea.blaze.base.run.TestTargetHeuristic; import com.google.idea.blaze.java.run.producers.BlazeJUnitTestFilterFlags.JUnitVersion; +import com.intellij.codeInsight.MetaAnnotationUtil; import com.intellij.execution.junit.JUnitUtil; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClassOwner; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiMethod; import java.io.File; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Optional; import javax.annotation.Nullable; -/** Matches junit test sources to test targets with junit3/junit4 in their name. */ +/** + * Matches junit test sources to test targets with junit* in their name. + */ public class JUnitTestHeuristic implements TestTargetHeuristic { + /** + * Determine whether a class has a particular JUnit Version. + */ + public static Optional jUnitVersion(PsiClass psiClass) { + if (JUnitUtil.isJUnit5TestClass(psiClass, true) || hasJUnit5Method(psiClass)) { + return Optional.of(JUnitVersion.JUNIT_5); + } else if (JUnitUtil.isJUnit4TestClass(psiClass)) { + return Optional.of(JUnitVersion.JUNIT_4); + } else if (JUnitUtil.isJUnit3TestClass(psiClass)) { + return Optional.of(JUnitVersion.JUNIT_3); + } else { + return Optional.empty(); + } + } + + /** + * Determine whether a set of classes has a particular JUnit Version. + * If there are several JUnit versions, it will pick the first one. + */ + public static Optional jUnitVersion(Collection classes) { + for (PsiClass psiClass : classes) { + Optional version = JUnitTestHeuristic.jUnitVersion(psiClass); + if (version.isPresent()) { + return version; + } + } + return Optional.empty(); + } + + private static boolean hasJUnit5Method(PsiClass psiClass) { + PsiMethod[] methods = psiClass.getAllMethods(); + return Arrays.stream(methods) + .anyMatch((method) -> MetaAnnotationUtil.isMetaAnnotated(method, JUnitUtil.TEST5_JUPITER_ANNOTATIONS)); + } + @Override public boolean matchesSource( Project project, @@ -38,12 +81,14 @@ public boolean matchesSource( @Nullable PsiFile sourcePsiFile, File sourceFile, @Nullable TestSize testSize) { - JUnitVersion sourceVersion = junitVersion(sourcePsiFile); - if (sourceVersion == null) { + Optional sourceVersion = junitVersion(sourcePsiFile); + if (sourceVersion == null || sourceVersion.isEmpty()) { return false; } String targetName = target.label.targetName().toString().toLowerCase(); - switch (sourceVersion) { + switch (sourceVersion.get()) { + case JUNIT_5: + return targetName.contains("junit5"); case JUNIT_4: return targetName.contains("junit4"); case JUNIT_3: @@ -53,7 +98,7 @@ public boolean matchesSource( } @Nullable - private JUnitVersion junitVersion(@Nullable PsiFile psiFile) { + private Optional junitVersion(@Nullable PsiFile psiFile) { if (!(psiFile instanceof PsiClassOwner)) { return null; } @@ -61,17 +106,13 @@ private JUnitVersion junitVersion(@Nullable PsiFile psiFile) { } @Nullable - private JUnitVersion junitVersion(PsiClassOwner classOwner) { - for (PsiClass psiClass : classOwner.getClasses()) { - if (JUnitUtil.isJUnit4TestClass(psiClass)) { - return JUnitVersion.JUNIT_4; - } - } + private Optional junitVersion(PsiClassOwner classOwner) { for (PsiClass psiClass : classOwner.getClasses()) { - if (JUnitUtil.isJUnit3TestClass(psiClass)) { - return JUnitVersion.JUNIT_3; + Optional version = jUnitVersion(psiClass); + if (version.isPresent()) { + return version; } } - return null; + return Optional.empty(); } } diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java index bfadd9e2bc7..a2226cf576e 100644 --- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java +++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java @@ -19,6 +19,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; +import com.google.idea.blaze.java.run.JUnitTestHeuristic; import com.google.idea.blaze.java.run.producers.JUnitParameterizedClassHeuristic.ParameterizedTestInfo; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.execution.Location; @@ -33,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -42,7 +44,8 @@ public final class BlazeJUnitTestFilterFlags { /** A version of JUnit to generate test filter flags for. */ public enum JUnitVersion { JUNIT_3, - JUNIT_4 + JUNIT_4, + JUNIT_5 } /** @@ -61,8 +64,8 @@ public static String testFilterForClass(PsiClass psiClass) { @Nullable public static String testFilterForClassAndMethods( PsiClass psiClass, Collection methods) { - JUnitVersion version = - JUnitUtil.isJUnit4TestClass(psiClass) ? JUnitVersion.JUNIT_4 : JUnitVersion.JUNIT_3; + Optional maybeVersion = JUnitTestHeuristic.jUnitVersion(psiClass); + JUnitVersion version = maybeVersion.orElse(null); ParameterizedTestInfo parameterizedTestInfo = JUnitParameterizedClassHeuristic.getParameterizedTestInfo(psiClass); return testFilterForClassAndMethods( @@ -117,9 +120,11 @@ public static String testFilterForClassesAndMethods( } // Note: this could be incorrect if there are no JUnit4 classes in this sample, but some in the // java_test target they're run from. - JUnitVersion version = - hasJUnit4Test(methodsPerClass.keySet()) ? JUnitVersion.JUNIT_4 : JUnitVersion.JUNIT_3; - return testFilterForClassesAndMethods(methodsPerClass, version); + Optional version = JUnitTestHeuristic.jUnitVersion(methodsPerClass.keySet()); + if (version.isEmpty()) { + return null; + } + return testFilterForClassesAndMethods(methodsPerClass, version.get()); } @Nullable @@ -141,7 +146,7 @@ public static String testFilterForClassesAndMethods( classFilters.add(filter); } classFilters.sort(String::compareTo); - return version == JUnitVersion.JUNIT_4 + return version == JUnitVersion.JUNIT_4 || version == JUnitVersion.JUNIT_5 ? String.join("|", classFilters) : String.join(",", classFilters); } @@ -166,14 +171,6 @@ private static String testFilterForLocation(Location location) { return methodName; } - private static boolean hasJUnit4Test(Collection classes) { - for (PsiClass psiClass : classes) { - if (JUnitUtil.isJUnit4TestClass(psiClass)) { - return true; - } - } - return false; - } /** * Builds the JUnit test filter corresponding to the given class and methods.
@@ -208,13 +205,13 @@ static String testFilterForClassAndMethods( } String methodNamePattern = concatenateMethodNames(methodFilters, jUnitVersion); if (Strings.isNullOrEmpty(methodNamePattern)) { - if (jUnitVersion == JUnitVersion.JUNIT_4) { + if (jUnitVersion == JUnitVersion.JUNIT_4 || jUnitVersion == JUnitVersion.JUNIT_5) { output.append('#'); } return output.toString(); } output.append('#').append(methodNamePattern); - // JUnit 4 test filters are regexes, and must be terminated to avoid matching + // JUnit 4 and 5 test filters are regexes, and must be terminated to avoid matching // unintended classes/methods. JUnit 3 test filters do not need or support this syntax. if (jUnitVersion == JUnitVersion.JUNIT_3) { return output.toString(); @@ -232,9 +229,13 @@ private static String concatenateMethodNames( if (methodNames.size() == 1) { return methodNames.get(0); } - return jUnitVersion == JUnitVersion.JUNIT_4 - ? String.format("(%s)", String.join("|", methodNames)) - : String.join(",", methodNames); + switch (jUnitVersion) { + case JUNIT_3: return String.join(",", methodNames); + case JUNIT_4: + case JUNIT_5: + return String.format("(%s)", String.join("|", methodNames)); + } + return null; } private BlazeJUnitTestFilterFlags() {} diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java index 0b58946777b..b8327f374dc 100644 --- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java +++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java @@ -97,14 +97,24 @@ private static AbstractTestLocation getAbstractLocation(ConfigurationContext con private static PsiMethod getTestMethod(ConfigurationContext context, Ref sourceElement) { PsiElement psi = chooseTestElement(context, sourceElement.get()); - if (psi instanceof PsiMethod - && AnnotationUtil.isAnnotated((PsiMethod) psi, JUnitUtil.TEST_ANNOTATION, false)) { - return (PsiMethod) psi; + if (psi instanceof PsiMethod){ + PsiMethod method = (PsiMethod) psi; + if (isJUnit4AnnotatedMethod(method) || isJUnit5AnnotatedMethod(method)) { + return (PsiMethod) psi; + } } List selectedMethods = TestMethodSelectionUtil.getSelectedMethods(context); return selectedMethods != null && selectedMethods.size() == 1 ? selectedMethods.get(0) : null; } + private static boolean isJUnit4AnnotatedMethod(PsiMethod psiMethod) { + return AnnotationUtil.isAnnotated(psiMethod, JUnitUtil.TEST_ANNOTATION, false); + } + + private static boolean isJUnit5AnnotatedMethod(PsiMethod psiMethod) { + return AnnotationUtil.isAnnotated(psiMethod, JUnitUtil.TEST5_ANNOTATION, false); + } + private static boolean hasTestSubclasses(@Nullable PsiClass psiClass) { return psiClass != null && !SubclassTestChooser.findTestSubclasses(psiClass).isEmpty(); } diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/CombinedTestHeuristicTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/CombinedTestHeuristicTest.java index 6868ad9069e..6a777bbc863 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/CombinedTestHeuristicTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/CombinedTestHeuristicTest.java @@ -30,6 +30,7 @@ import com.google.idea.blaze.base.model.primitives.WorkspacePath; import com.google.idea.blaze.base.run.TestTargetHeuristic; import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; +import com.google.idea.blaze.java.utils.JUnitTestUtils; import com.intellij.psi.PsiFile; import java.io.File; import java.util.Collection; @@ -48,21 +49,7 @@ public final void doSetup() { registerProjectService( BlazeProjectDataManager.class, new MockBlazeProjectDataManager(blazeProjectData)); - // required for IntelliJ to recognize annotations, JUnit version, etc. - workspace.createPsiFile( - new WorkspacePath("org/junit/runner/RunWith.java"), - "package org.junit.runner;" - + "public @interface RunWith {" - + " Class value();" - + "}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/Test.java"), - "package org.junit;", - "public @interface Test {}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/runners/JUnit4.java"), - "package org.junit.runners;", - "public class JUnit4 {}"); + JUnitTestUtils.setupForJUnitTests(workspace, fileSystem); } @Test diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/JUnitTestHeuristicTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/JUnitTestHeuristicTest.java index 2815b90d5d4..7e907af3f39 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/JUnitTestHeuristicTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/JUnitTestHeuristicTest.java @@ -21,6 +21,7 @@ import com.google.idea.blaze.base.dependencies.TargetInfo; import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; import com.google.idea.blaze.base.model.primitives.WorkspacePath; +import com.google.idea.blaze.java.utils.JUnitTestUtils; import com.intellij.psi.PsiFile; import java.io.File; import org.junit.Before; @@ -33,22 +34,32 @@ public class JUnitTestHeuristicTest extends BlazeIntegrationTestCase { @Before - public final void doSetup() { - // required for IntelliJ to recognize annotations, JUnit version, etc. - workspace.createPsiFile( - new WorkspacePath("org/junit/runner/RunWith.java"), - "package org.junit.runner;" - + "public @interface RunWith {" - + " Class value();" - + "}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/Test.java"), - "package org.junit;", - "public @interface Test {}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/runners/JUnit4.java"), - "package org.junit.runners;", - "public class JUnit4 {}"); + public final void doSetup() throws Throwable { + JUnitTestUtils.setupForJUnitTests(workspace, fileSystem); + } + + @Test + public void testMatchesJunit5Annotation() { + PsiFile psiFile = + workspace.createPsiFile( + new WorkspacePath("java/com/google/lib/JavaClass.java"), + "package com.google.lib;", + "import org.junit.jupiter.api.Test;", + "public class JavaClass {", + " @Test", + " public void testMethod1() {}", + " @Test", + " public void testMethod2() {}", + "}"); + File file = new File(psiFile.getVirtualFile().getPath()); + TargetInfo target = + TargetIdeInfo.builder() + .setLabel("//foo:AllJUnit5Tests") + .setKind("java_test") + .build() + .toTargetInfo(); + assertThat(new JUnitTestHeuristic().matchesSource(getProject(), target, psiFile, file, null)) + .isTrue(); } @Test diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsIntegrationTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsIntegrationTest.java index af4993dd438..a1b3a287a46 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsIntegrationTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsIntegrationTest.java @@ -22,6 +22,8 @@ import com.google.common.collect.ImmutableMap; import com.google.idea.blaze.base.BlazeIntegrationTestCase; import com.google.idea.blaze.base.model.primitives.WorkspacePath; +import com.google.idea.blaze.java.run.producers.BlazeJUnitTestFilterFlags.JUnitVersion; +import com.google.idea.blaze.java.utils.JUnitTestUtils; import com.intellij.execution.Location; import com.intellij.execution.PsiLocation; import com.intellij.execution.junit2.PsiMemberParameterizedLocation; @@ -32,50 +34,41 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.junit.runner.Runner; import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; +import org.junit.runners.Parameterized.UseParametersRunnerFactory; +import org.junit.runners.model.InitializationError; +import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters; +import org.junit.runners.parameterized.ParametersRunnerFactory; +import org.junit.runners.parameterized.TestWithParameters; /** * Integration tests for {@link BlazeJUnitTestFilterFlags}. The functionality that relies on * PsiElements, so can't go in the unit tests. + * We use JUnit4 parameters to test both JUnit4 and JUnit5 functionality in the same suite. */ -@RunWith(JUnit4.class) +@RunWith(Parameterized.class) public class BlazeJUnitTestFilterFlagsIntegrationTest extends BlazeIntegrationTestCase { + @Parameter + public JUnitVersion jUnitVersionUnderTest; + + @Parameters(name = "{0}") + public static JUnitVersion[] params() { + return JUnitTestUtils.JUNIT_VERSIONS_UNDER_TEST; + } + @Before - public final void doSetup() { - // required for IntelliJ to recognize annotations, JUnit version, etc. - workspace.createPsiFile( - new WorkspacePath("org/junit/runner/RunWith.java"), - "package org.junit.runner;" - + "public @interface RunWith {" - + " Class value();" - + "}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/Test.java"), - "package org.junit;", - "public @interface Test {}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/runners/JUnit4.java"), - "package org.junit.runners;", - "public class JUnit4 {}"); + public final void setup() { + JUnitTestUtils.setupForJUnitTests(workspace, fileSystem); } @Test public void testParameterizedMethods() { - PsiFile javaFile = - workspace.createPsiFile( - new WorkspacePath("java/com/google/lib/JavaClass.java"), - "package com.google.lib;", - "import org.junit.Test;", - "import org.junit.runner.RunWith;", - "import org.junit.runners.JUnit4;", - "@RunWith(JUnit4.class)", - "public class JavaClass {", - " @Test", - " public void testMethod1() {}", - " @Test", - " public void testMethod2() {}", - "}"); + PsiFile javaFile = JUnitTestUtils.createGenericJUnitFile(workspace, jUnitVersionUnderTest); PsiClass javaClass = ((PsiClassOwner) javaFile).getClasses()[0]; PsiMethod method1 = javaClass.findMethodsByName("testMethod1", false)[0]; @@ -89,37 +82,37 @@ public void testParameterizedMethods() { assertThat( BlazeJUnitTestFilterFlags.testFilterForClassesAndMethods( ImmutableMap.of(javaClass, ImmutableList.of(location1, location2)))) - .isEqualTo("com.google.lib.JavaClass#(testMethod1\\[param\\]|testMethod2\\[3\\])$"); + .isEqualTo("com.google.test.TestClass#(testMethod1\\[param\\]|testMethod2\\[3\\])$"); } @Test public void testMultipleClassesWithParameterizedMethods() { - PsiFile javaFile1 = - workspace.createPsiFile( - new WorkspacePath("java/com/google/lib/JavaClass1.java"), - "package com.google.lib;", - "import org.junit.Test;", - "import org.junit.runner.RunWith;", - "import org.junit.runners.JUnit4;", - "@RunWith(JUnit4.class)", - "public class JavaClass1 {", - " @Test", - " public void testMethod1() {}", - " @Test", - " public void testMethod2() {}", - "}"); - PsiFile javaFile2 = - workspace.createPsiFile( - new WorkspacePath("java/com/google/lib/JavaClass2.java"), - "package com.google.lib;", - "import org.junit.Test;", - "import org.junit.runner.RunWith;", - "import org.junit.runners.JUnit4;", - "@RunWith(JUnit4.class)", - "public class JavaClass2 {", - " @Test", - " public void testMethod() {}", - "}"); + PsiFile javaFile1 = JUnitTestUtils.createGenericJUnitFile(workspace, jUnitVersionUnderTest); + PsiFile javaFile2 = null; + if (jUnitVersionUnderTest == JUnitVersion.JUNIT_5) { + javaFile2 = workspace.createPsiFile( + new WorkspacePath("java/com/google/lib/JavaClass2.java"), + "package com.google.test;", + "import org.junit.jupiter.api.Test;", + "public class OtherTestClass {", + " @Test", + " public void testMethod() {}", + "}"); + } else if (jUnitVersionUnderTest == JUnitVersion.JUNIT_4) { + javaFile2 = workspace.createPsiFile( + new WorkspacePath("java/com/google/lib/JavaClass2.java"), + "package com.google.test;", + "import org.junit.Test;", + "import org.junit.runner.RunWith;", + "import org.junit.runners.JUnit4;", + "@RunWith(JUnit4.class)", + "public class OtherTestClass {", + " @Test", + " public void testMethod() {}", + "}"); + } else { + throw new RuntimeException("Unsupported JUnit Version under test: " + jUnitVersionUnderTest.toString()); + } PsiClass javaClass1 = ((PsiClassOwner) javaFile1).getClasses()[0]; PsiMethod class1Method1 = javaClass1.findMethodsByName("testMethod1", false)[0]; @@ -143,7 +136,8 @@ public void testMultipleClassesWithParameterizedMethods() { .isEqualTo( Joiner.on('|') .join( - "com.google.lib.JavaClass1#(testMethod1\\[param\\]|testMethod2\\[3\\])$", - "com.google.lib.JavaClass2#testMethod$")); + "com.google.test.OtherTestClass#testMethod$", + "com.google.test.TestClass#(testMethod1\\[param\\]|testMethod2\\[3\\])$" + )); } } diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducerTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducerTest.java index 0ab996f4f34..1259c54a1ed 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducerTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducerTest.java @@ -26,8 +26,9 @@ import com.google.idea.blaze.base.model.primitives.TargetExpression; import com.google.idea.blaze.base.model.primitives.WorkspacePath; import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration; -import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducerTestCase; import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; +import com.google.idea.blaze.java.run.producers.BlazeJUnitTestFilterFlags.JUnitVersion; +import com.google.idea.blaze.java.utils.BlazeJUnitRunConfigurationProducerTestCase; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.execution.configurations.RunConfiguration; @@ -38,48 +39,20 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMethod; import java.util.List; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; -/** Integration tests for {@link BlazeJavaAbstractTestCaseConfigurationProducer}. */ -@RunWith(JUnit4.class) +/** Integration tests for {@link BlazeJavaAbstractTestCaseConfigurationProducer}. + * Parameters are provided by the base class. + */ +@RunWith(Parameterized.class) public class BlazeJavaAbstractTestCaseConfigurationProducerTest - extends BlazeRunConfigurationProducerTestCase { - - @Before - public final void setup() { - // required for IntelliJ to recognize annotations, JUnit version, etc. - workspace.createPsiFile( - new WorkspacePath("org/junit/runner/RunWith.java"), - "package org.junit.runner;" - + "public @interface RunWith {" - + " Class value();" - + "}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/Test.java"), - "package org.junit;", - "public @interface Test {}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/runners/JUnit4.java"), - "package org.junit.runners;", - "public class JUnit4 {}"); - } + extends BlazeJUnitRunConfigurationProducerTestCase { @Test public void testIgnoreTestClassWithNoTestSubclasses() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod1() {}", - " @org.junit.Test", - " public void testMethod2() {}", - "}"); + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); PsiClass javaClass = ((PsiClassOwner) javaFile).getClasses()[0]; assertThat(javaClass).isNotNull(); @@ -93,17 +66,7 @@ public void testIgnoreTestClassWithNoTestSubclasses() throws Throwable { @Test public void testIgnoreAbstractTestClassWithNoTestSubclasses() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public abstract class TestClass {", - " @org.junit.Test", - " public void testMethod1() {}", - " @org.junit.Test", - " public void testMethod2() {}", - "}"); + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); PsiClass javaClass = ((PsiClassOwner) javaFile).getClasses()[0]; assertThat(javaClass).isNotNull(); @@ -167,17 +130,33 @@ public void testConfigurationCreatedFromAbstractClass() throws Throwable { "package com.google.test;", "public abstract class AbstractTestCase {}"); - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "import com.google.test.AbstractTestCase;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass extends AbstractTestCase {", - " @org.junit.Test", - " public void testMethod1() {}", - " @org.junit.Test", - " public void testMethod2() {}", - "}"); + if (jUnitVersionUnderTest == JUnitVersion.JUNIT_5) { + createAndIndexFile( + new WorkspacePath("java/com/google/test/TestClass.java"), + "package com.google.test;", + "import com.google.test.AbstractTestCase;", + "@org.junit.platform.commons.annotation.Testable", + "public class TestClass extends AbstractTestCase {", + " @org.junit.jupiter.api.Test", + " public void testMethod1() {}", + " @org.junit.jupiter.api.Test", + " public void testMethod2() {}", + "}"); + } else if (jUnitVersionUnderTest == JUnitVersion.JUNIT_4) { + createAndIndexFile( + new WorkspacePath("java/com/google/test/TestClass.java"), + "package com.google.test;", + "import com.google.test.AbstractTestCase;", + "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", + "public class TestClass extends AbstractTestCase {", + " @org.junit.Test", + " public void testMethod1() {}", + " @org.junit.Test", + " public void testMethod2() {}", + "}"); + } else { + throw new RuntimeException("JUnit Version (" + jUnitVersionUnderTest.toString() + ") should never be tested!"); + } PsiClass javaClass = ((PsiClassOwner) abstractClassFile).getClasses()[0]; assertThat(javaClass).isNotNull(); @@ -221,23 +200,42 @@ public void testConfigurationCreatedFromAbstractClass() throws Throwable { @Test public void testConfigurationCreatedFromMethodInAbstractClass() throws Throwable { - PsiFile abstractClassFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/AbstractTestCase.java"), - "package com.google.test;", - "public abstract class AbstractTestCase {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); - - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "import com.google.test.AbstractTestCase;", - "import org.junit.runner.RunWith;", - "import org.junit.runners.JUnit4;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass extends AbstractTestCase {}"); + PsiFile abstractClassFile = null; + if (jUnitVersionUnderTest == JUnitVersion.JUNIT_5) { + abstractClassFile = createAndIndexFile( + new WorkspacePath("java/com/google/test/AbstractTestCase.java"), + "package com.google.test;", + "public abstract class AbstractTestCase {", + " @org.junit.jupiter.api.Test", + " public void testMethod() {}", + "}"); + createAndIndexFile( + new WorkspacePath("java/com/google/test/TestClass.java"), + "package com.google.test;", + "import com.google.test.AbstractTestCase;", + "@org.junit.platform.commons.annotation.Testable", + "public class TestClass extends AbstractTestCase {}"); + } else if (jUnitVersionUnderTest == JUnitVersion.JUNIT_4) { + abstractClassFile = createAndIndexFile( + new WorkspacePath("java/com/google/test/AbstractTestCase.java"), + "package com.google.test;", + "public abstract class AbstractTestCase {", + " @org.junit.Test", + " public void testMethod() {}", + "}"); + createAndIndexFile( + new WorkspacePath("java/com/google/test/TestClass.java"), + "package com.google.test;", + "import com.google.test.AbstractTestCase;", + "import org.junit.runner.RunWith;", + "import org.junit.runners.JUnit4;", + "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", + "public class TestClass extends AbstractTestCase {}"); + } else { + throw new RuntimeException("JUnit Version (" + jUnitVersionUnderTest.toString() + ") should never be tested!"); + } + + setUpRepositoryAndTarget(); PsiClass javaClass = ((PsiClassOwner) abstractClassFile).getClasses()[0]; PsiMethod method = PsiUtils.findFirstChildOfClassRecursive(javaClass, PsiMethod.class); @@ -258,19 +256,6 @@ public void testConfigurationCreatedFromMethodInAbstractClass() throws Throwable assertThat(blazeConfig.getTargets()).isEmpty(); assertThat(blazeConfig.getName()).isEqualTo("Choose subclass for AbstractTestCase.testMethod"); - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); - BlazeJavaAbstractTestCaseConfigurationProducer.chooseSubclass( fromContext, context, EmptyRunnable.INSTANCE); diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java index 374dcd21eba..76e373bc842 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java @@ -27,10 +27,10 @@ import com.google.idea.blaze.base.model.primitives.TargetExpression; import com.google.idea.blaze.base.model.primitives.WorkspacePath; import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration; -import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducerTestCase; import com.google.idea.blaze.base.run.producers.TestContextRunConfigurationProducer; import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState; import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; +import com.google.idea.blaze.java.utils.BlazeJUnitRunConfigurationProducerTestCase; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.psi.PsiClass; @@ -38,61 +38,22 @@ import com.intellij.psi.PsiFile; import java.util.ArrayList; import java.util.List; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; -/** Integration tests for producing run configurations from java test classes. */ -@RunWith(JUnit4.class) +/** + * Integration tests for producing run configurations from java test classes. + * Parameters are provided by the base class. + */ +@RunWith(Parameterized.class) public class BlazeJavaTestClassConfigurationProducerTest - extends BlazeRunConfigurationProducerTestCase { - - @Before - public final void setup() { - // required for IntelliJ to recognize annotations, JUnit version, etc. - workspace.createPsiFile( - new WorkspacePath("org/junit/runner/RunWith.java"), - "package org.junit.runner;" - + "public @interface RunWith {" - + " Class value();" - + "}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/Test.java"), - "package org.junit;", - "public @interface Test {}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/runners/JUnit4.java"), - "package org.junit.runners;", - "public class JUnit4 {}"); - } + extends BlazeJUnitRunConfigurationProducerTestCase { @Test public void testProducedFromPsiFile() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod1() {}", - " @org.junit.Test", - " public void testMethod2() {}", - "}"); - - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); + setUpRepositoryAndTarget(); ConfigurationContext context = createContextFromPsi(javaFile); List configurations = context.getConfigurationsFromContext(); @@ -113,30 +74,8 @@ public void testProducedFromPsiFile() throws Throwable { @Test public void testProducedFromPsiClass() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod1() {}", - " @org.junit.Test", - " public void testMethod2() {}", - "}"); - - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); + setUpRepositoryAndTarget(); PsiClass javaClass = ((PsiClassOwner) javaFile).getClasses()[0]; assertThat(javaClass).isNotNull(); @@ -213,28 +152,8 @@ public void testProducedFromPsiClassWithInnerTestClass() throws Throwable { @Test public void testConfigFromContextRecognizesItsOwnConfig() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); - - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); + setUpRepositoryAndTarget(); ConfigurationContext context = createContextFromPsi(javaFile); BlazeCommandRunConfiguration config = @@ -247,28 +166,8 @@ public void testConfigFromContextRecognizesItsOwnConfig() throws Throwable { @Test public void testConfigWithDifferentLabelIgnored() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); - - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); + setUpRepositoryAndTarget(); ConfigurationContext context = createContextFromPsi(javaFile); BlazeCommandRunConfiguration config = @@ -284,28 +183,8 @@ public void testConfigWithDifferentLabelIgnored() throws Throwable { @Test public void testConfigWithDifferentFilterIgnored() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); - - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); + setUpRepositoryAndTarget(); ConfigurationContext context = createContextFromPsi(javaFile); BlazeCommandRunConfiguration config = diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java index 4eae99c5ed2..c4af7772334 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java @@ -19,80 +19,34 @@ import com.google.idea.blaze.base.command.BlazeCommandName; import com.google.idea.blaze.base.command.BlazeFlags; -import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; -import com.google.idea.blaze.base.ideinfo.TargetMapBuilder; import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils; -import com.google.idea.blaze.base.model.MockBlazeProjectDataBuilder; -import com.google.idea.blaze.base.model.MockBlazeProjectDataManager; import com.google.idea.blaze.base.model.primitives.Label; import com.google.idea.blaze.base.model.primitives.TargetExpression; -import com.google.idea.blaze.base.model.primitives.WorkspacePath; import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration; -import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducerTestCase; import com.google.idea.blaze.base.run.producers.TestContextRunConfigurationProducer; import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState; -import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; +import com.google.idea.blaze.java.utils.BlazeJUnitRunConfigurationProducerTestCase; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMethod; import java.util.ArrayList; import java.util.List; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; -/** Integration tests for configuring run configurations from java test methods. */ -@RunWith(JUnit4.class) +/** Integration tests for configuring run configurations from java test methods. + * Parameters are provided by the base class. + */ +@RunWith(Parameterized.class) public class BlazeJavaTestMethodConfigurationProducerTest - extends BlazeRunConfigurationProducerTestCase { - - @Before - public final void setup() { - // required for IntelliJ to recognize annotations, JUnit version, etc. - workspace.createPsiFile( - new WorkspacePath("org/junit/runner/RunWith.java"), - "package org.junit.runner;" - + "public @interface RunWith {" - + " Class value();" - + "}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/Test.java"), - "package org.junit;", - "public @interface Test {}"); - workspace.createPsiFile( - new WorkspacePath("org/junit/runners/JUnit4.java"), - "package org.junit.runners;", - "public class JUnit4 {}"); - } + extends BlazeJUnitRunConfigurationProducerTestCase { @Test public void testProducedFromPsiMethod() throws Throwable { // Arrange - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod1() {}", - "}"); - - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); - PsiMethod method = PsiUtils.findFirstChildOfClassRecursive(javaFile, PsiMethod.class); + PsiMethod method = setupGenericJunitTestClassAndBlazeTarget(); // Act ConfigurationContext context = createContextFromPsi(method); @@ -179,29 +133,9 @@ public void testConfigWithDifferentFilterIgnored() throws Throwable { * to the test. */ private PsiMethod setupGenericJunitTestClassAndBlazeTarget() throws Throwable { - PsiFile javaFile = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod1() {}", - "}"); - - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); - + PsiFile javaFile = createAndIndexGenericJUnitTestFile(); + setUpRepositoryAndTarget(); return PsiUtils.findFirstChildOfClassRecursive(javaFile, PsiMethod.class); } + } diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java index f2bcf98e06d..231d2cc42ae 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java @@ -25,10 +25,11 @@ import com.google.idea.blaze.base.model.primitives.TargetExpression; import com.google.idea.blaze.base.model.primitives.WorkspacePath; import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration; -import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducerTestCase; import com.google.idea.blaze.base.run.producers.TestContextRunConfigurationProducer; import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; import com.google.idea.blaze.base.sync.projectview.WorkspaceFileFinder; +import com.google.idea.blaze.java.run.producers.BlazeJUnitTestFilterFlags.JUnitVersion; +import com.google.idea.blaze.java.utils.BlazeJUnitRunConfigurationProducerTestCase; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.openapi.application.ApplicationManager; @@ -40,17 +41,22 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiJavaFile; +import java.util.Arrays; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; -/** Integration tests for {@link MultipleJavaClassesTestContextProvider}. */ -@RunWith(JUnit4.class) +/** Integration tests for {@link MultipleJavaClassesTestContextProvider}. + * Parameters are provided by the base class. + */ +@RunWith(Parameterized.class) public class MultipleJavaClassesTestContextProviderTest - extends BlazeRunConfigurationProducerTestCase { + extends BlazeJUnitRunConfigurationProducerTestCase { + + private WorkspacePath pkgRootPath = new WorkspacePath("java"); @Before public final void addSourceFolder() { @@ -61,7 +67,7 @@ public final void addSourceFolder() { ModuleRootManager.getInstance(testFixture.getModule()).getModifiableModel(); ContentEntry contentEntry = model.getContentEntries()[0]; // create a source root so that the package prefixes are correct. - VirtualFile pkgRoot = workspace.createDirectory(new WorkspacePath("java")); + VirtualFile pkgRoot = workspace.createDirectory(pkgRootPath); contentEntry.addSourceFolder(pkgRoot, true, ""); model.commit(); }); @@ -71,63 +77,32 @@ public final void addSourceFolder() { registerProjectService(BlazeProjectDataManager.class, mockProjectDataManager); registerProjectService( WorkspaceFileFinder.Provider.class, () -> file -> file.getPath().contains("test")); - - // required for IntelliJ to recognize annotations, JUnit version, etc. - // Adding into java source root so resolve scopes of all files in tests is the same. - workspace.createPsiFile( - new WorkspacePath("java/org/junit/runner/RunWith.java"), - "package org.junit.runner;" - + "public @interface RunWith {" - + " Class value();" - + "}"); - workspace.createPsiFile( - new WorkspacePath("java/org/junit/Test.java"), - "package org.junit;", - "public @interface Test {}"); - workspace.createPsiFile( - new WorkspacePath("java/org/junit/runners/JUnit4.java"), - "package org.junit.runners;", - "public class JUnit4 {}"); } @After public final void removeSourceFolder() { + VirtualFile pkgRoot = workspace.createDirectory(pkgRootPath); ApplicationManager.getApplication() .runWriteAction( () -> { final ModifiableRootModel model = ModuleRootManager.getInstance(testFixture.getModule()).getModifiableModel(); ContentEntry contentEntry = model.getContentEntries()[0]; - contentEntry.clearSourceFolders(); + Arrays.stream(contentEntry.getSourceFolders()).forEach((folder) -> { + if (folder.getFile().equals(pkgRoot)) { + contentEntry.removeSourceFolder(folder); + } + }); model.commit(); }); } @Test public void testProducedFromDirectory() throws Throwable { - MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); - builder.setTargetMap( - TargetMapBuilder.builder() - .addTarget( - TargetIdeInfo.builder() - .setKind("java_test") - .setLabel("//java/com/google/test:TestClass") - .addSource(sourceRoot("java/com/google/test/TestClass.java")) - .build()) - .build()); - registerProjectService( - BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); - + setUpRepositoryAndTarget(); PsiDirectory directory = workspace.createPsiDirectory(new WorkspacePath("java/com/google/test")); - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); + createAndIndexGenericJUnitTestFile(); ConfigurationContext context = createContextFromPsi(directory); List configurations = context.getConfigurationsFromContext(); @@ -163,14 +138,31 @@ public void testProducedFromDirectoryWithNestedTests() throws Throwable { PsiDirectory directory = workspace.createPsiDirectory(new WorkspacePath("java/com/google/test")); - createAndIndexFile( - new WorkspacePath("java/com/google/test/sub/TestClass.java"), - "package com.google.test.sub;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); + if (jUnitVersionUnderTest == JUnitVersion.JUNIT_5) { + createAndIndexFile( + new WorkspacePath("java/com/google/test/sub/TestClass.java"), + "package com.google.test.sub;", + // We need to use the `Testable` annotation so that the tests can see the class. + // This is only necessary for testing because we don't have JUnit's class discovery mechanism. + // Ref: https://junit.org/junit5/docs/5.0.0/api/org/junit/platform/commons/annotation/Testable.html" + "@org.junit.platform.commons.annotation.Testable", + "public class TestClass {", + " @org.junit.jupiter.api.Test", + " public void testMethod() {}", + "}"); + } else if (jUnitVersionUnderTest == JUnitVersion.JUNIT_4) { + createAndIndexFile( + new WorkspacePath("java/com/google/test/sub/TestClass.java"), + "package com.google.test.sub;", + "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", + "public class TestClass {", + " @org.junit.Test", + " public void testMethod() {}", + "}"); + + } else { + throw new RuntimeException("Unsupported JUnit Version under test: " + jUnitVersionUnderTest.toString()); + } ConfigurationContext context = createContextFromPsi(directory); List configurations = context.getConfigurationsFromContext(); @@ -205,14 +197,7 @@ public void testNotProducedForDirectoryNotUnderTestRoots() throws Throwable { BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); PsiDirectory directory = workspace.createPsiDirectory(new WorkspacePath("java")); - createAndIndexFile( - new WorkspacePath("java/com/google/other/TestClass.java"), - "package com.google.other;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); + createAndIndexGenericJUnitTestFile(); ConfigurationContext context = createContextFromPsi(directory); ConfigurationFromContext fromContext = @@ -275,24 +260,8 @@ public void testProducedFromTestFiles() throws Throwable { BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); workspace.createPsiDirectory(new WorkspacePath("java/com/google/test")); - PsiFile testClass1 = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass1.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass1 {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); - PsiFile testClass2 = - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass2.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass2 {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); + PsiFile testClass1 = createAndIndexGenericJUnitTestFile("TestClass1"); + PsiFile testClass2 = createAndIndexGenericJUnitTestFile("TestClass2"); // WHEN generating a BlazeCommandRunConfiguration ConfigurationContext context = @@ -338,24 +307,10 @@ public void testNotProducedFromTestFilesInDifferentTestTargets() throws Throwabl workspace.createPsiDirectory(new WorkspacePath("java/com/google/test")); PsiJavaFile testClass1 = (PsiJavaFile) - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass1.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass1 {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); + createAndIndexGenericJUnitTestFile("TestClass1"); PsiJavaFile testClass2 = (PsiJavaFile) - createAndIndexFile( - new WorkspacePath("java/com/google/test/TestClass2.java"), - "package com.google.test;", - "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", - "public class TestClass2 {", - " @org.junit.Test", - " public void testMethod() {}", - "}"); + createAndIndexGenericJUnitTestFile("TestClass2"); ConfigurationContext context = createContextFromMultipleElements( diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/utils/BlazeJUnitRunConfigurationProducerTestCase.java b/java/tests/integrationtests/com/google/idea/blaze/java/utils/BlazeJUnitRunConfigurationProducerTestCase.java new file mode 100644 index 00000000000..b7029e89bce --- /dev/null +++ b/java/tests/integrationtests/com/google/idea/blaze/java/utils/BlazeJUnitRunConfigurationProducerTestCase.java @@ -0,0 +1,59 @@ +package com.google.idea.blaze.java.utils; + +import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; +import com.google.idea.blaze.base.ideinfo.TargetMapBuilder; +import com.google.idea.blaze.base.model.MockBlazeProjectDataBuilder; +import com.google.idea.blaze.base.model.MockBlazeProjectDataManager; +import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducerTestCase; +import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; +import com.google.idea.blaze.java.run.producers.BlazeJUnitTestFilterFlags.JUnitVersion; +import com.intellij.psi.PsiFile; +import org.junit.Before; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +/** + * Base class that parameterizes test to test both JUnit 4 and JUnit 5. + */ +public abstract class BlazeJUnitRunConfigurationProducerTestCase extends + BlazeRunConfigurationProducerTestCase { + + @Parameter + public JUnitVersion jUnitVersionUnderTest; + + @Parameters(name = "{0}") + public static JUnitVersion[] params() { + return JUnitTestUtils.JUNIT_VERSIONS_UNDER_TEST; + } + + @Before + public final void setup() { + JUnitTestUtils.setupForJUnitTests(workspace, fileSystem); + } + + protected void setUpRepositoryAndTarget() { + MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot); + builder.setTargetMap( + TargetMapBuilder.builder() + .addTarget( + TargetIdeInfo.builder() + .setKind("java_test") + .setLabel("//java/com/google/test:TestClass") + .addSource(sourceRoot("java/com/google/test/TestClass.java")) + .build()) + .build()); + registerProjectService( + BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build())); + } + + protected PsiFile createAndIndexGenericJUnitTestFile() throws Throwable { + return createAndIndexGenericJUnitTestFile("TestClass"); + } + + protected PsiFile createAndIndexGenericJUnitTestFile(String testClass) throws Throwable { + PsiFile javaFile = JUnitTestUtils.createGenericJUnitFile(workspace, jUnitVersionUnderTest, testClass); + editorTest.openFileInEditor(javaFile); + return javaFile; + } + +} diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/utils/JUnitTestUtils.java b/java/tests/integrationtests/com/google/idea/blaze/java/utils/JUnitTestUtils.java new file mode 100644 index 00000000000..5586e9c3e75 --- /dev/null +++ b/java/tests/integrationtests/com/google/idea/blaze/java/utils/JUnitTestUtils.java @@ -0,0 +1,95 @@ +package com.google.idea.blaze.java.utils; + +import com.google.idea.blaze.base.TestFileSystem; +import com.google.idea.blaze.base.WorkspaceFileSystem; +import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; +import com.google.idea.blaze.base.ideinfo.TargetMapBuilder; +import com.google.idea.blaze.base.model.MockBlazeProjectDataBuilder; +import com.google.idea.blaze.base.model.MockBlazeProjectDataManager; +import com.google.idea.blaze.base.model.primitives.WorkspacePath; +import com.google.idea.blaze.base.model.primitives.WorkspaceRoot; +import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; +import com.google.idea.blaze.java.run.producers.BlazeJUnitTestFilterFlags.JUnitVersion; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.impl.DirectoryIndex; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.Arrays; +import java.util.stream.Stream; + +public final class JUnitTestUtils { + public static JUnitVersion[] JUNIT_VERSIONS_UNDER_TEST = new JUnitVersion[]{ + JUnitVersion.JUNIT_4, JUnitVersion.JUNIT_5 + }; + + public static void setupForJUnitTests(WorkspaceFileSystem workspace, TestFileSystem fileSystem) { + // required for IntelliJ to recognize annotations, JUnit version, etc. + // JUnit3 + workspace.createPsiFile( + new WorkspacePath("org/junit/runner/RunWith.java"), + "package org.junit.runner;" + + "public @interface RunWith {" + + " Class value();" + + "}"); + // JUnit4 + workspace.createPsiFile( + new WorkspacePath("org/junit/Test.java"), + "package org.junit;", + "public @interface Test {}"); + workspace.createPsiFile( + new WorkspacePath("org/junit/runners/JUnit4.java"), + "package org.junit.runners;", + "public class JUnit4 {}"); + // JUnit5 + // We use `fileSystem` instead of `workspace` because the JUnit5 detector from IntelliJ + // relies on file structure to detect packages. + // If we used the workspace, the packages would include the workspace root, and would be named + // workspace.org.junit.jupiter...., and the test harness wouldn't be able to find them. + fileSystem.createFile( + "org/junit/jupiter/api/Test.java", + "package org.junit.jupiter.api;", + "public @interface Test {}"); + } + + public static PsiFile createGenericJUnitFile(WorkspaceFileSystem workspace, JUnitVersion jUnitVersion) { + return createGenericJUnitFile(workspace, jUnitVersion, "TestClass"); + } + + public static PsiFile createGenericJUnitFile(WorkspaceFileSystem workspace, JUnitVersion jUnitVersion, String className) { + WorkspacePath wsPath = new WorkspacePath(String.format("java/com/google/test/%s.java", className)); + switch (jUnitVersion) { + case JUNIT_4: + return workspace.createPsiFile( + wsPath, + "package com.google.test;", + "@org.junit.runner.RunWith(org.junit.runners.JUnit4.class)", + String.format("public class %s {", className), + " @org.junit.Test", + " public void testMethod1() {}", + " @org.junit.Test", + " public void testMethod2() {}", + "}"); + case JUNIT_5: + return workspace.createPsiFile( + wsPath, + "package com.google.test;", + // We need to use the `Testable` annotation so that the tests can see the class. + // This is only necessary for testing because we don't have JUnit's class discovery mechanism. + // Ref: https://junit.org/junit5/docs/5.0.0/api/org/junit/platform/commons/annotation/Testable.html" + "@org.junit.platform.commons.annotation.Testable", + String.format("public class %s {", className), + " @org.junit.jupiter.api.Test", + " public void testMethod1() {}", + " @org.junit.jupiter.api.Test", + " public void testMethod2() {}", + "}"); + default: + throw new RuntimeException("Unsupported JUnit Version under test: " + jUnitVersion.toString()); + } + } +} diff --git a/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java b/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java index 6a53a7921b2..5a4f8acacbc 100644 --- a/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java +++ b/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java @@ -39,6 +39,14 @@ protected void initTest( applicationServices.register(ExperimentService.class, experimentService); } + @Test + public void testSingleJUnit5ClassFilter() { + assertThat( + BlazeJUnitTestFilterFlags.testFilterForClassAndMethods( + "com.google.idea.ClassName", JUnitVersion.JUNIT_5, ImmutableList.of(), null)) + .isEqualTo("com.google.idea.ClassName#"); + } + @Test public void testSingleJUnit4ClassFilter() { assertThat( @@ -63,6 +71,25 @@ public void testParameterizedIgnoredForSingleClass() { .isEqualTo("com.google.idea.ClassName#"); } + @Test + public void testParameterizedIgnoredForSingleClassJUnit5() { + assertThat( + BlazeJUnitTestFilterFlags.testFilterForClassAndMethods( + "com.google.idea.ClassName", JUnitVersion.JUNIT_5, ImmutableList.of(), null)) + .isEqualTo("com.google.idea.ClassName#"); + } + + @Test + public void testJUnit5ClassAndSingleMethod() { + assertThat( + BlazeJUnitTestFilterFlags.testFilterForClassAndMethods( + "com.google.idea.ClassName", + JUnitVersion.JUNIT_5, + ImmutableList.of("testMethod1"), + null)) + .isEqualTo("com.google.idea.ClassName#testMethod1$"); + } + @Test public void testJUnit4ClassAndSingleMethod() { assertThat( @@ -85,6 +112,17 @@ public void testJUnit3ClassAndSingleMethod() { .isEqualTo("com.google.idea.ClassName#testMethod1"); } + @Test + public void testJUnit5ClassAndMultipleMethods() { + assertThat( + BlazeJUnitTestFilterFlags.testFilterForClassAndMethods( + "com.google.idea.ClassName", + JUnitVersion.JUNIT_5, + ImmutableList.of("testMethod1", "testMethod2"), + null)) + .isEqualTo("com.google.idea.ClassName#(testMethod1|testMethod2)$"); + } + @Test public void testJUnit4ClassAndMultipleMethods() { assertThat( From 5953efacdce275539fe96df68fcdb96c9bcc2299 Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Thu, 16 Nov 2023 10:41:41 +0000 Subject: [PATCH 2/5] feat: Capture main class for java tests --- aspect/fast_build_info.bzl | 1 + .../google/idea/blaze/aspect/java/javatest/BUILD | 14 ++++++++++++++ .../java/javatest/JavaTestFastBuildAspectTest.java | 10 ++++++++++ .../com/google/idea/blaze/java/JavaBlazeRules.java | 1 + .../blaze/java/fastbuild/FastBuildBlazeData.java | 5 +++++ .../blaze/java/fastbuild/FastBuildServiceImpl.java | 8 ++++++-- proto/fast_build_info.proto | 1 + 7 files changed, 38 insertions(+), 2 deletions(-) diff --git a/aspect/fast_build_info.bzl b/aspect/fast_build_info.bzl index 483558a3702..ddc3575e03e 100644 --- a/aspect/fast_build_info.bzl +++ b/aspect/fast_build_info.bzl @@ -78,6 +78,7 @@ def _fast_build_info_impl(target, ctx): "launcher": launcher, "swigdeps": getattr(ctx.rule.attr, "swigdeps", True), "jvm_flags": getattr(ctx.rule.attr, "jvm_flags", []), + "main_class": getattr(ctx.rule.attr, "main_class", None), } annotation_processing = target[JavaInfo].annotation_processing if annotation_processing: diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD index 287825b2025..ba498ba494a 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD @@ -66,12 +66,26 @@ fast_build_aspect_test_fixture( deps = [":FooTestWithCustomLauncher"], ) +java_test( + name = "FooTestWithCustomMainClass", + srcs = ["FooTest.java"], + main_class = "com.google.idea.blaze.aspect.java.javatest.mock.MainClass", + test_class = "com.google.idea.blaze.aspect.java.javatest.FooTest", + deps = ["@junit//jar"], +) + +fast_build_aspect_test_fixture( + name = "footest_with_custom_main_class_fast_build_fixture", + deps = [":FooTestWithCustomMainClass"], +) + java_test( name = "JavaTestFastBuildAspectTest", srcs = ["JavaTestFastBuildAspectTest.java"], data = [ ":footest_no_launcher_fast_build_fixture", ":footest_with_custom_launcher_fast_build_fixture", + ":footest_with_custom_main_class_fast_build_fixture", ], deps = [ "//aspect/testing:guava", diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java index 68763a08bfb..693e11dace6 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java @@ -60,6 +60,16 @@ public void testCustomJavaLauncher() throws Exception { .isEqualTo(aspectLoader.testRelative(":custom_java_launcher")); } + @Test + public void testCustomMainClass() throws Exception { + FastBuildAspectTestFixture fixture = + aspectLoader.loadTestFixture(":footest_with_custom_main_class_fast_build_fixture"); + FastBuildBlazeData data = + getDataForTarget(aspectLoader.testRelative(":FooTestWithCustomMainClass"), fixture); + assertThat(data.getJavaInfo().getMainClass()) + .isEqualTo("com.google.idea.blaze.aspect.java.javatest.mock.MainClass"); + } + private FastBuildBlazeData getDataForTarget(String target, FastBuildAspectTestFixture fixture) { return fixture.getTargetList().stream() diff --git a/java/src/com/google/idea/blaze/java/JavaBlazeRules.java b/java/src/com/google/idea/blaze/java/JavaBlazeRules.java index 7c31cb1ff77..c628760a401 100644 --- a/java/src/com/google/idea/blaze/java/JavaBlazeRules.java +++ b/java/src/com/google/idea/blaze/java/JavaBlazeRules.java @@ -33,6 +33,7 @@ public final class JavaBlazeRules implements Kind.Provider { public enum RuleTypes { JAVA_LIBRARY("java_library", LanguageClass.JAVA, RuleType.LIBRARY), JAVA_TEST("java_test", LanguageClass.JAVA, RuleType.TEST), + JAVA_JUNIT5_TEST("java_junit5_test", LanguageClass.JAVA, RuleType.TEST), JAVA_TEST_SUITE("java_test_suite", LanguageClass.JAVA, RuleType.TEST), JAVA_BINARY("java_binary", LanguageClass.JAVA, RuleType.BINARY), JAVA_IMPORT("java_import", LanguageClass.JAVA, RuleType.UNKNOWN), diff --git a/java/src/com/google/idea/blaze/java/fastbuild/FastBuildBlazeData.java b/java/src/com/google/idea/blaze/java/fastbuild/FastBuildBlazeData.java index 93f998a5714..1cbbfef5daf 100644 --- a/java/src/com/google/idea/blaze/java/fastbuild/FastBuildBlazeData.java +++ b/java/src/com/google/idea/blaze/java/fastbuild/FastBuildBlazeData.java @@ -158,6 +158,8 @@ public abstract static class JavaInfo { public abstract ImmutableList jvmFlags(); + public abstract Optional mainClass(); + public static JavaInfo fromProto(FastBuildInfo.JavaInfo proto) { Set sources = proto.getSourcesList().stream().map(ArtifactLocation::fromProto).collect(toSet()); @@ -175,6 +177,7 @@ public static JavaInfo fromProto(FastBuildInfo.JavaInfo proto) { .setAnnotationProcessorClassNames(proto.getAnnotationProcessorClassNamesList()) .setAnnotationProcessorClasspath(annotationProcessorClasspath) .setJvmFlags(proto.getJvmFlagsList()) + .setMainClass(proto.getMainClass()) .build(); } @@ -209,6 +212,8 @@ public abstract Builder setAnnotationProcessorClasspath( public abstract Builder setJvmFlags(Collection jvmFlags); + public abstract Builder setMainClass(@Nullable String mainClass); + public abstract JavaInfo build(); } } diff --git a/java/src/com/google/idea/blaze/java/fastbuild/FastBuildServiceImpl.java b/java/src/com/google/idea/blaze/java/fastbuild/FastBuildServiceImpl.java index a58669c7640..6053bd6b012 100644 --- a/java/src/com/google/idea/blaze/java/fastbuild/FastBuildServiceImpl.java +++ b/java/src/com/google/idea/blaze/java/fastbuild/FastBuildServiceImpl.java @@ -82,13 +82,17 @@ final class FastBuildServiceImpl implements FastBuildService, ProjectComponent { private static final ImmutableSetMultimap SUPPORTED_KINDS = ImmutableSetMultimap.builder() - .putAll(BuildSystemName.Bazel, JavaBlazeRules.RuleTypes.JAVA_TEST.getKind()) + .putAll( + BuildSystemName.Bazel, + JavaBlazeRules.RuleTypes.JAVA_TEST.getKind(), + JavaBlazeRules.RuleTypes.JAVA_JUNIT5_TEST.getKind()) .putAll( BuildSystemName.Blaze, AndroidBlazeRules.RuleTypes.ANDROID_ROBOLECTRIC_TEST.getKind(), AndroidBlazeRules.RuleTypes.ANDROID_LOCAL_TEST.getKind(), AndroidBlazeRules.RuleTypes.KT_ANDROID_LOCAL_TEST.getKind(), - JavaBlazeRules.RuleTypes.JAVA_TEST.getKind()) + JavaBlazeRules.RuleTypes.JAVA_TEST.getKind(), + JavaBlazeRules.RuleTypes.JAVA_JUNIT5_TEST.getKind()) .build(); private final Project project; diff --git a/proto/fast_build_info.proto b/proto/fast_build_info.proto index aece81d55f9..fa5fd64de4a 100644 --- a/proto/fast_build_info.proto +++ b/proto/fast_build_info.proto @@ -50,6 +50,7 @@ message JavaInfo { repeated ArtifactLocation annotation_processor_classpath = 6; repeated string jvm_flags = 7; bool swigdeps = 8; + string main_class = 9; } message JavaToolchainInfo { From 3c7fd1ed18bbbc6ca6d99fee3813ff28490ff480 Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Thu, 16 Nov 2023 10:41:59 +0000 Subject: [PATCH 3/5] feat: Use main class for fast tests if there is any --- .../java/run/fastbuild/FastBuildTestEnvironmentCreator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/java/src/com/google/idea/blaze/java/run/fastbuild/FastBuildTestEnvironmentCreator.java b/java/src/com/google/idea/blaze/java/run/fastbuild/FastBuildTestEnvironmentCreator.java index 09fba07ddad..bc49c03f38f 100644 --- a/java/src/com/google/idea/blaze/java/run/fastbuild/FastBuildTestEnvironmentCreator.java +++ b/java/src/com/google/idea/blaze/java/run/fastbuild/FastBuildTestEnvironmentCreator.java @@ -111,7 +111,11 @@ GeneralCommandLine createCommandLine( getTestClassProperty(), FastBuildTestClassFinder.getInstance(project).getTestClass(target, targetJavaInfo)); - commandBuilder.setMainClass(getTestRunner()); + if (targetJavaInfo.mainClass().isPresent()) { + commandBuilder.setMainClass(targetJavaInfo.mainClass().get()); + } else { + commandBuilder.setMainClass(getTestRunner()); + } commandBuilder .addEnvironmentVariable(TEST_BINARY_VARIABLE, getTestBinary(target)) From 95d436440f6f4d15b48f299065d7b8f2c546ef9d Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Tue, 21 Nov 2023 11:47:04 +0000 Subject: [PATCH 4/5] Fix CI --- .../tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD | 3 ++- .../aspect/java/javatest/JavaTestFastBuildAspectTest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD index ba498ba494a..3df2f2f16c2 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/BUILD @@ -69,7 +69,8 @@ fast_build_aspect_test_fixture( java_test( name = "FooTestWithCustomMainClass", srcs = ["FooTest.java"], - main_class = "com.google.idea.blaze.aspect.java.javatest.mock.MainClass", + main_class = "com.google.idea.blaze.aspect.java.javatest.fake.TestRunner", + tags = ["manual"], # This test is not meant to be ran on its own. The main class represents a custom test runner. test_class = "com.google.idea.blaze.aspect.java.javatest.FooTest", deps = ["@junit//jar"], ) diff --git a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java index 693e11dace6..5462f928c55 100644 --- a/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java +++ b/aspect/testing/tests/src/com/google/idea/blaze/aspect/java/javatest/JavaTestFastBuildAspectTest.java @@ -67,7 +67,7 @@ public void testCustomMainClass() throws Exception { FastBuildBlazeData data = getDataForTarget(aspectLoader.testRelative(":FooTestWithCustomMainClass"), fixture); assertThat(data.getJavaInfo().getMainClass()) - .isEqualTo("com.google.idea.blaze.aspect.java.javatest.mock.MainClass"); + .isEqualTo("com.google.idea.blaze.aspect.java.javatest.fake.TestRunner"); } From 5136a160468816eac8a6c03e577ccd82a43cee81 Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Thu, 25 Jan 2024 11:26:07 +0000 Subject: [PATCH 5/5] Address comments --- .../blaze/java/run/JUnitTestHeuristic.java | 9 ++++----- .../producers/BlazeJUnitTestFilterFlags.java | 2 +- ...ipleJavaClassesTestContextProviderTest.java | 6 ++++++ .../BlazeJUnitTestFilterFlagsTest.java | 18 ++++++++++++------ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java b/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java index fcc4fa47ad7..df5d4435255 100644 --- a/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java +++ b/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java @@ -50,7 +50,8 @@ public static Optional jUnitVersion(PsiClass psiClass) { } else if (JUnitUtil.isJUnit3TestClass(psiClass)) { return Optional.of(JUnitVersion.JUNIT_3); } else { - return Optional.empty(); + // Fall back to Junit3 + return Optional.of(JUnitVersion.JUNIT_3); } } @@ -82,7 +83,7 @@ public boolean matchesSource( File sourceFile, @Nullable TestSize testSize) { Optional sourceVersion = junitVersion(sourcePsiFile); - if (sourceVersion == null || sourceVersion.isEmpty()) { + if (sourceVersion.isEmpty()) { return false; } String targetName = target.label.targetName().toString().toLowerCase(); @@ -97,15 +98,13 @@ public boolean matchesSource( return false; } - @Nullable private Optional junitVersion(@Nullable PsiFile psiFile) { if (!(psiFile instanceof PsiClassOwner)) { - return null; + return Optional.empty(); } return ReadAction.compute(() -> junitVersion((PsiClassOwner) psiFile)); } - @Nullable private Optional junitVersion(PsiClassOwner classOwner) { for (PsiClass psiClass : classOwner.getClasses()) { Optional version = jUnitVersion(psiClass); diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java index a2226cf576e..ad30e98023b 100644 --- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java +++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java @@ -122,7 +122,7 @@ public static String testFilterForClassesAndMethods( // java_test target they're run from. Optional version = JUnitTestHeuristic.jUnitVersion(methodsPerClass.keySet()); if (version.isEmpty()) { - return null; + return testFilterForClassesAndMethods(methodsPerClass, JUnitVersion.JUNIT_3); } return testFilterForClassesAndMethods(methodsPerClass, version.get()); } diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java index 231d2cc42ae..925d4156a6d 100644 --- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java +++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestContextProviderTest.java @@ -41,6 +41,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiJavaFile; + import java.util.Arrays; import java.util.List; import org.junit.After; @@ -88,6 +89,11 @@ public final void removeSourceFolder() { final ModifiableRootModel model = ModuleRootManager.getInstance(testFixture.getModule()).getModifiableModel(); ContentEntry contentEntry = model.getContentEntries()[0]; + // There is a global content entry, `//src`, which is necessary to infer targets from test classes. + // This is set outside of these test (somewhere in the superclass) once per run, not once per test. + // If we just use contentEntry.clearSourceDirs() here, it won't be re-created, and tests that assume + // it exists will fail. + // Therefore, we only delete the content entries that this test has created. Arrays.stream(contentEntry.getSourceFolders()).forEach((folder) -> { if (folder.getFile().equals(pkgRoot)) { contentEntry.removeSourceFolder(folder); diff --git a/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java b/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java index 5a4f8acacbc..a8d8d5e2a0a 100644 --- a/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java +++ b/java/tests/unittests/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlagsTest.java @@ -64,19 +64,25 @@ public void testSingleJUnit3ClassFilter() { } @Test - public void testParameterizedIgnoredForSingleClass() { + public void testParameterizedIgnoredForSingleClassJUnit4() { assertThat( BlazeJUnitTestFilterFlags.testFilterForClassAndMethods( - "com.google.idea.ClassName", JUnitVersion.JUNIT_4, ImmutableList.of(), null)) - .isEqualTo("com.google.idea.ClassName#"); + "com.google.idea.ClassName", + JUnitVersion.JUNIT_4, + ImmutableList.of(), + ParameterizedTestInfo.create("ignored", "-ignored"))) + .isEqualTo("com.google.idea.ClassName#"); } @Test public void testParameterizedIgnoredForSingleClassJUnit5() { assertThat( - BlazeJUnitTestFilterFlags.testFilterForClassAndMethods( - "com.google.idea.ClassName", JUnitVersion.JUNIT_5, ImmutableList.of(), null)) - .isEqualTo("com.google.idea.ClassName#"); + BlazeJUnitTestFilterFlags.testFilterForClassAndMethods( + "com.google.idea.ClassName", + JUnitVersion.JUNIT_5, + ImmutableList.of(), + ParameterizedTestInfo.create("ignored", "-ignored"))) + .isEqualTo("com.google.idea.ClassName#"); } @Test