Add a test for `java_binary` with an explicit `main_class`

(ignore-relnotes)

PiperOrigin-RevId: 940934897
Change-Id: I49e9fb0e03bea872dd27a99f5f764da390aaba18
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 122d26c..c0fd946 100644
--- a/test/java/common/rules/common_launcher_java_binary_tests.bzl
+++ b/test/java/common/rules/common_launcher_java_binary_tests.bzl
@@ -5,6 +5,7 @@
 load("//java:java_binary.bzl", "java_binary")
 load("//java:java_library.bzl", "java_library")
 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")
 
 def _test_java_binary_non_executable_rule_outputs(name):
@@ -130,6 +131,24 @@
         "{package}/OtherDependency.java",
     ])
 
+def _test_java_binary_explicit_main_class(name):
+    util.helper_target(
+        java_binary,
+        name = name + "/bin",
+        main_class = "foo.bar.baz",
+    )
+
+    analysis_test(
+        name = name,
+        impl = _test_java_binary_explicit_main_class_impl,
+        target = name + "/bin",
+    )
+
+def _test_java_binary_explicit_main_class_impl(env, target):
+    expect_that_executable.of_target(env, target).java_start_class().equals(
+        "foo.bar.baz",
+    )
+
 def java_binary_launcher_tests(name):
     test_suite(
         name = name,
@@ -138,5 +157,6 @@
             _test_java_binary_resources_only,
             _test_java_binary_deploy_jar_coverage_setup,
             _test_java_binary_transitive_dependency_from_java_library,
+            _test_java_binary_explicit_main_class,
         ],
     )
diff --git a/test/java/testutil/binary_executable_subject.bzl b/test/java/testutil/binary_executable_subject.bzl
new file mode 100644
index 0000000..189e1d2
--- /dev/null
+++ b/test/java/testutil/binary_executable_subject.bzl
@@ -0,0 +1,26 @@
+"""Custom rules_testing subject for java_binary/java_test executable output"""
+
+load("@rules_testing//lib:truth.bzl", "subjects")
+
+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),
+    )
+    return public
+
+def _java_start_class_subject(action):
+    if action.actual.substitutions:
+        return action.substitutions().get("%java_start_class%", factory = subjects.str)
+    else:
+        # Windows
+        return action.argv().transform(
+            filter = lambda e: e.startswith("java_start_class="),
+            map_each = lambda e: e.split("=", 1)[1],
+            desc = "java_start_class",
+        ).offset(0, factory = subjects.str)
+
+expect_that_executable = struct(
+    of_target = _of_target,
+)