diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-08-19 01:05:19 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-08-19 01:05:19 (GMT) |
commit | e8d5145e18318e0b5003371d4d666c4e445f610e (patch) | |
tree | 4777af9b6fd7369e380fb79c5ec0dd7cbed859ee /Lib/test/test_os.py | |
parent | dbe6042f0a5b8c193efbd75cab0733bbadad4efd (diff) | |
download | cpython-e8d5145e18318e0b5003371d4d666c4e445f610e.zip cpython-e8d5145e18318e0b5003371d4d666c4e445f610e.tar.gz cpython-e8d5145e18318e0b5003371d4d666c4e445f610e.tar.bz2 |
Create os.fsdecode(): decode from the filesystem encoding with surrogateescape
error handler, or strict error handler on Windows.
* Rewrite os.fsencode() documentation
* Improve os.fsencode and os.fsdecode() tests using the new PYTHONFSENCODING
environment variable
Diffstat (limited to 'Lib/test/test_os.py')
-rw-r--r-- | Lib/test/test_os.py | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index f56280a..cd8a1b9 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -897,14 +897,6 @@ if sys.platform != 'win32': class Pep383Tests(unittest.TestCase): def setUp(self): - def fsdecode(filename): - encoding = sys.getfilesystemencoding() - if encoding == 'mbcs': - errors = 'strict' - else: - errors = 'surrogateescape' - return filename.decode(encoding, errors) - if support.TESTFN_UNENCODABLE: self.dir = support.TESTFN_UNENCODABLE else: @@ -930,7 +922,7 @@ if sys.platform != 'win32': for fn in bytesfn: f = open(os.path.join(self.bdir, fn), "w") f.close() - fn = fsdecode(fn) + fn = os.fsdecode(fn) if fn in self.unicodefn: raise ValueError("duplicate filename") self.unicodefn.add(fn) @@ -1139,12 +1131,43 @@ class Win32SymlinkTests(unittest.TestCase): self.assertNotEqual(os.lstat(link), os.stat(link)) -class MiscTests(unittest.TestCase): +class FSEncodingTests(unittest.TestCase): + def test_nop(self): + self.assertEquals(os.fsencode(b'abc\xff'), b'abc\xff') + self.assertEquals(os.fsdecode('abc\u0141'), 'abc\u0141') - @unittest.skipIf(os.name == "nt", "POSIX specific test") - def test_fsencode(self): - self.assertEquals(os.fsencode(b'ab\xff'), b'ab\xff') - self.assertEquals(os.fsencode('ab\uDCFF'), b'ab\xff') + def test_identity(self): + # assert fsdecode(fsencode(x)) == x + for fn in ('unicode\u0141', 'latin\xe9', 'ascii'): + try: + bytesfn = os.fsencode(fn) + except UnicodeEncodeError: + continue + self.assertEquals(os.fsdecode(bytesfn), fn) + + def get_output(self, fs_encoding, func): + env = os.environ.copy() + env['PYTHONIOENCODING'] = 'utf-8' + env['PYTHONFSENCODING'] = fs_encoding + code = 'import os; print(%s, end="")' % func + process = subprocess.Popen( + [sys.executable, "-c", code], + stdout=subprocess.PIPE, env=env) + stdout, stderr = process.communicate() + self.assertEqual(process.returncode, 0) + return stdout.decode('utf-8') + + def test_encodings(self): + def check(encoding, bytesfn, unicodefn): + encoded = self.get_output(encoding, 'repr(os.fsencode(%a))' % unicodefn) + self.assertEqual(encoded, repr(bytesfn)) + + decoded = self.get_output(encoding, 'repr(os.fsdecode(%a))' % bytesfn) + self.assertEqual(decoded, repr(unicodefn)) + + check('ascii', b'abc\xff', 'abc\udcff') + check('utf-8', b'\xc3\xa9\x80', '\xe9\udc80') + check('iso-8859-15', b'\xef\xa4', '\xef\u20ac') def test_main(): @@ -1163,7 +1186,7 @@ def test_main(): Pep383Tests, Win32KillTests, Win32SymlinkTests, - MiscTests, + FSEncodingTests, ) if __name__ == "__main__": |