"""Starlark definitions for Protobuf conformance tests.

PLEASE DO NOT DEPEND ON THE CONTENTS OF THIS FILE, IT IS UNSTABLE.
"""

def conformance_test(
        name,
        testee,
        failure_list = None,
        text_format_failure_list = None,
        maximum_edition = None,
        **kwargs):
    """Conformance test runner.

    Args:
      name: the name for the test.
      testee: a conformance test client binary.
      failure_list: a text file with known failures, one per line.
      text_format_failure_list: a text file with known failures (one per line)
          for the text format conformance suite.
      **kwargs: common arguments to pass to sh_test.
    """
    args = ["--testee %s" % _strip_bazel(testee)]
    failure_lists = []
    if failure_list:
        args = args + ["--failure_list %s" % _strip_bazel(failure_list)]
        failure_lists = failure_lists + [failure_list]
    if text_format_failure_list:
        args = args + ["--text_format_failure_list %s" % _strip_bazel(text_format_failure_list)]
        failure_lists = failure_lists + [text_format_failure_list]
    if maximum_edition:
        args = args + ["--maximum_edition %s" % maximum_edition]

    native.sh_test(
        name = name,
        srcs = ["//conformance:bazel_conformance_test_runner.sh"],
        data = [testee] + failure_lists + [
            "//conformance:conformance_test_runner",
        ],
        args = args,
        deps = [
            "@bazel_tools//tools/bash/runfiles",
        ],
        tags = ["conformance"],
        **kwargs
    )

def _strip_bazel(testee):
    if testee.startswith("//"):
        testee = testee.replace("//", "com_google_protobuf/")
    return testee.replace(":", "/")
