"""This module defines a custom go_test macro that produces separate targets for manual tests."""

load("@io_bazel_rules_go//go:def.bzl", _go_test = "go_test")

def go_test(name, srcs, tags = [], args = [], **kwargs):
    """Wrapper around go_test that splits manual and non-manual tests into separate targets.

    The purpose of this macro is to automatically create separate test targets for non-manual and
    manual Go tests. The latter will be tagged as manual in order to exclude them from wildcard
    queries such as "bazel test ...". It assumes that any manual test cases are placed in Go files
    ending with "_manual_test.go".

    In addition, this macro customizes some go_test arguments with better defaults.

    This macro is not intended to be used directly. It is designed to be used with the
    gazelle:map_kind directive, which customizes the kinds of rules generated by Gazelle. In
    particular, it can be used to replace the default go_test rule (defined in the rules_go
    repository) with this macro. See https://github.com/bazelbuild/bazel-gazelle#directives.

    Suppose this macro is invoked with name = "example_test", and that the srcs attribute contains a
    combination of non-manual and manual test cases:

    ```
        # Macro invocation.
        go_test(
            name = "example_test",
            srcs = [
                "foo_test.go",
                "bar_test.go",
                "baz_test.go",
                "delta_manual_test.go",
                "omega_manual_test.go",
            ],
            ...
        )
    ```

    The above macro invocation will result in two rules_go's go_test targets, one named
    "example_test" containing the non-manual tests (*_test.go), and one named "example_manual_test"
    containing both the non-manual and manual tests (*_test.go and *_manual_test.go):

    ```
        # Resulting rules_go's go_test targets:

        go_test(
            name = "example_test",
            srcs = [
                "foo_test.go",
                "bar_test.go",
                "baz_test.go",
            ],
            ...
        )

        go_test(
            name = "example_manual_test",
            srcs = [
                "foo_test.go",
                "bar_test.go",
                "baz_test.go",
                "delta_manual_test.go",
                "omega_manual_test.go",
            ],
            tags = ["manual"],    # Exclude from Bazel wildcards, e.g. "bazel test ...".
            ...
        )
    ```

    The reason why example_manual_test includes the non-manual tests as well is because they might
    define auxiliary functions, test data, etc. shared between all tests, including the manual
    ones. Thus, example_manual_test will run both the manual and non-manual tests when invoked with
    "bazel test ...".

    If this macro is invoked without any files ending with "_manual_test.go", it behaves exactly
    like the default go_test rule from the rules_go repository.

    Args:
        name: Base name of the target(s) to generate.
        srcs: Any *_test.go files.
        tags: Any tags for the resulting go_test targets.
        args: Any command-line arguments to pass to the test binaries of both go_test targets.
        **kwargs: Any other arguments to pass to the resulting go_test targets.
    """

    # Gazelle only includes files ending with _test.go in the srcs attribute of go_test targets.
    # In order to prevent bugs, we fail loudly if this ceases to be true for any reason.
    for src in srcs:
        if not src.endswith("_test.go"):
            fail("go_test called with a src file that does not end with \"_test.go\".")

    # Make tests verbose by default. This improves error reporting in Infra-PerCommit-Test-Bazel-*
    # for tests that time out, which by default fail silently without any indication of which test
    # case caused the timeout.
    #
    # Note that Bazel omits the output of successful tests. This does not add noise to the logs.
    args = args + ["--test.v"]  # Equivalent to "go test [target] -v".

    non_manual_test_srcs = [src for src in srcs if not src.endswith("_manual_test.go")]

    # Generate the base go_test target, excluding any *_manual_test.go files.
    _go_test(name = name, srcs = non_manual_test_srcs, tags = tags, args = args, **kwargs)

    # Only generate the target for manual tests if there is at least one *_manual_test.go file.
    if len(srcs) != len(non_manual_test_srcs):
        _go_test(
            name = name[:-4] + "manual_test",  # Turn e.g. foo_test into foo_manual_test.
            # Include *_manual_test.go and *_test.go sources as well, because the latter might
            # contain functions, test data, etc. shared between the manual and non-manual tests.
            srcs = srcs,
            tags = tags + ["manual"],  # Exclude from Bazel wildcards, e.g. "bazel test ...".
            **kwargs
        )
