"""Tests for the JavaPluginInfo provider"""

load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
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("//test/java/testutil:java_info_subject.bzl", "java_plugin_info_subject")
load("//test/java/testutil:rules/custom_plugin.bzl", "custom_plugin")

def _test_exposes_java_outputs(name):
    util.helper_target(
        java_library,
        name = name + "/lib",
        srcs = ["Lib.java"],
    )
    util.helper_target(
        java_plugin,
        name = name + "/dep",
        srcs = ["Dep.java"],
        deps = [name + "/lib"],
    )

    analysis_test(
        name = name,
        impl = _test_exposes_java_outputs_impl,
        target = name + "/dep",
    )

def _test_exposes_java_outputs_impl(env, target):
    assert_output = java_plugin_info_subject.from_target(env, target).java_outputs().singleton()

    assert_output.class_jar().short_path_equals("{package}/lib{name}.jar")
    assert_output.compile_jar().short_path_equals("{package}/lib{name}-hjar.jar")
    assert_output.source_jars().contains_exactly(["{package}/lib{name}-src.jar"])
    assert_output.jdeps().short_path_equals("{package}/lib{name}.jdeps")
    assert_output.compile_jdeps().short_path_equals("{package}/lib{name}-hjar.jdeps")

def _test_provider_contstructor(name):
    target_name = name + "/plugin"
    util.helper_target(
        java_library,
        name = target_name + "/plugin_dep1",
        srcs = ["A.java"],
        data = ["depfile1.dat"],
    )
    util.helper_target(
        custom_plugin,
        name = target_name,
        data = ["pluginfile1.dat"],
        processor_class = "com.google.process.stuff",
        deps = [target_name + "/plugin_dep1"],
    )

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

def _test_provider_contstructor_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}/{name}/lib.jar",
        "{package}/lib{name}/plugin_dep1.jar",
    ])
    assert_plugin_data.processor_data().contains_exactly(["{package}/pluginfile1.dat"])

    assert_api_plugin_data = java_plugin_info_subject.from_target(env, target).api_generating_plugins()
    assert_api_plugin_data.processor_classes().contains_exactly([])
    assert_api_plugin_data.processor_jars().contains_exactly([])
    assert_api_plugin_data.processor_data().contains_exactly([])

def _test_api_generating_provider_constructor(name):
    target_name = name + "/plugin"
    util.helper_target(
        java_library,
        name = target_name + "/plugin_dep1",
        srcs = ["A.java"],
        data = ["depfile1.dat"],
    )
    util.helper_target(
        custom_plugin,
        name = target_name,
        data = ["pluginfile1.dat"],
        processor_class = "com.google.process.stuff",
        deps = [target_name + "/plugin_dep1"],
        generates_api = True,
    )

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

def _test_api_generating_provider_constructor_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}/{name}/lib.jar",
        "{package}/lib{name}/plugin_dep1.jar",
    ])
    assert_api_plugin_data.processor_data().contains_exactly(["{package}/pluginfile1.dat"])
    assert_api_plugin_data.equals(target[JavaPluginInfo].plugins)

def _test_without_processor_class(name):
    target_name = name + "/plugin"
    util.helper_target(
        java_library,
        name = target_name + "/plugin_dep1",
        srcs = ["A.java"],
        data = ["depfile1.dat"],
    )
    util.helper_target(
        custom_plugin,
        name = target_name,
        processor_class = None,
        data = ["pluginfile1.dat"],
        deps = [target_name + "/plugin_dep1"],
    )
    analysis_test(
        name = name,
        impl = _test_without_processor_class_impl,
        target = target_name,
        attr_values = {"tags": ["min_bazel_7"]},
    )

def _test_without_processor_class_impl(env, target):
    assert_plugin_data = java_plugin_info_subject.from_target(env, target).plugins()
    assert_plugin_data.processor_classes().contains_exactly([])
    assert_plugin_data.processor_jars().contains_exactly([
        "{package}/{name}/lib.jar",
        "{package}/lib{name}/plugin_dep1.jar",
    ])
    assert_plugin_data.processor_data().contains_exactly(["{package}/pluginfile1.dat"])

    assert_api_plugin_data = java_plugin_info_subject.from_target(env, target).api_generating_plugins()
    assert_api_plugin_data.processor_classes().contains_exactly([])
    assert_api_plugin_data.processor_jars().contains_exactly([])
    assert_api_plugin_data.processor_data().contains_exactly([])

def _test_constructor_with_data_depset(name):
    target_name = name + "/plugin"
    util.helper_target(
        java_library,
        name = target_name + "/plugin_dep1",
        srcs = ["A.java"],
        data = ["depfile1.dat"],
    )
    util.helper_target(
        custom_plugin,
        name = target_name,
        processor_class = "com.google.process.stuff",
        data = ["pluginfile1.dat"],
        deps = [target_name + "/plugin_dep1"],
        data_as_depset = True,
    )

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

def _test_constructor_with_data_depset_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}/{name}/lib.jar",
        "{package}/lib{name}/plugin_dep1.jar",
    ])
    assert_plugin_data.processor_data().contains_exactly(["{package}/pluginfile1.dat"])

    assert_api_plugin_data = java_plugin_info_subject.from_target(env, target).api_generating_plugins()
    assert_api_plugin_data.processor_classes().contains_exactly([])
    assert_api_plugin_data.processor_jars().contains_exactly([])
    assert_api_plugin_data.processor_data().contains_exactly([])

def java_plugin_info_tests(name):
    test_suite(
        name = name,
        tests = [
            _test_exposes_java_outputs,
            _test_provider_contstructor,
            _test_api_generating_provider_constructor,
            _test_without_processor_class,
            _test_constructor_with_data_depset,
        ],
    )
