blob: 5d40831699704be8d515ae33ac95e7fd1931412c [file] [log] [blame]
#!/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()