# Copyright 2026 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

"""Defines the zephyr_cc_unit_test rule."""

load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
load("@rules_python//python:py_test.bzl", "py_test")
load("@zephyr//:cc.bzl", "zephyr_app", "zephyr_cc_library")

def zephyr_cc_test(**kw_args):
    """Creates a Zephyr test library for use with a test runner."""
    zephyr_cc_library(
        deps = kw_args.pop("deps", []) + [
            "@pigweed//pw_unit_test",
        ],
        testonly = True,
        **kw_args
    )

def ztest(
        name,
        deps,
        tags = None,
        visibility = None,
        stop_at = 10,
        success_signature = "PROJECT EXECUTION SUCCESSFUL",
        **kwargs):
    """Creates a Zephyr ZTest target runnable with `bazel test`.

    This macro compiles the target application binary under the hood and wraps
    it in an automated simulator runner validating the ZTest suite output.
    """
    tags = tags or []
    bin_name = name + "_bin"

    # 1. Compile the executable Zephyr application (forwarding compilation kwargs)
    zephyr_app(
        name = bin_name,
        deps = deps,
        testonly = True,
        visibility = ["//visibility:private"],
        **kwargs
    )

    # 2. Copy the runner script to the local package to satisfy py_test constraints
    runner_script = name + "_runner.py"
    copy_file(
        name = name + "_runner_copy",
        src = "@zephyr-bazel//scripts/build:ztest_runner.py",
        out = runner_script,
        testonly = True,
    )

    # 3. Simulator test target (sandboxed, cached)
    py_test(
        name = name + "_sim",
        srcs = [runner_script],
        main = runner_script,
        data = [
            ":" + bin_name,
            ":" + bin_name + "_runners_yaml",
        ],
        deps = [
            "@zephyr-bazel//scripts/build:ztest_runner",
        ],
        args = [
            "--binary",
            "$(rlocationpath :" + bin_name + ")",
            "--runners-yaml",
            "$(rlocationpath :" + bin_name + "_runners_yaml)",
            "--stop-at",
            str(stop_at),
            "--success-signature",
            '"{}"'.format(success_signature),
        ],
        tags = tags,
        visibility = visibility,
        target_compatible_with = ["@zephyr//boards:sim"],
    )

    # 4. Hardware test target (local, no-cache, exclusive)
    py_test(
        name = name + "_hw",
        srcs = [runner_script],
        main = runner_script,
        data = [
            ":" + bin_name,
            ":" + bin_name + "_runners_yaml",
        ],
        deps = [
            "@zephyr-bazel//scripts/build:ztest_runner",
        ],
        args = [
            "--binary",
            "$(rlocationpath :" + bin_name + ")",
            "--runners-yaml",
            "$(rlocationpath :" + bin_name + "_runners_yaml)",
            "--stop-at",
            str(stop_at),
            "--success-signature",
            '"{}"'.format(success_signature),
        ],
        tags = tags + ["local", "exclusive"],
        visibility = visibility,
        target_compatible_with = ["@zephyr//boards:hw"],
    )

    # 5. Unified test suite
    native.test_suite(
        name = name,
        tests = [
            ":" + name + "_sim",
            ":" + name + "_hw",
        ],
        visibility = visibility,
    )
