"""Tests for the java_runtime rule"""

load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
load("@rules_testing//lib:util.bzl", "util")
load("//java/common:java_semantics.bzl", "semantics")
load("//java/toolchains:java_runtime.bzl", "java_runtime")
load("//test/java/testutil:java_runtime_info_subject.bzl", "java_runtime_info_subject")
load("//test/java/testutil:rules/forward_java_runtime_info.bzl", "java_runtime_info_forwarding_rule")
load("//toolchains:java_toolchain_alias.bzl", "java_runtime_alias")

def _test_with_absolute_java_home(name):
    util.helper_target(
        java_runtime,
        name = name + "/jvm",
        srcs = [],
        java_home = "/foo/bar",
    )
    util.helper_target(
        java_runtime_alias,
        name = name + "/alias",
    )
    util.helper_target(
        java_runtime_info_forwarding_rule,
        name = name + "/r",
        java_runtime = name + "/alias",
    )
    util.helper_target(
        native.toolchain,
        name = name + "/java_runtime_toolchain",
        toolchain = name + "/jvm",
        toolchain_type = semantics.JAVA_RUNTIME_TOOLCHAIN_TYPE,
    )

    analysis_test(
        name = name,
        impl = _test_with_absolute_java_home_impl,
        target = name + "/r",
        config_settings = {
            "//command_line_option:extra_toolchains": [Label(name + "/java_runtime_toolchain")],
        },
        # Bazel 6 doesn't accept Label's for the transition above
        attr_values = {"tags": ["min_bazel_7"]},
    )

def _test_with_absolute_java_home_impl(env, target):
    assert_info = java_runtime_info_subject.from_target(env, target)

    assert_info.java_home().equals("/foo/bar")
    assert_info.java_home_runfiles_path().equals("/foo/bar")
    assert_info.java_executable_exec_path().starts_with("/foo/bar/bin/java")
    assert_info.java_executable_runfiles_path().starts_with("/foo/bar/bin/java")

def _test_with_hermetic_java_home(name):
    util.helper_target(
        java_runtime,
        name = name + "/jvm",
        srcs = [],
        java_home = "foo/bar",
    )
    util.helper_target(
        java_runtime_alias,
        name = name + "/alias",
    )
    util.helper_target(
        java_runtime_info_forwarding_rule,
        name = name + "/r",
        java_runtime = name + "/alias",
    )
    util.helper_target(
        native.toolchain,
        name = name + "/java_runtime_toolchain",
        toolchain = name + "/jvm",
        toolchain_type = semantics.JAVA_RUNTIME_TOOLCHAIN_TYPE,
    )

    analysis_test(
        name = name,
        impl = _test_with_hermetic_java_home_impl,
        target = name + "/r",
        config_settings = {
            "//command_line_option:extra_toolchains": [Label(name + "/java_runtime_toolchain")],
        },
        # Bazel 6 doesn't accept Label's for the transition above
        attr_values = {"tags": ["min_bazel_7"]},
    )

def _test_with_hermetic_java_home_impl(env, target):
    assert_info = java_runtime_info_subject.from_target(env, target)

    assert_info.java_home().equals("{package}/foo/bar")
    assert_info.java_home_runfiles_path().equals("{package}/foo/bar")
    assert_info.java_executable_exec_path().starts_with("{package}/foo/bar/bin/java")
    assert_info.java_executable_runfiles_path().starts_with("{package}/foo/bar/bin/java")

def _test_with_generated_java_executable(name):
    util.helper_target(
        native.genrule,
        name = name + "/gen",
        cmd = "",
        outs = ["foo/bar/bin/java"],
        output_to_bindir = True,
    )
    util.helper_target(
        java_runtime,
        name = name + "/jvm",
        srcs = [],
        java = "foo/bar/bin/java",
    )
    util.helper_target(
        java_runtime_alias,
        name = name + "/alias",
    )
    util.helper_target(
        java_runtime_info_forwarding_rule,
        name = name + "/r",
        java_runtime = name + "/alias",
    )
    util.helper_target(
        native.toolchain,
        name = name + "/java_runtime_toolchain",
        toolchain = name + "/jvm",
        toolchain_type = semantics.JAVA_RUNTIME_TOOLCHAIN_TYPE,
    )

    analysis_test(
        name = name,
        impl = _test_with_generated_java_executable_impl,
        target = name + "/r",
        config_settings = {
            "//command_line_option:extra_toolchains": [Label(name + "/java_runtime_toolchain")],
        },
        # Bazel 6 doesn't accept Label's for the transition above
        attr_values = {"tags": ["min_bazel_7"]},
    )

def _test_with_generated_java_executable_impl(env, target):
    assert_info = java_runtime_info_subject.from_target(env, target)

    assert_info.java_home().equals("{bindir}/{package}/foo/bar")
    assert_info.java_home_runfiles_path().equals("{package}/foo/bar")
    assert_info.java_executable_exec_path().starts_with("{bindir}/{package}/foo/bar/bin/java")
    assert_info.java_executable_runfiles_path().starts_with("{package}/foo/bar/bin/java")

def java_runtime_tests(name):
    test_suite(
        name = name,
        tests = [
            _test_with_absolute_java_home,
            _test_with_hermetic_java_home,
            _test_with_generated_java_executable,
        ],
    )
