# -*- mode:python; -*-
#
# Copyright 2016 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.

"""Generate java test rules from given test_files.
Instead of having to create one test rule per test in the BUILD file, this rule
provides a handy way to create a bunch of test rules for the specified test
files.
"""

def testIsExcluded(exclude_tests, test):
    for excluded_test in exclude_tests:
        normalized_excluded_test = excluded_test.replace(".", "/")
        if test.endswith(normalized_excluded_test):
            return True
    return False

def generate_test_rules(
        name,
        test_files,
        deps,
        exclude_tests = [],
        default_test_size = "small",
        small_tests = [],
        medium_tests = [],
        large_tests = [],
        enormous_tests = [],
        resources = [],
        flaky_tests = [],
        tags = [],
        prefix = "",
        jvm_flags = ["-XX:MaxPermSize=128m"],
        args = [],
        visibility = None,
        shard_count = 1):
    for test in _get_test_names(test_files):
        if testIsExcluded(exclude_tests, test):
            continue
        test_size = default_test_size
        if test in small_tests:
            test_size = "small"
        if test in medium_tests:
            test_size = "medium"
        if test in large_tests:
            test_size = "large"
        if test in enormous_tests:
            test_size = "enormous"
        flaky = 0
        if (test in flaky_tests) or ("flaky" in tags):
            flaky = 1
        java_class = _package_from_path(
            PACKAGE_NAME + "/" + _strip_right(test, ".java"),
        )
        package = java_class[:java_class.rfind(".")]
        native.java_test(
            name = prefix + test,
            runtime_deps = deps,
            resources = resources,
            size = test_size,
            jvm_flags = jvm_flags,
            args = args,
            flaky = flaky,
            tags = tags,
            test_class = java_class,
            visibility = visibility,
            shard_count = shard_count,
        )

def _get_test_names(test_files):
    test_names = []
    for test_file in test_files:
        if not test_file.endswith("Test.java"):
            continue
        test_names += [test_file[:-5]]
    return test_names

def _package_from_path(package_path, src_impls = None):
    src_impls = src_impls or ["javatests/", "java/"]
    for src_impl in src_impls:
        if not src_impl.endswith("/"):
            src_impl += "/"
        index = _index_of_end(package_path, src_impl)
        if index >= 0:
            package_path = package_path[index:]
            break
    return package_path.replace("/", ".")

def _strip_right(str, suffix):
    """Returns str without the suffix if it ends with suffix."""
    if str.endswith(suffix):
        return str[0:len(str) - len(suffix)]
    else:
        return str

def _index_of_end(str, part):
    """If part is in str, return the index of the first character after part.
    Return -1 if part is not in str."""
    index = str.find(part)
    if index >= 0:
        return index + len(part)
    return -1
