"""
This module contains rules and macros for building and testing Go code.
"""

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

def go_test(ld = None, count = 3, **kwargs):
    """go_test is a wrapper for go_test that uses default settings for Constellation.

    It adds the following:
    - Sets test count to 3.
    - Sets race detector to on by default (except Mac OS)
    - Optionally sets the interpreter path to ld.

    Args:
          ld: path to interpreter to that will be written into the elf header.
          count: number of times each test should be executed. defaults to 3.
          **kwargs: all other arguments are passed to go_test.
    """

    # Sets test count to 3.
    kwargs.setdefault("args", [])
    kwargs["args"].append("--test.count={}".format(count))

    # enable race detector by default
    race_value = select({
        "@platforms//os:macos": "off",
        "//conditions:default": "on",
    })
    pure_value = select({
        "@platforms//os:macos": "on",
        "//conditions:default": "off",
    })
    kwargs.setdefault("race", race_value)
    kwargs.setdefault("pure", pure_value)

    # set gc_linkopts to set the interpreter path to ld.
    kwargs.setdefault("gc_linkopts", [])
    if ld:
        kwargs["gc_linkopts"] += ["-I", ld]

    _go_test(**kwargs)