@@ -897,14 +897,6 @@ def test_setregid_neg1(self):
897897
898898 class Pep383Tests (unittest .TestCase ):
899899 def setUp (self ):
900- def fsdecode (filename ):
901- encoding = sys .getfilesystemencoding ()
902- if encoding == 'mbcs' :
903- errors = 'strict'
904- else :
905- errors = 'surrogateescape'
906- return filename .decode (encoding , errors )
907-
908900 if support .TESTFN_UNENCODABLE :
909901 self .dir = support .TESTFN_UNENCODABLE
910902 else :
@@ -930,7 +922,7 @@ def add_filename(fn):
930922 for fn in bytesfn :
931923 f = open (os .path .join (self .bdir , fn ), "w" )
932924 f .close ()
933- fn = fsdecode (fn )
925+ fn = os . fsdecode (fn )
934926 if fn in self .unicodefn :
935927 raise ValueError ("duplicate filename" )
936928 self .unicodefn .add (fn )
@@ -1139,12 +1131,43 @@ def check_stat(self, link, target):
11391131 self .assertNotEqual (os .lstat (link ), os .stat (link ))
11401132
11411133
1142- class MiscTests (unittest .TestCase ):
1134+ class FSEncodingTests (unittest .TestCase ):
1135+ def test_nop (self ):
1136+ self .assertEquals (os .fsencode (b'abc\xff ' ), b'abc\xff ' )
1137+ self .assertEquals (os .fsdecode ('abc\u0141 ' ), 'abc\u0141 ' )
11431138
1144- @unittest .skipIf (os .name == "nt" , "POSIX specific test" )
1145- def test_fsencode (self ):
1146- self .assertEquals (os .fsencode (b'ab\xff ' ), b'ab\xff ' )
1147- self .assertEquals (os .fsencode ('ab\uDCFF ' ), b'ab\xff ' )
1139+ def test_identity (self ):
1140+ # assert fsdecode(fsencode(x)) == x
1141+ for fn in ('unicode\u0141 ' , 'latin\xe9 ' , 'ascii' ):
1142+ try :
1143+ bytesfn = os .fsencode (fn )
1144+ except UnicodeEncodeError :
1145+ continue
1146+ self .assertEquals (os .fsdecode (bytesfn ), fn )
1147+
1148+ def get_output (self , fs_encoding , func ):
1149+ env = os .environ .copy ()
1150+ env ['PYTHONIOENCODING' ] = 'utf-8'
1151+ env ['PYTHONFSENCODING' ] = fs_encoding
1152+ code = 'import os; print(%s, end="")' % func
1153+ process = subprocess .Popen (
1154+ [sys .executable , "-c" , code ],
1155+ stdout = subprocess .PIPE , env = env )
1156+ stdout , stderr = process .communicate ()
1157+ self .assertEqual (process .returncode , 0 )
1158+ return stdout .decode ('utf-8' )
1159+
1160+ def test_encodings (self ):
1161+ def check (encoding , bytesfn , unicodefn ):
1162+ encoded = self .get_output (encoding , 'repr(os.fsencode(%a))' % unicodefn )
1163+ self .assertEqual (encoded , repr (bytesfn ))
1164+
1165+ decoded = self .get_output (encoding , 'repr(os.fsdecode(%a))' % bytesfn )
1166+ self .assertEqual (decoded , repr (unicodefn ))
1167+
1168+ check ('ascii' , b'abc\xff ' , 'abc\udcff ' )
1169+ check ('utf-8' , b'\xc3 \xa9 \x80 ' , '\xe9 \udc80 ' )
1170+ check ('iso-8859-15' , b'\xef \xa4 ' , '\xef \u20ac ' )
11481171
11491172
11501173def test_main ():
@@ -1163,7 +1186,7 @@ def test_main():
11631186 Pep383Tests ,
11641187 Win32KillTests ,
11651188 Win32SymlinkTests ,
1166- MiscTests ,
1189+ FSEncodingTests ,
11671190 )
11681191
11691192if __name__ == "__main__" :
0 commit comments