Kaydet (Commit) 3230d5c9 authored tarafından Tim Peters's avatar Tim Peters

SF patch #440170: Tests for fileinput module.

New test_fileinput.py from Nick Mathewson, fiddled to use TESTFN and sundry
style nits.
üst 48dacc69
'''
Tests for fileinput module.
Nick Mathewson
'''
from test_support import verify, verbose, TESTFN
import sys, os, re
from StringIO import StringIO
from fileinput import FileInput
# The fileinput module has 2 interfaces: the FileInput class which does
# all the work, and a few functions (input, etc.) that use a global _state
# variable. We only test the FileInput class, since the other functions
# only provide a thin facade over FileInput.
# Write lines (a list of lines) to temp file number i, and return the
# temp file's name.
def writeTmp(i, lines):
name = TESTFN + str(i)
f = open(name, 'w')
f.writelines(lines)
f.close()
return name
pat = re.compile(r'LINE (\d+) OF FILE (\d+)')
def remove_tempfiles(*names):
for name in names:
try:
os.unlink(name)
except:
pass
def runTests(t1, t2, t3, t4, bs=0, round=0):
start = 1 + round*6
if verbose:
print '%s. Simple iteration (bs=%s)' % (start+0, bs)
fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
lines = list(fi)
fi.close()
verify(len(lines) == 31)
verify(lines[4] == 'Line 5 of file 1\n')
verify(lines[30] == 'Line 1 of file 4\n')
verify(fi.lineno() == 31)
verify(fi.filename() == t4)
if verbose:
print '%s. Status variables (bs=%s)' % (start+1, bs)
fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
s = "x"
while s and s != 'Line 6 of file 2\n':
s = fi.readline()
verify(fi.filename() == t2)
verify(fi.lineno() == 21)
verify(fi.filelineno() == 6)
verify(not fi.isfirstline())
verify(not fi.isstdin())
if verbose:
print '%s. Nextfile (bs=%s)' % (start+2, bs)
fi.nextfile()
verify(fi.readline() == 'Line 1 of file 3\n')
verify(fi.lineno() == 22)
fi.close()
if verbose:
print '%s. Stdin (bs=%s)' % (start+3, bs)
fi = FileInput(files=(t1, t2, t3, t4, '-'), bufsize=bs)
savestdin = sys.stdin
try:
sys.stdin = StringIO("Line 1 of stdin\nLine 2 of stdin\n")
lines = list(fi)
verify(len(lines) == 33)
verify(lines[32] == 'Line 2 of stdin\n')
verify(fi.filename() == '<stdin>')
fi.nextfile()
finally:
sys.stdin = savestdin
if verbose:
print '%s. Boundary conditions (bs=%s)' % (start+4, bs)
fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
verify(fi.lineno() == 0)
verify(fi.filename() == None)
fi.nextfile()
verify(fi.lineno() == 0)
verify(fi.filename() == None)
if verbose:
print '%s. Inplace (bs=%s)' % (start+5, bs)
savestdout = sys.stdout
try:
fi = FileInput(files=(t1, t2, t3, t4), inplace=1, bufsize=bs)
for line in fi:
line = line[:-1].upper()
print line
fi.close()
finally:
sys.stdout = savestdout
fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
for line in fi:
verify(line[-1] == '\n')
m = pat.match(line[:-1])
verify(m != None)
verify(int(m.group(1)) == fi.filelineno())
fi.close()
def writeFiles():
global t1, t2, t3, t4
t1 = writeTmp(1, ["Line %s of file 1\n" % (i+1) for i in range(15)])
t2 = writeTmp(2, ["Line %s of file 2\n" % (i+1) for i in range(10)])
t3 = writeTmp(3, ["Line %s of file 3\n" % (i+1) for i in range(5)])
t4 = writeTmp(4, ["Line %s of file 4\n" % (i+1) for i in range(1)])
# First, run the tests with default and teeny buffer size.
for round, bs in (0, 0), (1, 30):
try:
writeFiles()
runTests(t1, t2, t3, t4, bs, round)
finally:
remove_tempfiles(t1, t2, t3, t4)
# Next, check for proper behavior with 0-byte files.
if verbose:
print "13. 0-byte files"
try:
t1 = writeTmp(1, [""])
t2 = writeTmp(2, [""])
t3 = writeTmp(3, ["The only line there is.\n"])
t4 = writeTmp(4, [""])
fi = FileInput(files=(t1, t2, t3, t4))
line = fi.readline()
verify(line == 'The only line there is.\n')
verify(fi.lineno() == 1)
verify(fi.filelineno() == 1)
verify(fi.filename() == t3)
line = fi.readline()
verify(not line)
verify(fi.lineno() == 1)
verify(fi.filelineno() == 0)
verify(fi.filename() == t4)
fi.close()
finally:
remove_tempfiles(t1, t2, t3, t4)
if verbose:
print "14. Files that don't end with newline"
try:
t1 = writeTmp(1, ["A\nB\nC"])
t2 = writeTmp(2, ["D\nE\nF"])
fi = FileInput(files=(t1, t2))
lines = list(fi)
verify(lines == ["A\n", "B\n", "C", "D\n", "E\n", "F"])
verify(fi.filelineno() == 3)
verify(fi.lineno() == 6)
finally:
remove_tempfiles(t1, t2)
...@@ -30,7 +30,6 @@ import doctest ...@@ -30,7 +30,6 @@ import doctest
import dumbdbm import dumbdbm
import encodings import encodings
import filecmp import filecmp
import fileinput
import fnmatch import fnmatch
import formatter import formatter
import fpformat import fpformat
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment