# Copyright 2020-2026 Google LLC
#
# 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
#
#     https://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.

load("@bazel_skylib//lib:shell.bzl", "shell")
load("@bazel_skylib//rules:build_test.bzl", "build_test")
load("@rules_cc//cc:cc_test.bzl", "cc_test")
load("@rules_go//go:go_test.bzl", "go_test")
load("//elisp:elisp_test.bzl", "elisp_test")
load("//private:cc_config.bzl", "COPTS", "CXXOPTS", "DEFINES", "FEATURES", "LINKOPTS", "RUNFILES_LIBS")
load("//private:package_features.bzl", "PACKAGE_FEATURES")

package(
    default_applicable_licenses = ["//:license"],
    default_testonly = True,
    default_visibility = ["//visibility:private"],
    features = PACKAGE_FEATURES,
)

licenses(["notice"])

cc_test(
    name = "manifest_test",
    size = "small",
    srcs = ["manifest_test.cc"],
    copts = COPTS + CXXOPTS,
    features = FEATURES,
    linkopts = LINKOPTS,
    linkstatic = True,
    local_defines = DEFINES,
    # keep
    deps = [
        "//elisp/private/tools:manifest",
        "//elisp/private/tools:platform",
        "//elisp/private/tools:system",
        "@abseil-cpp//absl/algorithm:container",
        "@abseil-cpp//absl/status:status_matchers",
        "@abseil-cpp//absl/status:statusor",
        "@googletest//:gtest",
        "@googletest//:gtest_main",  # keep
    ],
)

cc_test(
    name = "load_test",
    size = "small",
    srcs = ["load_test.cc"],
    copts = COPTS + CXXOPTS,
    data = ["//elisp/runfiles:runfiles.elc"],
    features = FEATURES,
    linkopts = LINKOPTS,
    linkstatic = True,
    local_defines = DEFINES + [
        # See https://github.com/bazelbuild/bazel/issues/10859 why we need to
        # add additional quoting.
        shell.quote('RULES_ELISP_RUNFILES_ELC=R"*($(rlocationpath //elisp/runfiles:runfiles.elc))*"'),
    ],
    deps = [
        "//elisp/private/tools:load",
        "//elisp/private/tools:platform",
        "//elisp/private/tools:runfiles",
        "//elisp/private/tools:system",
        "@abseil-cpp//absl/algorithm:container",
        "@abseil-cpp//absl/cleanup",
        "@abseil-cpp//absl/status:status_matchers",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings:str_format",
        "@googletest//:gtest",
        "@googletest//:gtest_main",  # keep
    ] + RUNFILES_LIBS,  # keep
)

cc_test(
    name = "numeric_test",
    size = "small",
    srcs = ["numeric_test.cc"],
    copts = COPTS + CXXOPTS,
    features = FEATURES,
    linkopts = LINKOPTS,
    linkstatic = True,
    local_defines = DEFINES,
    # keep
    deps = [
        "//elisp/private/tools:numeric",
        "@googletest//:gtest",
        "@googletest//:gtest_main",  # keep
    ],
)

cc_test(
    name = "strings_test",
    size = "small",
    srcs = ["strings_test.cc"],
    copts = COPTS + CXXOPTS,
    features = FEATURES,
    linkopts = LINKOPTS,
    linkstatic = True,
    local_defines = DEFINES,
    # keep
    deps = [
        "//elisp/private/tools:strings",
        "@abseil-cpp//absl/base:core_headers",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_matchers",
        "@googletest//:gtest",
        "@googletest//:gtest_main",  # keep
    ],
)

cc_test(
    name = "runfiles_test",
    size = "medium",
    timeout = "short",
    srcs = ["runfiles_test.cc"],
    copts = COPTS + CXXOPTS,
    data = ["//tests:empty"],
    features = FEATURES,
    linkopts = LINKOPTS,
    linkstatic = True,
    local_defines = DEFINES + [
        # See https://github.com/bazelbuild/bazel/issues/10859 why we need to
        # add additional quoting.
        shell.quote('RULES_ELISP_PROGRAM=R"*($(rlocationpath //tests:empty))*"'),
    ],
    deps = [
        "//elisp/private/tools:platform",
        "//elisp/private/tools:runfiles",
        "//elisp/private/tools:system",
        "@abseil-cpp//absl/cleanup",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_matchers",
        "@abseil-cpp//absl/status:statusor",
        "@googletest//:gtest",
        "@googletest//:gtest_main",  # keep
    ] + RUNFILES_LIBS,  # keep
)

cc_test(
    name = "system_test",
    size = "medium",
    timeout = "short",
    srcs = ["system_test.cc"],
    copts = COPTS + CXXOPTS,
    data = [
        "BUILD",
        "//tests/tools/helper",
    ],
    features = FEATURES,
    linkopts = LINKOPTS,
    linkstatic = True,
    local_defines = DEFINES + [
        # See https://github.com/bazelbuild/bazel/issues/10859 why we need to
        # add additional quoting.
        shell.quote('RULES_ELISP_DATA=R"*($(rlocationpath :BUILD))*"'),
        shell.quote('RULES_ELISP_HELPER=R"*($(rlocationpath //tests/tools/helper))*"'),
    ],
    deps = [
        "//elisp/private/tools:numeric",
        "//elisp/private/tools:platform",
        "//elisp/private/tools:runfiles",
        "//elisp/private/tools:strings",
        "//elisp/private/tools:system",
        "@abseil-cpp//absl/base:nullability",
        "@abseil-cpp//absl/cleanup",
        "@abseil-cpp//absl/log:check",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:status_matchers",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings",
        "@abseil-cpp//absl/strings:str_format",
        "@abseil-cpp//absl/time",
        "@googletest//:gtest",
        "@googletest//:gtest_main",  # keep
    ] + RUNFILES_LIBS,  # keep
)

build_test(
    name = "launcher_test",
    targets = ["//elisp/private/tools:launcher"],
)

build_test(
    name = "run_tst_build_test",
    targets = ["//elisp/private/tools:run_tst"],
)

build_test(
    name = "compile_test",
    targets = ["//elisp/private/tools:compile"],
)

# keep
elisp_test(
    name = "run_tst_test",
    size = "small",
    srcs = ["run-tst-test.el"],
)

TOOLS_TEST_DATA = ["//elisp/private/tools:copy_tree"]

go_test(
    name = "tools_test",
    size = "medium",
    timeout = "short",
    srcs = ["copy_tree_test.go"],
    args = ["--%s=$(rlocationpath %s)" % (f, f) for f in TOOLS_TEST_DATA],
    data = TOOLS_TEST_DATA,
    deps = [
        "//private/testutil",
        "@com_github_google_go_cmp//cmp",
    ],
)
