Improve the `javac_action_subject` API

 - Make `strict_java_deps` return a string subject
 - Make `direct_dependencies` return an empty list if the flag was unset
 - Make the `output` parameter optional while constructing the subject, default to looking up the action by mnemonic.
 - Add an optional `desc` parameter - helpful to distinguish between the same target built in different configurations.

(ignore-relnotes)

PiperOrigin-RevId: 967690792
Change-Id: I6f90a4a1b3a06022e8306a3f78984de51a4b97c9
diff --git a/test/java/common/rules/java_library_tests.bzl b/test/java/common/rules/java_library_tests.bzl
index 4115b12..ec5500c 100644
--- a/test/java/common/rules/java_library_tests.bzl
+++ b/test/java/common/rules/java_library_tests.bzl
@@ -337,7 +337,7 @@
     # javac action's argv at all; the "OFF" value (which is equivalent to an unset flag) in that
     # case is injected by javac_action_subject for convenience and canonicalization.
     expect_that_javac_action = javac_action_subject.of(env, target, "{package}/lib{name}.jar")
-    expect_that_javac_action.strict_java_deps().contains_exactly([env.ctx.attr.expected_strict_java_deps])
+    expect_that_javac_action.strict_java_deps().equals(env.ctx.attr.expected_strict_java_deps)
 
 def _test_strict_java_deps_off(name):
     _test_strict_java_deps(name, "OFF")
diff --git a/test/java/testutil/javac_action_subject.bzl b/test/java/testutil/javac_action_subject.bzl
index a887d68..794f35a 100644
--- a/test/java/testutil/javac_action_subject.bzl
+++ b/test/java/testutil/javac_action_subject.bzl
@@ -1,15 +1,19 @@
 """Bespoke rules_testing subject for the Java compilation action"""
 
-load("@rules_testing//lib:truth.bzl", "subjects", "truth")
+load("@rules_testing//lib:truth.bzl", "subjects")
 load("@rules_testing//lib:util.bzl", "TestingAspectInfo")
 
-def _new_javac_action_subject(env, target, output):
-    action_subject = env.expect.that_target(target).action_generating(output)
+def _new_javac_action_subject(env, target, output = None, desc = ""):
+    target_subject = env.expect.that_target(target)
+    if output:
+        action_subject = target_subject.action_generating(output)
+    else:
+        action_subject = target_subject.action_named("Javac")
     self = struct(
         actual = action_subject.actual,
         parsed_flags = _parse_flags(action_subject.actual.argv),
-        meta = truth.expect(env).meta.derive(
-            "Javac",
+        meta = target_subject.meta.derive(
+            desc + ".Javac",
             format_str_kwargs = {
                 "name": target.label.name,
                 "package": target.label.package,
@@ -19,12 +23,12 @@
     )
 
     public = struct(
-        direct_dependencies = lambda: _create_subject_for_flag("--direct_dependencies", self.parsed_flags, self.meta),
+        direct_dependencies = lambda: _create_subject_for_flag("--direct_dependencies", self.parsed_flags, self.meta, default = []),
         deps_artifacts = lambda: _create_subject_for_flag("--deps_artifacts", self.parsed_flags, self.meta),
         javacopts = lambda: _create_subject_for_flag("--javacopts", self.parsed_flags, self.meta),
         jar = lambda: _create_subject_for_flag("-jar", self.parsed_flags, self.meta),
         # An unset --strict_java_deps is equivalent to "OFF".
-        strict_java_deps = lambda: _create_subject_for_flag("--strict_java_deps", self.parsed_flags, self.meta, default = ["OFF"]),
+        strict_java_deps = lambda: _create_subject_for_flag("--strict_java_deps", self.parsed_flags, self.meta, default = ["OFF"]).offset(0, factory = subjects.str),
         sources = lambda: _create_subject_for_flag("--sources", self.parsed_flags, self.meta),
         resources = lambda: _create_subject_for_flag("--resources", self.parsed_flags, self.meta),
         classpath = lambda: _create_subject_for_flag("--classpath", self.parsed_flags, self.meta),