diff tests/test_walk.py @ 201:58d93453c307

Much more encoding-related methods for DirWalkEntry and some unittests
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 21 Jan 2025 14:30:06 +0100
parents
children b4137ebd8e79
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_walk.py	Tue Jan 21 14:30:06 2025 +0100
@@ -0,0 +1,200 @@
+# -*- coding: utf-8 -*-
+r"""Unit tests
+
+"""
+
+from __future__ import absolute_import, print_function
+
+import sys
+import unittest
+
+import _test_setup    # noqa: F401 imported but unused
+
+from cutils.util import walk
+
+
+class SurrogateEscapeTests(unittest.TestCase):
+
+    @unittest.skipIf(sys.version_info[0] >= 3, "Skip on Python3")
+    def test_simple_escape(self):
+        w = b"\xc4"
+
+        d = walk.WalkDirEntry.surrogate_decode(w)
+        self.assertEqual(u"\udcc4", d)
+
+    @unittest.skipIf(sys.version_info[0] >= 3, "Skip on Python3")
+    def test_no_escape_min(self):
+        w = b"\x00"
+
+        d = walk.WalkDirEntry.surrogate_decode(w)
+        self.assertEqual(u"\x00", d)
+
+    @unittest.skipIf(sys.version_info[0] >= 3, "Skip on Python3")
+    def test_no_escape_max(self):
+        w = b"\x7f"
+
+        d = walk.WalkDirEntry.surrogate_decode(w)
+        self.assertEqual(u"\x7f", d)
+
+    @unittest.skipIf(sys.version_info[0] >= 3, "Skip on Python3")
+    def test_escape_min(self):
+        w = b"\x80"
+
+        d = walk.WalkDirEntry.surrogate_decode(w)
+        self.assertEqual(u"\udc80", d)
+
+    @unittest.skipIf(sys.version_info[0] >= 3, "Skip on Python3")
+    def test_escape_max(self):
+        w = b"\xff"
+
+        d = walk.WalkDirEntry.surrogate_decode(w)
+        self.assertEqual(u"\udcff", d)
+
+    @unittest.skipIf(sys.version_info[0] >= 3, "Skip on Python3")
+    def test_complex(self):
+        w = b"abc\xc4d\x80\x81\xffefg"
+        d = walk.WalkDirEntry.surrogate_decode(w)
+        self.assertEqual(u"abc\udcc4d\udc80\udc81\udcffefg", d)
+
+
+class WalkDirEntryTests(unittest.TestCase):
+
+    def setUp(self):
+        self._orig_fsencoding = walk._FSENCODING
+        walk._FSENCODING = "ascii"
+
+    def tearDown(self):
+        walk._FSENCODING = self._orig_fsencoding
+
+    def test_ascii(self):
+        entry = walk.WalkDirEntry.from_path_name("tests", "_test_setup.py")
+        self.assertEqual("_test_setup.py", entry.name)
+        self.assertEqual("tests/_test_setup.py", entry.path)
+        self.assertEqual(u"_test_setup.py", entry.uname)
+        self.assertEqual(u"tests/_test_setup.py", entry.upath)
+        self.assertEqual(b"_test_setup.py", entry.u8name)
+        self.assertEqual(b"tests/_test_setup.py", entry.u8path)
+        self.assertEqual(b"_test_setup.py", entry.alt_u8name)
+        self.assertEqual(b"tests/_test_setup.py", entry.alt_u8path)
+        self.assertEqual(b"_test_setup.py", entry.alt_fsname)
+        self.assertEqual(b"tests/_test_setup.py", entry.alt_fspath)
+
+    @unittest.skipIf(sys.version_info[0] < 3, "Skip on Python2")
+    def test_with_surrogate_escaped_name(self):
+        # instantiate with a surrogate escaped path from PEP 383
+        entry = walk.WalkDirEntry.from_path_name(
+            "tests", "test-\udcc4", _do_stat=False)
+        self.assertEqual("test-\udcc4", entry.name)
+        self.assertEqual("tests/test-\udcc4", entry.path)
+        self.assertEqual(b"test-\xc4", entry.fsname)
+        self.assertEqual(b"tests/test-\xc4", entry.fspath)
+        self.assertEqual(b"test-\xc4", entry.alt_fsname)
+        self.assertEqual(b"tests/test-\xc4", entry.alt_fspath)
+
+        self.assertIsNone(entry.uname)
+        self.assertIsNone(entry.upath)
+        self.assertIsNone(entry.u8name)
+        self.assertIsNone(entry.u8path)
+
+        self.assertEqual(b"test-\\udcc4", entry.alt_u8name)
+        self.assertEqual(b"tests/test-\\udcc4", entry.alt_u8path)
+
+    @unittest.skipIf(sys.version_info[0] < 3, "Skip on Python2")
+    def test_with_surrogate_escaped_path(self):
+        # instantiate with a surrogate escaped path from PEP 383
+        entry = walk.WalkDirEntry.from_path_name(
+            "tests\udcc5", "test", _do_stat=False)
+        self.assertEqual("test", entry.name)
+        self.assertEqual("tests\udcc5/test", entry.path)
+        self.assertEqual(b"test", entry.fsname)
+        self.assertEqual(b"tests\xc5/test", entry.fspath)
+        self.assertEqual(b"test", entry.alt_fsname)
+        self.assertEqual(b"tests\xc5/test", entry.alt_fspath)
+
+        self.assertEqual("test", entry.uname)
+        self.assertIsNone(entry.upath)
+        self.assertEqual(b"test", entry.u8name)
+        self.assertIsNone(entry.u8path)
+
+        self.assertEqual(b"test", entry.alt_u8name)
+        self.assertEqual(b"tests\\udcc5/test", entry.alt_u8path)
+
+    @unittest.skipIf(sys.version_info[0] > 2, "Skip on Python3")
+    def test_py2_with_non_fsdecodable_name(self):
+        entry = walk.WalkDirEntry.from_path_name(
+            b"tests", b"test-\xc4", _do_stat=False)
+        self.assertEqual(b"test-\xc4", entry.name)
+        self.assertEqual(b"tests/test-\xc4", entry.path)
+        self.assertEqual(b"test-\xc4", entry.fsname)
+        self.assertEqual(b"tests/test-\xc4", entry.fspath)
+        self.assertEqual(b"test-\xc4", entry.alt_fsname)
+        self.assertEqual(b"tests/test-\xc4", entry.alt_fspath)
+
+        self.assertIsNone(entry.uname)
+        self.assertIsNone(entry.upath)
+        self.assertIsNone(entry.u8name)
+        self.assertIsNone(entry.u8path)
+
+        self.assertEqual(b"test-\\udcc4", entry.alt_u8name)
+        self.assertEqual(b"tests/test-\\udcc4", entry.alt_u8path)
+
+    @unittest.skipIf(sys.version_info[0] > 2, "Skip on Python3")
+    def test_py2_with_non_fsdecodable_path(self):
+        entry = walk.WalkDirEntry.from_path_name(
+            b"tests\xc5", b"test", _do_stat=False)
+        self.assertEqual(b"test", entry.name)
+        self.assertEqual(b"tests\xc5/test", entry.path)
+        self.assertEqual(b"test", entry.fsname)
+        self.assertEqual(b"tests\xc5/test", entry.fspath)
+        self.assertEqual(b"test", entry.alt_fsname)
+        self.assertEqual(b"tests\xc5/test", entry.alt_fspath)
+
+        self.assertEqual(b"test", entry.uname)
+        self.assertIsNone(entry.upath)
+        self.assertEqual(b"test", entry.u8name)
+        self.assertIsNone(entry.u8path)
+
+        self.assertEqual(b"test", entry.alt_u8name)
+        self.assertEqual(b"tests\\udcc5/test", entry.alt_u8path)
+
+    @unittest.skipIf(sys.version_info[0] > 2, "Skip on Python3")
+    def test_py2_with_non_fsencodable_unicode_name(self):
+        entry = walk.WalkDirEntry.from_path_name(
+            u"tests", u"test-\xc4", _do_stat=False)
+        self.assertEqual(u"test-\xc4", entry.name)
+        self.assertEqual(u"tests/test-\xc4", entry.path)
+        self.assertIsNone(entry.fsname)
+        self.assertIsNone(entry.fspath)
+        self.assertEqual(b"test-\\xc4", entry.alt_fsname)
+        self.assertEqual(b"tests/test-\\xc4", entry.alt_fspath)
+
+        self.assertEqual(u"test-\xc4", entry.uname)
+        self.assertEqual(u"tests/test-\xc4", entry.upath)
+        self.assertEqual(b"test-\xc3\x84", entry.u8name)
+        self.assertEqual(b"tests/test-\xc3\x84", entry.u8path)
+
+        self.assertEqual(b"test-\\xc4", entry.alt_u8name)
+        self.assertEqual(b"tests/test-\\xc4", entry.alt_u8path)
+
+    @unittest.skipIf(sys.version_info[0] > 2, "Skip on Python3")
+    def test_py2_with_non_fsencodable_unicode_path(self):
+        entry = walk.WalkDirEntry.from_path_name(
+            u"tests\xc5", u"test", _do_stat=False)
+        self.assertEqual(u"test", entry.name)
+        self.assertEqual(u"tests\xc5/test", entry.path)
+        self.assertEqual(b"test", entry.fsname)
+        self.assertIsNone(entry.fspath)
+        self.assertEqual(b"test", entry.alt_fsname)
+        self.assertEqual(b"tests\\xc5/test", entry.alt_fspath)
+
+        self.assertEqual(u"test", entry.uname)
+        self.assertEqual(u"tests\xc5/test", entry.upath)
+        self.assertEqual(b"test", entry.u8name)
+        self.assertEqual(b"tests\xc3\x85/test", entry.u8path)
+
+        self.assertEqual(b"test", entry.alt_u8name)
+        self.assertEqual(b"tests\\xc5/test", entry.alt_u8path)
+
+
+if __name__ == "__main__":
+    sys.exit(unittest.main())