| 
 | 1 | +import unittest  | 
 | 2 | + | 
 | 3 | +from test.support import warnings_helper  | 
 | 4 | + | 
 | 5 | + | 
 | 6 | +nturl2path = warnings_helper.import_deprecated("nturl2path")  | 
 | 7 | + | 
 | 8 | + | 
 | 9 | +class NTURL2PathTest(unittest.TestCase):  | 
 | 10 | +    """Test pathname2url() and url2pathname()"""  | 
 | 11 | + | 
 | 12 | +    def test_basic(self):  | 
 | 13 | +        # Make sure simple tests pass  | 
 | 14 | +        expected_path = r"parts\of\a\path"  | 
 | 15 | +        expected_url = "parts/of/a/path"  | 
 | 16 | +        result = nturl2path.pathname2url(expected_path)  | 
 | 17 | +        self.assertEqual(expected_url, result,  | 
 | 18 | +                         "pathname2url() failed; %s != %s" %  | 
 | 19 | +                         (result, expected_url))  | 
 | 20 | +        result = nturl2path.url2pathname(expected_url)  | 
 | 21 | +        self.assertEqual(expected_path, result,  | 
 | 22 | +                         "url2pathame() failed; %s != %s" %  | 
 | 23 | +                         (result, expected_path))  | 
 | 24 | + | 
 | 25 | +    def test_pathname2url(self):  | 
 | 26 | +        # Test special prefixes are correctly handled in pathname2url()  | 
 | 27 | +        fn = nturl2path.pathname2url  | 
 | 28 | +        self.assertEqual(fn('\\\\?\\C:\\dir'), '///C:/dir')  | 
 | 29 | +        self.assertEqual(fn('\\\\?\\unc\\server\\share\\dir'), '//server/share/dir')  | 
 | 30 | +        self.assertEqual(fn("C:"), '///C:')  | 
 | 31 | +        self.assertEqual(fn("C:\\"), '///C:/')  | 
 | 32 | +        self.assertEqual(fn('c:\\a\\b.c'), '///c:/a/b.c')  | 
 | 33 | +        self.assertEqual(fn('C:\\a\\b.c'), '///C:/a/b.c')  | 
 | 34 | +        self.assertEqual(fn('C:\\a\\b.c\\'), '///C:/a/b.c/')  | 
 | 35 | +        self.assertEqual(fn('C:\\a\\\\b.c'), '///C:/a//b.c')  | 
 | 36 | +        self.assertEqual(fn('C:\\a\\b%#c'), '///C:/a/b%25%23c')  | 
 | 37 | +        self.assertEqual(fn('C:\\a\\b\xe9'), '///C:/a/b%C3%A9')  | 
 | 38 | +        self.assertEqual(fn('C:\\foo\\bar\\spam.foo'), "///C:/foo/bar/spam.foo")  | 
 | 39 | +        # NTFS alternate data streams  | 
 | 40 | +        self.assertEqual(fn('C:\\foo:bar'), '///C:/foo%3Abar')  | 
 | 41 | +        self.assertEqual(fn('foo:bar'), 'foo%3Abar')  | 
 | 42 | +        # No drive letter  | 
 | 43 | +        self.assertEqual(fn("\\folder\\test\\"), '///folder/test/')  | 
 | 44 | +        self.assertEqual(fn("\\\\folder\\test\\"), '//folder/test/')  | 
 | 45 | +        self.assertEqual(fn("\\\\\\folder\\test\\"), '///folder/test/')  | 
 | 46 | +        self.assertEqual(fn('\\\\some\\share\\'), '//some/share/')  | 
 | 47 | +        self.assertEqual(fn('\\\\some\\share\\a\\b.c'), '//some/share/a/b.c')  | 
 | 48 | +        self.assertEqual(fn('\\\\some\\share\\a\\b%#c\xe9'), '//some/share/a/b%25%23c%C3%A9')  | 
 | 49 | +        # Alternate path separator  | 
 | 50 | +        self.assertEqual(fn('C:/a/b.c'), '///C:/a/b.c')  | 
 | 51 | +        self.assertEqual(fn('//some/share/a/b.c'), '//some/share/a/b.c')  | 
 | 52 | +        self.assertEqual(fn('//?/C:/dir'), '///C:/dir')  | 
 | 53 | +        self.assertEqual(fn('//?/unc/server/share/dir'), '//server/share/dir')  | 
 | 54 | +        # Round-tripping  | 
 | 55 | +        urls = ['///C:',  | 
 | 56 | +                '///folder/test/',  | 
 | 57 | +                '///C:/foo/bar/spam.foo']  | 
 | 58 | +        for url in urls:  | 
 | 59 | +            self.assertEqual(fn(nturl2path.url2pathname(url)), url)  | 
 | 60 | + | 
 | 61 | +    def test_url2pathname(self):  | 
 | 62 | +        fn = nturl2path.url2pathname  | 
 | 63 | +        self.assertEqual(fn('/'), '\\')  | 
 | 64 | +        self.assertEqual(fn('/C:/'), 'C:\\')  | 
 | 65 | +        self.assertEqual(fn("///C|"), 'C:')  | 
 | 66 | +        self.assertEqual(fn("///C:"), 'C:')  | 
 | 67 | +        self.assertEqual(fn('///C:/'), 'C:\\')  | 
 | 68 | +        self.assertEqual(fn('/C|//'), 'C:\\\\')  | 
 | 69 | +        self.assertEqual(fn('///C|/path'), 'C:\\path')  | 
 | 70 | +        # No DOS drive  | 
 | 71 | +        self.assertEqual(fn("///C/test/"), '\\C\\test\\')  | 
 | 72 | +        self.assertEqual(fn("////C/test/"), '\\\\C\\test\\')  | 
 | 73 | +        # DOS drive paths  | 
 | 74 | +        self.assertEqual(fn('c:/path/to/file'), 'c:\\path\\to\\file')  | 
 | 75 | +        self.assertEqual(fn('C:/path/to/file'), 'C:\\path\\to\\file')  | 
 | 76 | +        self.assertEqual(fn('C:/path/to/file/'), 'C:\\path\\to\\file\\')  | 
 | 77 | +        self.assertEqual(fn('C:/path/to//file'), 'C:\\path\\to\\\\file')  | 
 | 78 | +        self.assertEqual(fn('C|/path/to/file'), 'C:\\path\\to\\file')  | 
 | 79 | +        self.assertEqual(fn('/C|/path/to/file'), 'C:\\path\\to\\file')  | 
 | 80 | +        self.assertEqual(fn('///C|/path/to/file'), 'C:\\path\\to\\file')  | 
 | 81 | +        self.assertEqual(fn("///C|/foo/bar/spam.foo"), 'C:\\foo\\bar\\spam.foo')  | 
 | 82 | +        # Colons in URI  | 
 | 83 | +        self.assertEqual(fn('///\u00e8|/'), '\u00e8:\\')  | 
 | 84 | +        self.assertEqual(fn('//host/share/spam.txt:eggs'), '\\\\host\\share\\spam.txt:eggs')  | 
 | 85 | +        self.assertEqual(fn('///c:/spam.txt:eggs'), 'c:\\spam.txt:eggs')  | 
 | 86 | +        # UNC paths  | 
 | 87 | +        self.assertEqual(fn('//server/path/to/file'), '\\\\server\\path\\to\\file')  | 
 | 88 | +        self.assertEqual(fn('////server/path/to/file'), '\\\\server\\path\\to\\file')  | 
 | 89 | +        self.assertEqual(fn('/////server/path/to/file'), '\\\\server\\path\\to\\file')  | 
 | 90 | +        # Localhost paths  | 
 | 91 | +        self.assertEqual(fn('//localhost/C:/path/to/file'), 'C:\\path\\to\\file')  | 
 | 92 | +        self.assertEqual(fn('//localhost/C|/path/to/file'), 'C:\\path\\to\\file')  | 
 | 93 | +        self.assertEqual(fn('//localhost/path/to/file'), '\\path\\to\\file')  | 
 | 94 | +        self.assertEqual(fn('//localhost//server/path/to/file'), '\\\\server\\path\\to\\file')  | 
 | 95 | +        # Percent-encoded forward slashes are preserved for backwards compatibility  | 
 | 96 | +        self.assertEqual(fn('C:/foo%2fbar'), 'C:\\foo/bar')  | 
 | 97 | +        self.assertEqual(fn('//server/share/foo%2fbar'), '\\\\server\\share\\foo/bar')  | 
 | 98 | +        # Round-tripping  | 
 | 99 | +        paths = ['C:',  | 
 | 100 | +                 r'\C\test\\',  | 
 | 101 | +                 r'C:\foo\bar\spam.foo']  | 
 | 102 | +        for path in paths:  | 
 | 103 | +            self.assertEqual(fn(nturl2path.pathname2url(path)), path)  | 
 | 104 | + | 
 | 105 | + | 
 | 106 | +if __name__ == '__main__':  | 
 | 107 | +    unittest.main()  | 
0 commit comments