# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""Tests for compute_projects.py"""

import unittest

import compute_projects


class TestComputeProjects(unittest.TestCase):
    def test_llvm(self):
        env_variables = compute_projects.get_env_variables(
            ["llvm/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "bolt;clang;clang-tools-extra;flang;lld;lldb;llvm;mlir;polly",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-bolt check-clang check-clang-tools check-flang check-lld check-lldb check-llvm check-mlir check-polly",
        )
        self.assertEqual(
            env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
        )
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "check-cxx check-cxxabi check-unwind",
        )

    def test_llvm_windows(self):
        env_variables = compute_projects.get_env_variables(
            ["llvm/CMakeLists.txt"], "Windows"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "clang;clang-tools-extra;lld;llvm;mlir;polly",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-clang check-clang-tools check-lld check-llvm check-mlir check-polly",
        )
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "",
        )

    def test_llvm_mac(self):
        env_variables = compute_projects.get_env_variables(
            ["llvm/CMakeLists.txt"], "Darwin"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "clang;clang-tools-extra;lld;llvm;mlir",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-clang check-clang-tools check-lld check-llvm check-mlir",
        )
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "",
        )

    def test_clang(self):
        env_variables = compute_projects.get_env_variables(
            ["clang/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "clang;clang-tools-extra;lld;lldb;llvm",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-clang check-clang-tools check-lldb",
        )
        self.assertEqual(
            env_variables["runtimes_to_build"], "compiler-rt;libcxx;libcxxabi;libunwind"
        )
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "check-compiler-rt",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "check-cxx check-cxxabi check-unwind",
        )
        self.assertEqual(
            env_variables["enable_cir"],
            "OFF",
        )

    def test_clang_windows(self):
        env_variables = compute_projects.get_env_variables(
            ["clang/CMakeLists.txt"], "Windows"
        )
        self.assertEqual(
            env_variables["projects_to_build"], "clang;clang-tools-extra;llvm"
        )
        self.assertEqual(
            env_variables["project_check_targets"], "check-clang check-clang-tools"
        )
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "",
        )
        self.assertEqual(env_variables["enable_cir"], "OFF")

    def test_compiler_rt(self):
        env_variables = compute_projects.get_env_variables(
            ["compiler-rt/lib/asan/asan_allocator.cpp"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "clang;lld",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "",
        )
        self.assertEqual(env_variables["runtimes_to_build"], "compiler-rt")
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "check-compiler-rt",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "",
        )
        self.assertEqual(
            env_variables["enable_cir"],
            "OFF",
        )

    def test_cir(self):
        env_variables = compute_projects.get_env_variables(
            ["clang/lib/CIR/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "clang;clang-tools-extra;lld;lldb;llvm;mlir",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-clang check-clang-cir check-clang-tools check-lldb",
        )
        self.assertEqual(
            env_variables["runtimes_to_build"], "compiler-rt;libcxx;libcxxabi;libunwind"
        )
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "check-compiler-rt",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "check-cxx check-cxxabi check-unwind",
        )
        self.assertEqual(env_variables["enable_cir"], "ON")

    def test_bolt(self):
        env_variables = compute_projects.get_env_variables(
            ["bolt/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "bolt;clang;lld;llvm")
        self.assertEqual(env_variables["project_check_targets"], "check-bolt")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_lldb(self):
        env_variables = compute_projects.get_env_variables(
            ["lldb/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "clang;lldb;llvm")
        self.assertEqual(env_variables["project_check_targets"], "check-lldb")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_mlir(self):
        env_variables = compute_projects.get_env_variables(
            ["mlir/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "clang;flang;llvm;mlir")
        self.assertEqual(
            env_variables["project_check_targets"], "check-flang check-mlir"
        )
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
        self.assertEqual(env_variables["enable_cir"], "OFF")

    def test_flang(self):
        env_variables = compute_projects.get_env_variables(
            ["flang/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "clang;flang;llvm")
        self.assertEqual(env_variables["project_check_targets"], "check-flang")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")
        self.assertEqual(env_variables["enable_cir"], "OFF")

    def test_invalid_subproject(self):
        env_variables = compute_projects.get_env_variables(
            ["llvm-libgcc/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "")
        self.assertEqual(env_variables["project_check_targets"], "")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_top_level_file(self):
        env_variables = compute_projects.get_env_variables(["README.md"], "Linux")
        self.assertEqual(env_variables["projects_to_build"], "")
        self.assertEqual(env_variables["project_check_targets"], "")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_exclude_libcxx_in_projects(self):
        env_variables = compute_projects.get_env_variables(
            ["libcxx/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "")
        self.assertEqual(env_variables["project_check_targets"], "")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_include_libc_in_runtimes(self):
        env_variables = compute_projects.get_env_variables(
            ["libc/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "clang;lld")
        self.assertEqual(env_variables["project_check_targets"], "")
        self.assertEqual(env_variables["runtimes_to_build"], "libc")
        self.assertEqual(env_variables["runtimes_check_targets"], "check-libc")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_exclude_docs(self):
        env_variables = compute_projects.get_env_variables(
            ["llvm/docs/CIBestPractices.rst"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "")
        self.assertEqual(env_variables["project_check_targets"], "")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_exclude_gn(self):
        env_variables = compute_projects.get_env_variables(
            ["llvm/utils/gn/build/BUILD.gn"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "")
        self.assertEqual(env_variables["project_check_targets"], "")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_ci(self):
        env_variables = compute_projects.get_env_variables(
            [".ci/compute_projects.py"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "bolt;clang;clang-tools-extra;flang;libclc;lld;lldb;llvm;mlir;polly",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-bolt check-clang check-clang-cir check-clang-tools check-flang check-lld check-lldb check-llvm check-mlir check-polly",
        )
        self.assertEqual(
            env_variables["runtimes_to_build"],
            "compiler-rt;libc;libcxx;libcxxabi;libunwind",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "check-compiler-rt check-libc",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "check-cxx check-cxxabi check-unwind",
        )

    def test_windows_ci(self):
        env_variables = compute_projects.get_env_variables(
            [".ci/compute_projects.py"], "Windows"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "clang;clang-tools-extra;libclc;lld;llvm;mlir;polly",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-clang check-clang-cir check-clang-tools check-lld check-llvm check-mlir check-polly",
        )
        self.assertEqual(
            env_variables["runtimes_to_build"],
            "",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "",
        )

    def test_lldb(self):
        env_variables = compute_projects.get_env_variables(
            ["lldb/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "clang;lldb;llvm")
        self.assertEqual(env_variables["project_check_targets"], "check-lldb")
        self.assertEqual(
            env_variables["runtimes_to_build"], "libcxx;libcxxabi;libunwind"
        )
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_clang_tools_extra(self):
        env_variables = compute_projects.get_env_variables(
            ["clang-tools-extra/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"], "clang;clang-tools-extra;lld;llvm"
        )
        self.assertEqual(env_variables["project_check_targets"], "check-clang-tools")
        self.assertEqual(env_variables["runtimes_to_build"], "libc")
        self.assertEqual(env_variables["runtimes_check_targets"], "check-libc")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_premerge_workflow(self):
        env_variables = compute_projects.get_env_variables(
            [".github/workflows/premerge.yaml"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "bolt;clang;clang-tools-extra;flang;libclc;lld;lldb;llvm;mlir;polly",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-bolt check-clang check-clang-cir check-clang-tools check-flang check-lld check-lldb check-llvm check-mlir check-polly",
        )
        self.assertEqual(
            env_variables["runtimes_to_build"],
            "compiler-rt;libc;libcxx;libcxxabi;libunwind",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "check-compiler-rt check-libc",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "check-cxx check-cxxabi check-unwind",
        )

    def test_other_github_workflow(self):
        env_variables = compute_projects.get_env_variables(
            [".github/workflows/docs.yml"], "Linux"
        )
        self.assertEqual(env_variables["projects_to_build"], "")
        self.assertEqual(env_variables["project_check_targets"], "")
        self.assertEqual(env_variables["runtimes_to_build"], "")
        self.assertEqual(env_variables["runtimes_check_targets"], "")
        self.assertEqual(env_variables["runtimes_check_targets_needs_reconfig"], "")

    def test_third_party_benchmark(self):
        env_variables = compute_projects.get_env_variables(
            ["third-party/benchmark/CMakeLists.txt"], "Linux"
        )
        self.assertEqual(
            env_variables["projects_to_build"],
            "bolt;clang;clang-tools-extra;flang;libclc;lld;lldb;llvm;mlir;polly",
        )
        self.assertEqual(
            env_variables["project_check_targets"],
            "check-bolt check-clang check-clang-cir check-clang-tools check-flang check-lld check-lldb check-llvm check-mlir check-polly",
        )
        self.assertEqual(
            env_variables["runtimes_to_build"],
            "compiler-rt;libc;libcxx;libcxxabi;libunwind",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets"],
            "check-compiler-rt check-libc",
        )
        self.assertEqual(
            env_variables["runtimes_check_targets_needs_reconfig"],
            "check-cxx check-cxxabi check-unwind",
        )


if __name__ == "__main__":
    unittest.main()
