"""Tests for the java_plugin rule"""

load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
load("@rules_testing//lib:truth.bzl", "subjects")
load("@rules_testing//lib:util.bzl", "util")
load("//java:java_library.bzl", "java_library")
load("//java:java_plugin.bzl", "java_plugin")
load("//java/common:java_plugin_info.bzl", "JavaPluginInfo")
load("//java/common:proguard_spec_info.bzl", "ProguardSpecInfo")
load("//test/java/testutil:java_info_subject.bzl", "java_plugin_info_subject")

def _test_exposes_plugins_to_starlark(name):
    target_name = name + "/plugin"
    util.helper_target(
        java_library,
        name = target_name + "/plugin_dep",
        srcs = ["ProcessorDep.java"],
        data = ["depfile.dat"],
    )
    util.helper_target(
        java_plugin,
        name = target_name,
        srcs = ["AnnotationProcessor.java"],
        data = ["pluginfile.dat"],
        processor_class = "com.google.process.stuff",
        deps = [target_name + "/plugin_dep"],
    )

    analysis_test(
        name = name,
        impl = _test_exposes_plugins_to_starlark_impl,
        target = target_name,
    )

def _test_exposes_plugins_to_starlark_impl(env, target):
    assert_plugin_data = java_plugin_info_subject.from_target(env, target).plugins()
    assert_plugin_data.processor_classes().contains_exactly(["com.google.process.stuff"])
    assert_plugin_data.processor_jars().contains_exactly([
        "{package}/lib{name}.jar",
        "{package}/lib{name}/plugin_dep.jar",
    ])
    assert_plugin_data.processor_data().contains_exactly(["{package}/pluginfile.dat"])

    java_plugin_info_subject.from_target(env, target).api_generating_plugins().is_empty()

def _test_exposes_api_generating_plugins_to_starlark(name):
    target_name = name + "/plugin"
    util.helper_target(
        java_library,
        name = target_name + "/plugin_dep",
        srcs = ["ProcessorDep.java"],
        data = ["depfile.dat"],
    )
    util.helper_target(
        java_plugin,
        name = target_name,
        srcs = ["AnnotationProcessor.java"],
        data = ["pluginfile.dat"],
        processor_class = "com.google.process.stuff",
        deps = [target_name + "/plugin_dep"],
        generates_api = True,
    )

    analysis_test(
        name = name,
        impl = _test_exposes_api_generating_plugins_to_starlark_impl,
        target = target_name,
    )

def _test_exposes_api_generating_plugins_to_starlark_impl(env, target):
    assert_api_plugin_data = java_plugin_info_subject.from_target(env, target).api_generating_plugins()
    assert_api_plugin_data.processor_classes().contains_exactly(["com.google.process.stuff"])
    assert_api_plugin_data.processor_jars().contains_exactly([
        "{package}/lib{name}.jar",
        "{package}/lib{name}/plugin_dep.jar",
    ])
    assert_api_plugin_data.processor_data().contains_exactly(["{package}/pluginfile.dat"])
    assert_api_plugin_data.equals(target[JavaPluginInfo].plugins)

def _test_not_empty_processor_class(name):
    util.helper_target(
        java_library,
        name = name + "/deps",
        srcs = ["Deps.java"],
    )
    util.helper_target(
        java_plugin,
        name = name + "/processor",
        srcs = ["Processor.java"],
        processor_class = "com.google.test.Processor",
        deps = [name + "/deps"],
    )

    analysis_test(
        name = name,
        impl = _test_not_empty_processor_class_impl,
        target = name + "/processor",
    )

def _test_not_empty_processor_class_impl(env, target):
    plugin_info = java_plugin_info_subject.from_target(env, target)
    plugin_info.plugins().processor_classes().contains_exactly(["com.google.test.Processor"])

    plugin_info.plugins().processor_jars().contains_exactly([
        "{package}/lib{name}.jar",
        "{package}/lib{test_name}/deps.jar",
    ])

def _test_empty_processor_class(name):
    util.helper_target(
        java_library,
        name = name + "/deps",
        srcs = ["Deps.java"],
    )
    util.helper_target(
        java_plugin,
        name = name + "/bugchecker",
        srcs = ["BugChecker.java"],
        deps = [":" + name + "/deps"],
    )

    analysis_test(
        name = name,
        impl = _test_empty_processor_class_impl,
        target = name + "/bugchecker",
    )

def _test_empty_processor_class_impl(env, target):
    plugin_info = java_plugin_info_subject.from_target(env, target)
    plugin_info.plugins().processor_classes().contains_exactly([])
    plugin_info.plugins().processor_jars().contains_exactly([
        "{package}/lib{name}.jar",
        "{package}/lib{test_name}/deps.jar",
    ])

def _test_empty_processor_class_target(name):
    util.helper_target(
        java_library,
        name = name + "/deps",
        srcs = ["Deps.java"],
    )
    util.helper_target(
        java_plugin,
        name = name + "/bugchecker",
        srcs = ["BugChecker.java"],
        deps = [":" + name + "/deps"],
    )
    util.helper_target(
        java_library,
        name = name + "/empty",
        plugins = [":" + name + "/bugchecker"],
    )

    analysis_test(
        name = name,
        impl = _test_empty_processor_class_target_impl,
        target = name + "/empty",
    )

def _test_empty_processor_class_target_impl(env, target):
    env.expect.that_target(target).action_generating("{package}/lib{name}.jar").inputs().contains_at_least([
        "{package}/lib{test_name}/bugchecker.jar",
        "{package}/lib{test_name}/deps.jar",
    ])

def _new_proguard_info_subject(info, meta):
    return struct(
        specs = lambda: subjects.depset_file(info.specs, meta.derive("specs")),
    )

def _test_java_plugin_exports_transitive_proguard_specs(name):
    util.helper_target(
        java_plugin,
        name = name + "/plugin",
        srcs = ["Plugin.java"],
        proguard_specs = ["plugin.pro"],
    )
    util.helper_target(
        java_library,
        name = name + "/dep",
        srcs = ["Dep.java"],
        proguard_specs = ["dep.pro"],
    )
    util.helper_target(
        java_plugin,
        name = name + "/top",
        srcs = ["Top.java"],
        plugins = [":" + name + "/plugin"],
        proguard_specs = ["top.pro"],
        deps = [":" + name + "/dep"],
    )

    analysis_test(
        name = name,
        impl = _test_java_plugin_exports_transitive_proguard_specs_impl,
        target = name + "/top",
        provider_subject_factories = [struct(
            type = ProguardSpecInfo,
            name = "ProguardInfo",
            factory = _new_proguard_info_subject,
        )],
    )

def _test_java_plugin_exports_transitive_proguard_specs_impl(env, target):
    env.expect.that_target(target).provider(ProguardSpecInfo).specs().contains_exactly(
        [
            "{package}/validated_proguard/{test_name}/top/{package}/top.pro_valid",
            "{package}/validated_proguard/{test_name}/dep/{package}/dep.pro_valid",
        ],
    )

def _test_java_plugin_validates_proguard_specs(name):
    util.helper_target(
        java_plugin,
        name = name + "/plugin",
        srcs = ["Plugin.java"],
        proguard_specs = ["plugin.pro"],
    )

    analysis_test(
        name = name,
        impl = _test_java_plugin_validates_proguard_specs_impl,
        target = name + "/plugin",
    )

def _test_java_plugin_validates_proguard_specs_impl(env, target):
    output_file = None
    for f in target.output_groups["_hidden_top_level_INTERNAL_"].to_list():
        if f.basename == "plugin.pro_valid":
            output_file = f
            break
    env.expect.that_target(target).action_generating(
        output_file.short_path,
    ).inputs().contains_at_least(
        ["{package}/plugin.pro"],
    )

def _test_java_plugin_validates_transitive_proguard_specs(name):
    util.helper_target(
        java_library,
        name = name + "/transitive",
        srcs = ["Transitive.java"],
        proguard_specs = ["transitive.pro"],
    )
    util.helper_target(
        java_plugin,
        name = name + "/plugin",
        srcs = ["Plugin.java"],
        deps = [":" + name + "/transitive"],
    )

    analysis_test(
        name = name,
        impl = _test_java_plugin_validates_transitive_proguard_specs_impl,
        targets = {
            "transitive": name + "/transitive",
            "plugin": name + "/plugin",
        },
    )

def _test_java_plugin_validates_transitive_proguard_specs_impl(env, targets):
    output_file = None
    for f in targets.plugin.output_groups["_hidden_top_level_INTERNAL_"].to_list():
        if f.basename == "transitive.pro_valid":
            output_file = f
            break

    env.expect.that_target(targets.transitive).action_generating(
        output_file.short_path,
    ).inputs().contains_at_least(["{package}/transitive.pro"])

def _test_generates_api(name):
    util.helper_target(
        java_plugin,
        name = name + "/api_generating",
        srcs = ["ApiGeneratingPlugin.java"],
        generates_api = True,
        processor_class = "ApiGeneratingPlugin",
    )

    analysis_test(
        name = name,
        impl = _test_generates_api_impl,
        target = name + "/api_generating",
    )

def _test_generates_api_impl(env, target):
    plugin_info = java_plugin_info_subject.from_target(env, target)
    plugin_info.plugins().processor_classes().contains_exactly(["ApiGeneratingPlugin"])
    plugin_info.api_generating_plugins().processor_classes().contains_exactly(["ApiGeneratingPlugin"])
    plugin_info.plugins().processor_jars().contains_exactly([
        "{package}/lib{name}.jar",
    ])
    plugin_info.api_generating_plugins().processor_jars().contains_exactly([
        "{package}/lib{name}.jar",
    ])

def _test_generates_implementation(name):
    util.helper_target(
        java_plugin,
        name = name + "/impl_generating",
        srcs = ["ImplGeneratingPlugin.java"],
        generates_api = False,
        processor_class = "ImplGeneratingPlugin",
    )

    analysis_test(
        name = name,
        impl = _test_generates_implementation_impl,
        target = name + "/impl_generating",
    )

def _test_generates_implementation_impl(env, target):
    plugin_info = java_plugin_info_subject.from_target(env, target)
    plugin_info.plugins().processor_classes().contains_exactly(["ImplGeneratingPlugin"])
    plugin_info.api_generating_plugins().processor_classes().contains_exactly([])
    plugin_info.plugins().processor_jars().contains_exactly([
        "{package}/lib{test_name}/impl_generating.jar",
    ])
    plugin_info.api_generating_plugins().processor_jars().contains_exactly([])

def _test_plugin_data_in_provider(name):
    util.helper_target(
        java_plugin,
        name = name + "/impl_generating",
        srcs = ["ImplGeneratingPlugin.java"],
        data = ["data.txt"],
        generates_api = False,
        processor_class = "ImplGeneratingPlugin",
    )

    analysis_test(
        name = name,
        impl = _test_plugin_data_in_provider_impl,
        target = name + "/impl_generating",
    )

def _test_plugin_data_in_provider_impl(env, target):
    plugin_info = java_plugin_info_subject.from_target(env, target)
    plugin_info.plugins().processor_data().contains_exactly([
        "{package}/data.txt",
    ])

def _test_plugin_data_in_action_inputs(name):
    util.helper_target(
        java_plugin,
        name = name + "/impl_generating_lib",
        srcs = ["ImplGeneratingPlugin.java"],
        data = ["data.txt"],
        generates_api = False,
        processor_class = "ImplGeneratingPlugin",
    )
    util.helper_target(
        java_library,
        name = name + "/lib",
        plugins = [":" + name + "/impl_generating_lib"],
    )

    analysis_test(
        name = name,
        impl = _test_plugin_data_in_action_inputs_impl,
        target = name + "/lib",
    )

def _test_plugin_data_in_action_inputs_impl(env, target):
    env.expect.that_target(target).action_generating("{package}/lib{name}.jar").inputs().contains_at_least([
        "{package}/data.txt",
    ])

def java_plugin_tests(name):
    test_suite(
        name = name,
        tests = [
            _test_exposes_plugins_to_starlark,
            _test_exposes_api_generating_plugins_to_starlark,
            _test_not_empty_processor_class,
            _test_empty_processor_class,
            _test_empty_processor_class_target,
            _test_generates_api,
            _test_plugin_data_in_provider,
            _test_plugin_data_in_action_inputs,
            _test_java_plugin_exports_transitive_proguard_specs,
            _test_java_plugin_validates_proguard_specs,
            _test_java_plugin_validates_transitive_proguard_specs,
            _test_generates_implementation,
        ],
    )
