"""Test for py_library."""

load("@rules_testing//lib:analysis_test.bzl", "analysis_test")
load("@rules_testing//lib:truth.bzl", "matching")
load("@rules_testing//lib:util.bzl", rt_util = "util")
load("//python:defs.bzl", "PyRuntimeInfo", "py_library")
load("//tests/base_rules:base_tests.bzl", "create_base_tests")
load("//tests/base_rules:util.bzl", pt_util = "util")

_tests = []

def _test_py_runtime_info_not_present(name, config):
    rt_util.helper_target(
        config.rule,
        name = name + "_subject",
        srcs = ["lib.py"],
    )
    analysis_test(
        name = name,
        target = name + "_subject",
        impl = _test_py_runtime_info_not_present_impl,
    )

def _test_py_runtime_info_not_present_impl(env, target):
    env.expect.that_bool(PyRuntimeInfo in target).equals(False)

_tests.append(_test_py_runtime_info_not_present)

def _test_files_to_build(name, config):
    rt_util.helper_target(
        config.rule,
        name = name + "_subject",
        srcs = ["lib.py"],
    )
    analysis_test(
        name = name,
        target = name + "_subject",
        impl = _test_files_to_build_impl,
    )

def _test_files_to_build_impl(env, target):
    env.expect.that_target(target).default_outputs().contains_exactly([
        "{package}/lib.py",
    ])

_tests.append(_test_files_to_build)

def _test_srcs_can_contain_rule_generating_py_and_nonpy_files(name, config):
    rt_util.helper_target(
        config.rule,
        name = name + "_subject",
        srcs = ["lib.py", name + "_gensrcs"],
    )
    rt_util.helper_target(
        native.genrule,
        name = name + "_gensrcs",
        cmd = "touch $(OUTS)",
        outs = [name + "_gen.py", name + "_gen.cc"],
    )
    analysis_test(
        name = name,
        target = name + "_subject",
        impl = _test_srcs_can_contain_rule_generating_py_and_nonpy_files_impl,
    )

def _test_srcs_can_contain_rule_generating_py_and_nonpy_files_impl(env, target):
    env.expect.that_target(target).default_outputs().contains_exactly([
        "{package}/{test_name}_gen.py",
        "{package}/lib.py",
    ])

_tests.append(_test_srcs_can_contain_rule_generating_py_and_nonpy_files)

def _test_srcs_generating_no_py_files_is_error(name, config):
    rt_util.helper_target(
        config.rule,
        name = name + "_subject",
        srcs = [name + "_gen"],
    )
    rt_util.helper_target(
        native.genrule,
        name = name + "_gen",
        cmd = "touch $(OUTS)",
        outs = [name + "_gen.cc"],
    )
    analysis_test(
        name = name,
        target = name + "_subject",
        impl = _test_srcs_generating_no_py_files_is_error_impl,
        expect_failure = True,
    )

def _test_srcs_generating_no_py_files_is_error_impl(env, target):
    env.expect.that_target(target).failures().contains_predicate(
        matching.str_matches("does not produce*srcs files"),
    )

_tests.append(_test_srcs_generating_no_py_files_is_error)

def _test_files_to_compile(name, config):
    rt_util.helper_target(
        config.rule,
        name = name + "_subject",
        srcs = ["lib1.py"],
        deps = [name + "_lib2"],
    )
    rt_util.helper_target(
        config.rule,
        name = name + "_lib2",
        srcs = ["lib2.py"],
        deps = [name + "_lib3"],
    )
    rt_util.helper_target(
        config.rule,
        name = name + "_lib3",
        srcs = ["lib3.py"],
    )
    analysis_test(
        name = name,
        target = name + "_subject",
        impl = _test_files_to_compile_impl,
    )

def _test_files_to_compile_impl(env, target):
    target = env.expect.that_target(target)
    target.output_group(
        "compilation_prerequisites_INTERNAL_",
    ).contains_exactly([
        "{package}/lib1.py",
        "{package}/lib2.py",
        "{package}/lib3.py",
    ])
    target.output_group(
        "compilation_outputs",
    ).contains_exactly([
        "{package}/lib1.py",
        "{package}/lib2.py",
        "{package}/lib3.py",
    ])

_tests.append(_test_files_to_compile)

def py_library_test_suite(name):
    config = struct(rule = py_library, base_test_rule = py_library)
    native.test_suite(
        name = name,
        tests = pt_util.create_tests(_tests, config = config) + create_base_tests(config),
    )
