# Copyright 2019 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Convenience macro for stardoc e2e tests."""

load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("//stardoc:html_tables_stardoc.bzl", "html_tables_stardoc")
load("//stardoc:stardoc.bzl", "stardoc")

def stardoc_test(
        name,
        input_file,
        golden_file,
        deps = [],
        test = "default",
        **kwargs):
    """Convenience macro for stardoc e2e test suites.

    Each invocation creates four targets:

    1. A sh_test target which verifies that stardoc-built-from-source, when run on an input file,
       creates output matching the contents of a golden file, named "{name}_e2e_test".
    2. A `stardoc` target which will generate a new golden file given an input file
       with stardoc-built-from-source. This target should be used to regenerate
       the golden file when updating stardoc, named "regenerate_{name}_golden".
    3 & 4. Targets identical to (1) and (2) except they use the prebuilt-stardoc jar, and
       are named "{name}_e2e_jar_test" and "regenerate_with_jar_{name}_golden".
    5. A bzl_library target for convenient wrapping of input bzl files, named "{name}_lib".

    Args:
      name: A unique name to qualify the created targets.
      input_file: The label string of the Starlark input file for which documentation is generated
          in this test.
      golden_file: The label string of the golden file containing the documentation when stardoc
          is run on the input file.
      deps: A list of label strings of starlark file dependencies of the input_file.
      test: The type of test (default or html_tables).
      **kwargs: A dictionary of input template names mapped to template file path for which documentation is generated.
      """

    bzl_library(
        name = "%s_lib" % name,
        srcs = [input_file],
        deps = deps,
    )
    _create_test_targets(
        test_name = "%s_e2e_test" % name,
        genrule_name = "regenerate_%s_golden" % name,
        lib_name = "%s_lib" % name,
        input_file = input_file,
        golden_file = golden_file,
        stardoc_bin = "@io_bazel//src/main/java/com/google/devtools/build/skydoc",
        renderer_bin = "@io_bazel//src/main/java/com/google/devtools/build/skydoc/renderer",
        test = test,
        **kwargs
    )
    _create_test_targets(
        test_name = "%s_e2e_jar_test" % name,
        genrule_name = "regenerate_with_jar_%s_golden" % name,
        lib_name = "%s_lib" % name,
        input_file = input_file,
        golden_file = golden_file,
        stardoc_bin = "@io_bazel//src/main/java/com/google/devtools/build/skydoc",
        renderer_bin = "@io_bazel//src/main/java/com/google/devtools/build/skydoc/renderer",
        test = test,
        **kwargs
    )

def _create_test_targets(
        test_name,
        genrule_name,
        lib_name,
        input_file,
        golden_file,
        stardoc_bin,
        renderer_bin,
        test,
        **kwargs):
    actual_generated_doc = "%s.out" % genrule_name

    native.sh_test(
        name = test_name,
        srcs = ["diff_test_runner.sh"],
        args = [
            "$(location %s)" % actual_generated_doc,
            "$(location %s)" % golden_file,
        ],
        data = [
            actual_generated_doc,
            golden_file,
        ],
    )

    if test == "default":
        stardoc(
            name = genrule_name,
            out = actual_generated_doc,
            input = input_file,
            deps = [lib_name],
            renderer = renderer_bin,
            stardoc = stardoc_bin,
            **kwargs
        )
    elif test == "html_tables":
        html_tables_stardoc(
            name = genrule_name,
            out = actual_generated_doc,
            input = input_file,
            deps = [lib_name],
            renderer = renderer_bin,
            stardoc = stardoc_bin,
            **kwargs
        )
    else:
        fail("parameter 'test' must either be 'default' or 'html_tables', but was " + test)
