#!/usr/bin/env fuchsia-vendored-python
# Copyright 2024 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import unittest
import sys
from pathlib import Path

sys.path.insert(0, Path(__file__).parent)
from gn_labels import split_gn_label, qualify_gn_target_name, GnLabelQualifier


class GnLabelsTest(unittest.TestCase):
    def test_split_gn_label(self):
        _INVALID_CASES = [
            # Does not start with //
            "foo/bar",
            # Extra junk after toolchain suffix
            "//foo(//toolchain)extrajunk",
            # No closing paren for toolchain suffix
            "//foo(//toolchain",
            # Missing open paren
            "//foo//toolchain"
            # Malformed content inside paren
            "//foo(toolchain//)",
        ]

        for label in _INVALID_CASES:
            with self.assertRaises(AssertionError):
                split_gn_label(label)

        _TEST_CASES = {
            "//foo": ("//foo", ""),
            "//:foo": ("//:foo", ""),
            "//foo/bar": ("//foo/bar", ""),
            "//foo/bar:bar": ("//foo/bar:bar", ""),
            "//foo(//toolchain)": ("//foo", "//toolchain"),
            "//foo(//build/toolchain/fuchsia:y64)": (
                "//foo",
                "//build/toolchain/fuchsia:y64",
            ),
        }

        for label, target_toolchain in _TEST_CASES.items():
            self.assertEqual(
                target_toolchain,
                split_gn_label(label),
                f"When splitting [{label}]",
            )

    def test_qualify_gn_target_name(self):
        _INVALID_CASES = [
            # Does not start with //
            "foo/bar",
        ]
        for label in _INVALID_CASES:
            with self.assertRaises(AssertionError):
                qualify_gn_target_name(label)

        _TEST_CASES = {
            "//foo": "//foo:foo",
            "//foo:foo": "//foo:foo",
            "//:foo": "//:foo",
            "//foo/bar": "//foo/bar:bar",
        }
        for label, expected in _TEST_CASES.items():
            self.assertEqual(
                expected,
                qualify_gn_target_name(label),
                f"When qualifying [{label}]",
            )

    def test_GnLabelQualifier_qualify_toolchain(self):
        qualifier = GnLabelQualifier("y64", "aRm64")

        _TOOLCHAIN_TEST_CASES = {
            "//toolchain": "//toolchain:toolchain",
            "//toolchain:name": "//toolchain:name",
            "//toolchain/name": "//toolchain/name:name",
            "host": "//build/toolchain:host_y64",
            "default": "//build/toolchain/fuchsia:aRm64",
            "fuchsia": "//build/toolchain/fuchsia:aRm64",
            "fidl": "//build/fidl:fidling",
            "toolchain": "ERROR",
        }
        for toolchain, expected in _TOOLCHAIN_TEST_CASES.items():
            msg = f"When qualifying {toolchain}"
            if expected == "ERROR":
                with self.assertRaises(AssertionError, msg=msg):
                    qualifier.qualify_toolchain(toolchain)
            else:
                self.assertEqual(
                    expected, qualifier.qualify_toolchain(toolchain), msg=msg
                )

    def test_GnLabelQualifier_qualify_label(self):
        qualifier = GnLabelQualifier("y64", "aRm64")

        _LABEL_TEST_CASES = {
            "//foo": "//foo:foo",
            "//foo(default)": "//foo:foo",
            "//foo(//build/toolchain/fuchsia:aRm64)": "//foo:foo",
            "//foo(host)": "//foo:foo(//build/toolchain:host_y64)",
            "//foo(//build/toolchain/fuchsia:y64)": "//foo:foo(//build/toolchain/fuchsia:y64)",
            "//foo(fidl)": "//foo:foo(//build/fidl:fidling)",
            "//foo/bar": "//foo/bar:bar",
            "//foo/bar:zoo": "//foo/bar:zoo",
            "//foo/bar(default)": "//foo/bar:bar",
            "//foo/bar:zoo(default)": "//foo/bar:zoo",
            "//foo/bar(fuchsia)": "//foo/bar:bar",
            "//foo/bar:zoo(fuchsia)": "//foo/bar:zoo",
            "//foo/bar(//build/toolchain/fuchsia:aRm64)": "//foo/bar:bar",
            "//foo/bar:zoo(//build/toolchain/fuchsia:aRm64)": "//foo/bar:zoo",
            "//foo/bar(//build/toolchain/fuchsia:y64)": "//foo/bar:bar(//build/toolchain/fuchsia:y64)",
            "//foo/bar:zoo(//build/toolchain/fuchsia:y64)": "//foo/bar:zoo(//build/toolchain/fuchsia:y64)",
        }
        for label, expected in _LABEL_TEST_CASES.items():
            msg = f"When qualifying {label}"
            if expected == "ERROR":
                with self.assertRaises(AssertionError, msg=msg):
                    qualifier.qualify_label(label)
            else:
                self.assertEqual(
                    expected, qualifier.qualify_label(label), msg=msg
                )

    def test_GnLabelQualifier_label_to_build_args(self):
        qualifier = GnLabelQualifier("y64", "aRm64")
        qualifier.set_ninja_path_to_gn_label(lambda x: f"NINJA_PATH<{x}>")

        _TEST_CASES = {
            "//foo": ["//foo"],
            "//foo:foo": ["//foo"],
            "//foo:bar": ["//foo:bar"],
            "//foo(//build/toolchain:host_y64)": ["--host", "//foo"],
            "//foo:foo(//build/toolchain/fuchsia:aRm64)": ["//foo"],
            "//foo/bar:bar(//build/toolchain/fuchsia:riscv64)": [
                "--toolchain=//build/toolchain/fuchsia:riscv64",
                "//foo/bar",
            ],
            "//foo/bar:bar(//build/fidl:fidling)": ["--fidl", "//foo/bar"],
            "foo": ["ERROR"],
        }
        for label, expected in _TEST_CASES.items():
            msg = f"When parsing {label}"
            if expected == ["ERROR"]:
                with self.assertRaises(AssertionError, msg=msg):
                    qualifier.label_to_build_args(label)
            else:
                self.assertListEqual(
                    expected, qualifier.label_to_build_args(label), msg=msg
                )

    def test_GnLabelQualifier_build_args_to_labels(self):
        qualifier = GnLabelQualifier("y64", "aRm64")
        qualifier.set_ninja_path_to_gn_label(lambda x: f"NINJA_PATH<{x}>")

        _TEST_CASES = [
            (
                ["//foo"],
                ["//foo:foo"],
            ),
            (
                ["//foo(host)"],
                ["//foo:foo(//build/toolchain:host_y64)"],
            ),
            (
                ["--host", "//foo"],
                ["//foo:foo(//build/toolchain:host_y64)"],
            ),
            (
                [
                    "//foo",
                    "--host",
                    "//foo:bar",
                    "--toolchain=fidl",
                    "//fidl:zoo",
                ],
                [
                    "//foo:foo",
                    "//foo:bar(//build/toolchain:host_y64)",
                    "//fidl:zoo(//build/fidl:fidling)",
                ],
            ),
            (
                ["--toolchain=host", "//foo"],
                ["//foo:foo(//build/toolchain:host_y64)"],
            ),
            (
                ["//foo", "--unknown"],
                ["ERROR"],
            ),
            (
                ["//foo", "host_x64/foo"],
                ["//foo:foo", "NINJA_PATH<host_x64/foo>"],
            ),
        ]
        for labels, expected_labels in _TEST_CASES:
            msg = f"When parsing {labels}"
            if expected_labels == ["ERROR"]:
                with self.assertRaises(AssertionError, msg=msg):
                    qualifier.build_args_to_labels(labels)
            else:
                self.assertListEqual(
                    expected_labels,
                    qualifier.build_args_to_labels(labels),
                    msg=msg,
                )


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