"Unit tests for test.bzl"

load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
load("//lib/private:utils.bzl", "utils")

def _to_label_test_impl(ctx):
    env = unittest.begin(ctx)

    # assert label/string comparisons work as expected
    asserts.true(env, "//some/label" != Label("//some/label"))
    asserts.true(env, "//some/label" != Label("//some/other/label"))
    asserts.true(env, Label("//some/label") == Label("//some/label"))
    asserts.true(env, "//some/label" != Label("//some/label"))
    asserts.true(env, "//some/label" != Label("//some/other/label"))

    # assert that to_label can convert from string to label
    asserts.true(env, utils.to_label("//hello/world") == Label("//hello/world:world"))
    asserts.true(env, utils.to_label("//hello/world:world") == Label("//hello/world:world"))

    # assert that to_label will handle a Label as an argument
    asserts.true(env, utils.to_label(Label("//hello/world")) == Label("//hello/world:world"))
    asserts.true(env, utils.to_label(Label("//hello/world:world")) == Label("//hello/world:world"))

    # relative labels
    for (actual, expected) in ctx.attr.relative_asserts.items():
        asserts.true(env, actual.label == Label(expected))

    return unittest.end(env)

def _is_external_label_test_impl(ctx):
    env = unittest.begin(ctx)

    # assert that labels and strings that are constructed within this workspace return false
    asserts.false(env, utils.is_external_label("//some/label"))
    asserts.false(env, utils.is_external_label(Label("//some/label")))
    asserts.false(env, utils.is_external_label(Label("@aspect_bazel_lib//some/label")))
    asserts.false(env, ctx.attr.internal_with_workspace_as_string)

    # assert that labels and string that give a workspace return true
    asserts.true(env, utils.is_external_label(Label("@foo//some/label")))
    asserts.true(env, ctx.attr.external_as_string)

    return unittest.end(env)

def _propagate_well_known_tags_test_impl(ctx):
    env = unittest.begin(ctx)

    asserts.equals(env, ["manual", "cpu:12"], utils.propagate_well_known_tags(["foo", "manual", "bar", "cpu:12"]))

    return unittest.end(env)

to_label_test = unittest.make(
    _to_label_test_impl,
    attrs = {
        "relative_asserts": attr.label_keyed_string_dict(
            allow_files = True,
            mandatory = True,
        ),
    },
)

is_external_label_test = unittest.make(
    _is_external_label_test_impl,
    attrs = {
        "external_as_string": attr.bool(
            mandatory = True,
        ),
        "internal_with_workspace_as_string": attr.bool(
            mandatory = True,
        ),
    },
)

propagate_well_known_tags_test = unittest.make(
    _propagate_well_known_tags_test_impl,
)

def utils_test_suite():
    to_label_test(name = "to_label_tests", relative_asserts = {
        utils.to_label(":utils_test.bzl"): "//lib/tests:utils_test.bzl",
    })

    is_external_label_test(
        name = "is_external_label_tests",
        external_as_string = utils.is_external_label("@foo//some/label"),
        internal_with_workspace_as_string = utils.is_external_label("@aspect_bazel_lib//some/label"),
    )

    propagate_well_known_tags_test(
        name = "propagate_well_known_tags_tests",
    )
