Add a test for `java_test` with an implicit `main_class`

(ignore-relnotes)

PiperOrigin-RevId: 944538181
Change-Id: I93c89986d07f8287ffb75f12e8bb8508a1dd9408
diff --git a/test/java/common/rules/common_launcher_java_binary_tests.bzl b/test/java/common/rules/common_launcher_java_binary_tests.bzl
index b3ffd0c..f09d2dc 100644
--- a/test/java/common/rules/common_launcher_java_binary_tests.bzl
+++ b/test/java/common/rules/common_launcher_java_binary_tests.bzl
@@ -4,6 +4,7 @@
 load("@rules_testing//lib:util.bzl", "util")
 load("//java:java_binary.bzl", "java_binary")
 load("//java:java_library.bzl", "java_library")
+load("//java:java_test.bzl", "java_test")
 load("//test/java/testutil:artifact_closure.bzl", "artifact_closure")
 load("//test/java/testutil:binary_executable_subject.bzl", "expect_that_executable")
 load("//test/java/testutil:mock_java_toolchain.bzl", "mock_java_toolchain")
@@ -167,6 +168,23 @@
         "common.rules.{test_name}.Binary".format(test_name = env.ctx.label.name),
     )
 
+def _test_java_test_main_class(name):
+    util.helper_target(
+        java_test,
+        name = name + "/Test",
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_java_test_main_class_impl,
+        target = name + "/Test",
+    )
+
+def _test_java_test_main_class_impl(env, target):
+    expect_that_executable.of_target(env, target).test_suite().equals(
+        "common.rules.{test_name}.Test".format(test_name = env.ctx.label.name),
+    )
+
 def java_binary_launcher_tests(name):
     test_suite(
         name = name,
@@ -177,5 +195,6 @@
             _test_java_binary_transitive_dependency_from_java_library,
             _test_java_binary_explicit_main_class,
             _test_java_binary_implicit_main_class,
+            _test_java_test_main_class,
         ],
     )
diff --git a/test/java/testutil/binary_executable_subject.bzl b/test/java/testutil/binary_executable_subject.bzl
index 189e1d2..818d66e 100644
--- a/test/java/testutil/binary_executable_subject.bzl
+++ b/test/java/testutil/binary_executable_subject.bzl
@@ -1,12 +1,14 @@
 """Custom rules_testing subject for java_binary/java_test executable output"""
 
 load("@rules_testing//lib:truth.bzl", "subjects")
+load("//java/common:java_semantics.bzl", "semantics")
 
 def _of_target(env, target):
     executable = target[DefaultInfo].files_to_run.executable.short_path
     action_subject = env.expect.that_target(target).action_generating(executable)
     public = struct(
         java_start_class = lambda: _java_start_class_subject(action_subject),
+        test_suite = lambda: _test_suite_subject(action_subject),
     )
     return public
 
@@ -21,6 +23,22 @@
             desc = "java_start_class",
         ).offset(0, factory = subjects.str)
 
+def _test_suite_subject(action):
+    if action.actual.substitutions:
+        jvm_flags = action.substitutions().get("%jvm_flags%", factory = subjects.str).split(" ")
+    else:
+        # Windows
+        jvm_flags = action.argv().transform(
+            filter = lambda e: e.startswith("jvm_flags="),
+            map_each = lambda e: e.split("=", 1)[1],
+            desc = "jvm_flags",
+        ).offset(0, factory = subjects.str).split("\t")
+    return jvm_flags.transform(
+        filter = lambda e: e.startswith("-D" + semantics.TEST_SUITE_PROPERTY_NAME + "="),
+        map_each = lambda e: e.split("=", 1)[1],
+        desc = semantics.TEST_SUITE_PROPERTY_NAME,
+    ).offset(0, factory = subjects.str)
+
 expect_that_executable = struct(
     of_target = _of_target,
 )