88import random
99import subprocess
1010import sys
11+ from test .support import unlink
1112
1213try :
1314 import threading
@@ -715,49 +716,67 @@ def open(self, *args, **kwargs):
715716 return bz2 .open (* args , ** kwargs )
716717
717718 def test_binary_modes (self ):
718- with self .open (self .filename , "wb" ) as f :
719- f .write (self .TEXT )
720- with open (self .filename , "rb" ) as f :
721- file_data = self .decompress (f .read ())
722- self .assertEqual (file_data , self .TEXT )
723- with self .open (self .filename , "rb" ) as f :
724- self .assertEqual (f .read (), self .TEXT )
725- with self .open (self .filename , "ab" ) as f :
726- f .write (self .TEXT )
727- with open (self .filename , "rb" ) as f :
728- file_data = self .decompress (f .read ())
729- self .assertEqual (file_data , self .TEXT * 2 )
719+ for mode in ("wb" , "xb" ):
720+ if mode == "xb" :
721+ unlink (self .filename )
722+ with self .open (self .filename , mode ) as f :
723+ f .write (self .TEXT )
724+ with open (self .filename , "rb" ) as f :
725+ file_data = self .decompress (f .read ())
726+ self .assertEqual (file_data , self .TEXT )
727+ with self .open (self .filename , "rb" ) as f :
728+ self .assertEqual (f .read (), self .TEXT )
729+ with self .open (self .filename , "ab" ) as f :
730+ f .write (self .TEXT )
731+ with open (self .filename , "rb" ) as f :
732+ file_data = self .decompress (f .read ())
733+ self .assertEqual (file_data , self .TEXT * 2 )
730734
731735 def test_implicit_binary_modes (self ):
732736 # Test implicit binary modes (no "b" or "t" in mode string).
733- with self .open (self .filename , "w" ) as f :
734- f .write (self .TEXT )
735- with open (self .filename , "rb" ) as f :
736- file_data = self .decompress (f .read ())
737- self .assertEqual (file_data , self .TEXT )
738- with self .open (self .filename , "r" ) as f :
739- self .assertEqual (f .read (), self .TEXT )
740- with self .open (self .filename , "a" ) as f :
741- f .write (self .TEXT )
742- with open (self .filename , "rb" ) as f :
743- file_data = self .decompress (f .read ())
744- self .assertEqual (file_data , self .TEXT * 2 )
737+ for mode in ("w" , "x" ):
738+ if mode == "x" :
739+ unlink (self .filename )
740+ with self .open (self .filename , mode ) as f :
741+ f .write (self .TEXT )
742+ with open (self .filename , "rb" ) as f :
743+ file_data = self .decompress (f .read ())
744+ self .assertEqual (file_data , self .TEXT )
745+ with self .open (self .filename , "r" ) as f :
746+ self .assertEqual (f .read (), self .TEXT )
747+ with self .open (self .filename , "a" ) as f :
748+ f .write (self .TEXT )
749+ with open (self .filename , "rb" ) as f :
750+ file_data = self .decompress (f .read ())
751+ self .assertEqual (file_data , self .TEXT * 2 )
745752
746753 def test_text_modes (self ):
747754 text = self .TEXT .decode ("ascii" )
748755 text_native_eol = text .replace ("\n " , os .linesep )
749- with self .open (self .filename , "wt" ) as f :
750- f .write (text )
751- with open (self .filename , "rb" ) as f :
752- file_data = self .decompress (f .read ()).decode ("ascii" )
753- self .assertEqual (file_data , text_native_eol )
754- with self .open (self .filename , "rt" ) as f :
755- self .assertEqual (f .read (), text )
756- with self .open (self .filename , "at" ) as f :
757- f .write (text )
758- with open (self .filename , "rb" ) as f :
759- file_data = self .decompress (f .read ()).decode ("ascii" )
760- self .assertEqual (file_data , text_native_eol * 2 )
756+ for mode in ("wt" , "xt" ):
757+ if mode == "xt" :
758+ unlink (self .filename )
759+ with self .open (self .filename , mode ) as f :
760+ f .write (text )
761+ with open (self .filename , "rb" ) as f :
762+ file_data = self .decompress (f .read ()).decode ("ascii" )
763+ self .assertEqual (file_data , text_native_eol )
764+ with self .open (self .filename , "rt" ) as f :
765+ self .assertEqual (f .read (), text )
766+ with self .open (self .filename , "at" ) as f :
767+ f .write (text )
768+ with open (self .filename , "rb" ) as f :
769+ file_data = self .decompress (f .read ()).decode ("ascii" )
770+ self .assertEqual (file_data , text_native_eol * 2 )
771+
772+ def test_x_mode (self ):
773+ for mode in ("x" , "xb" , "xt" ):
774+ unlink (self .filename )
775+ with self .open (self .filename , mode ) as f :
776+ pass
777+ with self .assertRaises (FileExistsError ):
778+ with self .open (self .filename , mode ) as f :
779+ pass
761780
762781 def test_fileobj (self ):
763782 with self .open (BytesIO (self .DATA ), "r" ) as f :
@@ -772,6 +791,8 @@ def test_bad_params(self):
772791 # Test invalid parameter combinations.
773792 self .assertRaises (ValueError ,
774793 self .open , self .filename , "wbt" )
794+ self .assertRaises (ValueError ,
795+ self .open , self .filename , "xbt" )
775796 self .assertRaises (ValueError ,
776797 self .open , self .filename , "rb" , encoding = "utf-8" )
777798 self .assertRaises (ValueError ,
0 commit comments