#!/usr/bin/env fuchsia-vendored-python
# Copyright 2020 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 os
import unittest
from pathlib import Path
from unittest import mock

import relativize_args


class SplitTransformJoinTest(unittest.TestCase):
    def test_no_change(self):
        self.assertEqual(
            relativize_args.split_transform_join("text", "=", lambda x: x),
            "text",
        )

    def test_repeat(self):
        self.assertEqual(
            relativize_args.split_transform_join("text", "=", lambda x: x + x),
            "texttext",
        )

    def test_with_split(self):
        self.assertEqual(
            relativize_args.split_transform_join("a=b", "=", lambda x: x + x),
            "aa=bb",
        )

    def test_with_split_recorded(self):
        renamed_tokens = {}

        def recorded_transform(x):
            new_text = x + x
            renamed_tokens[x] = new_text
            return new_text

        self.assertEqual(
            relativize_args.split_transform_join(
                "a=b", "=", recorded_transform
            ),
            "aa=bb",
        )
        self.assertEqual(renamed_tokens, {"a": "aa", "b": "bb"})


class LexicallyRewriteTokenTest(unittest.TestCase):
    def test_repeat_text(self):
        self.assertEqual(
            relativize_args.lexically_rewrite_token("foo", lambda x: x + x),
            "foofoo",
        )

    def test_delimters_only(self):
        self.assertEqual(
            relativize_args.lexically_rewrite_token(
                ",,==,=,=,", lambda x: x + x
            ),
            ",,==,=,=,",
        )

    def test_flag_with_value(self):
        def transform(x):
            if x.startswith("file"):
                return "tmp-" + x
            else:
                return x

        self.assertEqual(
            relativize_args.lexically_rewrite_token("--foo=file1", transform),
            "--foo=tmp-file1",
        )
        self.assertEqual(
            relativize_args.lexically_rewrite_token(
                "notfile,file1,file2,notfile", transform
            ),
            "notfile,tmp-file1,tmp-file2,notfile",
        )
        self.assertEqual(
            relativize_args.lexically_rewrite_token(
                "--foo=file1,file2", transform
            ),
            "--foo=tmp-file1,tmp-file2",
        )


class GreatestPathParentTest(unittest.TestCase):
    def test_one_component(self):
        self.assertEqual(
            relativize_args.greatest_path_parent(Path("/root")), Path("/root")
        )

    def test_multiple_components(self):
        self.assertEqual(
            relativize_args.greatest_path_parent(
                Path("/root/for/the/home/team")
            ),
            Path("/root"),
        )


class RelativizePathTest(unittest.TestCase):
    def test_abspath(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_path("/a/b/c", Path("/a/d")),
                "../b/c",
            )
        mock_exists.assert_called_with()

    def test_relpath(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_path("x/y/z", Path("/a/d")), "x/y/z"
            )
        mock_exists.assert_not_called()  # no absolute path in arg

    def test_cxx_Iflag(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_path("-I/j/k", Path("/j/a/d")),
                "-I../../k",
            )
        mock_exists.assert_called_with()

    def test_cxx_Lflag(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_path("-L/p/q/r", Path("/p/q/z")),
                "-L../r",
            )
        mock_exists.assert_called_with()

    def test_cxx_isystemflag(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_path(
                    "-isystem/r/s/t", Path("/r/v/w")
                ),
                "-isystem../../s/t",
            )
        mock_exists.assert_called_with()

    def test_windows_style_flag(self):
        with mock.patch.object(
            Path, "exists", return_value=False
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_path("/Foo", Path("/p/q/z")), "/Foo"
            )
        mock_exists.assert_called_with()


class RelativizeCommandTest(unittest.TestCase):
    def test_no_transform(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_command(
                    ["echo", "hello"], Path("/home/sweet/home")
                ),
                ["echo", "hello"],
            )
        mock_exists.assert_not_called()  # nothing looks like an absolute path

    def test_with_env(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_command(
                    ["HOME=/home", "echo"], Path("/home/subdir")
                ),
                ["/usr/bin/env", "HOME=..", "echo"],
            )
        mock_exists.assert_called_with()

    def test_relativize(self):
        with mock.patch.object(
            Path, "exists", return_value=True
        ) as mock_exists:
            self.assertEqual(
                relativize_args.relativize_command(
                    ["cat", "/meow/foo.txt"], Path("/meow/subdir")
                ),
                ["cat", "../foo.txt"],
            )
        mock_exists.assert_called_with()


class MainArgParserTest(unittest.TestCase):
    def test_no_flags(self):
        parser = relativize_args.main_arg_parser()
        args = parser.parse_args([])
        self.assertFalse(args.verbose)
        self.assertFalse(args.dry_run)
        self.assertTrue(args.enable)

    def test_verbose(self):
        parser = relativize_args.main_arg_parser()
        args = parser.parse_args(["--verbose"])
        self.assertTrue(args.verbose)

    def test_dry_run(self):
        parser = relativize_args.main_arg_parser()
        args = parser.parse_args(["--dry-run"])
        self.assertTrue(args.dry_run)

    def test_disable(self):
        parser = relativize_args.main_arg_parser()
        args = parser.parse_args(["--disable"])
        self.assertFalse(args.enable)

    def test_cwd(self):
        parser = relativize_args.main_arg_parser()
        args = parser.parse_args(["--cwd", "/home/foo"])
        self.assertEqual(args.cwd, Path("/home/foo"))

    def test_command(self):
        parser = relativize_args.main_arg_parser()
        args = parser.parse_args(["--", "echo", "bye"])
        self.assertEqual(args.command, ["echo", "bye"])


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