avocado-framework/avocado

View on GitHub
selftests/unit/utils/astring.py

Summary

Maintainability
A
0 mins
Test Coverage
import sys
import unittest

from avocado.utils import astring, path


class AstringUtilsTest(unittest.TestCase):
    def test_tabular_output(self):

        self.assertEqual(astring.tabular_output([]), "")
        self.assertEqual(
            astring.tabular_output([], header=("C1", "C2", "C3")), "C1 C2 C3"
        )
        self.assertEqual(astring.tabular_output([["v11", "v12", "v13"]]), "v11 v12 v13")
        self.assertEqual(
            astring.tabular_output(
                [["v11", "v12", "v13"], ["v21", "v22", "v23"]],
                header=("C1", "C2", "C3"),
            ),
            "C1  C2  C3" + "\n" + "v11 v12 v13" + "\n" + "v21 v22 v23",
        )
        self.assertEqual(
            astring.tabular_output(
                [["v11", "v12", ""], ["v21", "v22", "v23"]], header=("C1", "C2", "C3")
            ),
            "C1  C2  C3" + "\n" + "v11 v12 " + "\n" + "v21 v22 v23",
        )
        self.assertEqual(
            astring.tabular_output(
                [["v11", "v12", ""], ["v21", "v22", "v23"]],
                header=("C1", "C2", "C3"),
                strip=True,
            ),
            "C1  C2  C3" + "\n" + "v11 v12" + "\n" + "v21 v22 v23",
        )

        self.assertEqual(
            astring.tabular_output(
                [["v11", "v12", ""], ["v2100", "v22", "v23"], ["v31", "v320", "v33"]],
                header=("C1", "C02", "COL3"),
            ),
            "C1    C02  COL3"
            + "\n"
            + "v11   v12  "
            + "\n"
            + "v2100 v22  v23"
            + "\n"
            + "v31   v320 v33",
        )

    def test_tabular_with_console_codes(self):
        matrix = [
            ("a", "an", "dog", "word", "last"),
            (
                "\x1b[94ma",  # {BLUE}a
                "\033[0man",  # {END}an
                "cc\033[91mc",  # cc{RED}c
                # {RED}d{GREEN}d{BLUE}d{GRAY}d{END}
                "\033[91md\033[92md\033[94md\033[90md\033[0m",
                "last",
            ),
        ]
        header = ["0", "1", "2", "3", "4"]
        self.assertEqual(
            astring.tabular_output(matrix, header),
            "0 1  2   3    4\n"
            "a an dog word last\n"
            "\x1B[94ma \x1B[0man cc\x1B[91mc "
            "\x1B[91md\x1B[92md\x1B[94md\x1B[90md\x1B[0m last",
        )

    def test_tabular_output_different_no_cols(self):
        matrix = [[], [1], [2, 2], [333, 333, 333], [4, 4, 4, 4444]]
        self.assertEqual(
            astring.tabular_output(matrix),
            "1\n2   2\n333 333 333\n4   4   4   4444",
        )

    # This could be a skip based on the Python version, but this is more
    # specific to the exact reason why it does/doesn't make sense to run it
    @unittest.skipUnless(
        sys.getdefaultencoding() == "ascii",
        "Test verifies conversion behavior of between ascii and utf-8 only",
    )
    def test_unicode_tabular(self):
        """
        Verifies tabular can handle utf-8 chars properly

        It tries valid encoded utf-8 string as well as unicode ones of
        various lengths and verifies calculates the right length and reports
        the correct results. (the string_safe_encode function is in use here)
        """

        matrix = [
            ("\xd0\xb0\xd0\xb2\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb4\xff", 123),
            ("\u0430\u0432\u043e\u043a\u0430\u0434\xff", 123),
            ("avok\xc3\xa1do", 123),
            ("a\u0430", 123),
        ]  # pylint: disable=W1402
        str_matrix = (
            "\xd0\xb0\xd0\xb2\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb4"
            "\xef\xbf\xbd 123\n"
            "\xd0\xb0\xd0\xb2\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb4"
            "\xc3\xbf 123\n"
            "avok\xc3\xa1do 123\n"
            "a\u0430 123"
        )  # pylint: disable=W1402
        self.assertEqual(astring.tabular_output(matrix), str_matrix)

    def test_safe_path(self):
        self.assertEqual(astring.string_to_safe_path('a<>:"/\\|\\?*b'), "a__________b")
        self.assertEqual(astring.string_to_safe_path(".."), "_.")
        name = " " * 300
        max_length = path.get_max_file_name_length(name)
        self.assertEqual(len(astring.string_to_safe_path(" " * 300)), max_length)
        avocado = "\u0430\u0432\u043e\u043a\u0430\u0434\xff<>"
        self.assertEqual(astring.string_to_safe_path(avocado), f"{avocado[:-2]}__")

    def test_is_bytes(self):
        """
        Verifies what bytes means, basically that they are the same
        thing across Python 2 and 3 and can be decoded into "text"
        """
        binary = b""
        text = ""
        self.assertTrue(astring.is_bytes(binary))
        self.assertFalse(astring.is_bytes(text))
        self.assertTrue(hasattr(binary, "decode"))
        self.assertTrue(astring.is_text(binary.decode()))
        self.assertFalse(astring.is_bytes(""))

    def test_is_text(self):
        """
        Verifies what text means, basically that they can represent
        extended set of characters and can be encoded into "bytes"
        """
        binary = b""
        text = ""
        self.assertTrue(astring.is_text(text))
        self.assertFalse(astring.is_text(binary))
        self.assertTrue(hasattr(text, "encode"))
        self.assertTrue(astring.is_bytes(text.encode()))

    def test_to_text_is_text(self):
        self.assertTrue(astring.is_text(astring.to_text(b"")))
        self.assertTrue(astring.is_text(astring.to_text("")))
        self.assertTrue(astring.is_text(astring.to_text("")))

    def test_to_text_decode_is_text(self):
        self.assertTrue(astring.is_text(astring.to_text(b"", "ascii")))
        self.assertTrue(astring.is_text(astring.to_text("", "ascii")))
        self.assertTrue(astring.is_text(astring.to_text("", "ascii")))

    def test_to_text(self):
        text_1 = astring.to_text(b"\xc3\xa1", "utf-8")
        text_2 = astring.to_text("\u00e1", "utf-8")
        self.assertTrue(astring.is_text(text_1))
        self.assertEqual(text_1, text_2)
        self.assertEqual(astring.to_text(Exception("\u00e1")), "\xe1")
        # For tuple, dict and others astring.to_text is equivalent of str()
        # because on py3 it's unicode and on py2 it uses __repr__ (is encoded)
        self.assertEqual(astring.to_text({"\xe1": 1}), str({"\xe1": 1}))


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