import sys import os from array import array from weakref import proxy from test.test_support import verify, TESTFN, TestFailed from UserList import UserList # verify weak references f = file(TESTFN, 'w') p = proxy(f) p.write('teststring') verify(f.tell(), p.tell()) f.close() f = None try: p.tell() except ReferenceError: pass else: raise TestFailed('file proxy still exists when the file is gone') # verify expected attributes exist f = file(TESTFN, 'w') softspace = f.softspace f.name # merely shouldn't blow up f.mode # ditto f.closed # ditto # verify softspace is writable f.softspace = softspace # merely shouldn't blow up # verify the others aren't for attr in 'name', 'mode', 'closed': try: setattr(f, attr, 'oops') except (AttributeError, TypeError): pass else: raise TestFailed('expected exception setting file attr %r' % attr) f.close() # check invalid mode strings for mode in ("", "aU", "wU+"): try: f = file(TESTFN, mode) except ValueError: pass else: f.close() raise TestFailed('%r is an invalid file mode' % mode) # verify writelines with instance sequence l = UserList(['1', '2']) f = open(TESTFN, 'wb') f.writelines(l) f.close() f = open(TESTFN, 'rb') buf = f.read() f.close() verify(buf == '12') # verify readinto a = array('c', 'x'*10) f = open(TESTFN, 'rb') n = f.readinto(a) f.close() verify(buf == a.tostring()[:n]) # verify writelines with integers f = open(TESTFN, 'wb') try: f.writelines([1, 2, 3]) except TypeError: pass else: print "writelines accepted sequence of integers" f.close() # verify writelines with integers in UserList f = open(TESTFN, 'wb') l = UserList([1,2,3]) try: f.writelines(l) except TypeError: pass else: print "writelines accepted sequence of integers" f.close() # verify writelines with non-string object class NonString: pass f = open(TESTFN, 'wb') try: f.writelines([NonString(), NonString()]) except TypeError: pass else: print "writelines accepted sequence of non-string objects" f.close() try: sys.stdin.seek(-1) except IOError: pass else: print "should not be able to seek on sys.stdin" try: sys.stdin.truncate() except IOError: pass else: print "should not be able to truncate on sys.stdin" # verify repr works f = open(TESTFN) if not repr(f).startswith(" # "file.truncate fault on windows" f = file(TESTFN, 'wb') f.write('12345678901') # 11 bytes f.close() f = file(TESTFN,'rb+') data = f.read(5) if data != '12345': raise TestFailed("Read on file opened for update failed %r" % data) if f.tell() != 5: raise TestFailed("File pos after read wrong %d" % f.tell()) f.truncate() if f.tell() != 5: raise TestFailed("File pos after ftruncate wrong %d" % f.tell()) f.close() size = os.path.getsize(TESTFN) if size != 5: raise TestFailed("File size after ftruncate wrong %d" % size) try: bug801631() finally: os.unlink(TESTFN)