parent
b9e2147dee
commit
ace34dda0a
|
@ -1,62 +1,55 @@
|
|||
"""Test correct operation of the print function.
|
||||
"""
|
||||
|
||||
# In 2.6, this gives us the behavior we want. In 3.0, it has
|
||||
# no function, but it still must parse correctly.
|
||||
from __future__ import print_function
|
||||
|
||||
import unittest
|
||||
from test import support
|
||||
from io import StringIO
|
||||
|
||||
try:
|
||||
# 3.x
|
||||
from io import StringIO
|
||||
except ImportError:
|
||||
# 2.x
|
||||
from StringIO import StringIO
|
||||
from test import support
|
||||
|
||||
NotDefined = object()
|
||||
|
||||
# A dispatch table all 8 combinations of providing
|
||||
# sep, end, and file
|
||||
# sep, end, and file.
|
||||
# I use this machinery so that I'm not just passing default
|
||||
# values to print, I'm either passing or not passing in the
|
||||
# arguments
|
||||
# values to print, I'm either passing or not passing in the
|
||||
# arguments.
|
||||
dispatch = {
|
||||
(False, False, False):
|
||||
lambda args, sep, end, file: print(*args),
|
||||
lambda args, sep, end, file: print(*args),
|
||||
(False, False, True):
|
||||
lambda args, sep, end, file: print(file=file, *args),
|
||||
lambda args, sep, end, file: print(file=file, *args),
|
||||
(False, True, False):
|
||||
lambda args, sep, end, file: print(end=end, *args),
|
||||
lambda args, sep, end, file: print(end=end, *args),
|
||||
(False, True, True):
|
||||
lambda args, sep, end, file: print(end=end, file=file, *args),
|
||||
lambda args, sep, end, file: print(end=end, file=file, *args),
|
||||
(True, False, False):
|
||||
lambda args, sep, end, file: print(sep=sep, *args),
|
||||
lambda args, sep, end, file: print(sep=sep, *args),
|
||||
(True, False, True):
|
||||
lambda args, sep, end, file: print(sep=sep, file=file, *args),
|
||||
lambda args, sep, end, file: print(sep=sep, file=file, *args),
|
||||
(True, True, False):
|
||||
lambda args, sep, end, file: print(sep=sep, end=end, *args),
|
||||
lambda args, sep, end, file: print(sep=sep, end=end, *args),
|
||||
(True, True, True):
|
||||
lambda args, sep, end, file: print(sep=sep, end=end, file=file, *args),
|
||||
}
|
||||
lambda args, sep, end, file: print(sep=sep, end=end, file=file, *args),
|
||||
}
|
||||
|
||||
|
||||
# Class used to test __str__ and print
|
||||
class ClassWith__str__:
|
||||
def __init__(self, x):
|
||||
self.x = x
|
||||
|
||||
def __str__(self):
|
||||
return self.x
|
||||
|
||||
class TestPrint(unittest.TestCase):
|
||||
def check(self, expected, args,
|
||||
sep=NotDefined, end=NotDefined, file=NotDefined):
|
||||
# Capture sys.stdout in a StringIO. Call print with args,
|
||||
# and with sep, end, and file, if they're defined. Result
|
||||
# must match expected.
|
||||
|
||||
# Look up the actual function to call, based on if sep, end, and file
|
||||
# are defined
|
||||
class TestPrint(unittest.TestCase):
|
||||
"""Test correct operation of the print function."""
|
||||
|
||||
def check(self, expected, args,
|
||||
sep=NotDefined, end=NotDefined, file=NotDefined):
|
||||
# Capture sys.stdout in a StringIO. Call print with args,
|
||||
# and with sep, end, and file, if they're defined. Result
|
||||
# must match expected.
|
||||
|
||||
# Look up the actual function to call, based on if sep, end,
|
||||
# and file are defined.
|
||||
fn = dispatch[(sep is not NotDefined,
|
||||
end is not NotDefined,
|
||||
file is not NotDefined)]
|
||||
|
@ -69,7 +62,7 @@ class TestPrint(unittest.TestCase):
|
|||
def test_print(self):
|
||||
def x(expected, args, sep=NotDefined, end=NotDefined):
|
||||
# Run the test 2 ways: not using file, and using
|
||||
# file directed to a StringIO
|
||||
# file directed to a StringIO.
|
||||
|
||||
self.check(expected, args, sep=sep, end=end)
|
||||
|
||||
|
@ -101,11 +94,6 @@ class TestPrint(unittest.TestCase):
|
|||
x('*\n', (ClassWith__str__('*'),))
|
||||
x('abc 1\n', (ClassWith__str__('abc'), 1))
|
||||
|
||||
# # 2.x unicode tests
|
||||
# x(u'1 2\n', ('1', u'2'))
|
||||
# x(u'u\1234\n', (u'u\1234',))
|
||||
# x(u' abc 1\n', (' ', ClassWith__str__(u'abc'), 1))
|
||||
|
||||
# errors
|
||||
self.assertRaises(TypeError, print, '', sep=3)
|
||||
self.assertRaises(TypeError, print, '', end=3)
|
||||
|
@ -113,12 +101,14 @@ class TestPrint(unittest.TestCase):
|
|||
|
||||
def test_print_flush(self):
|
||||
# operation of the flush flag
|
||||
class filelike():
|
||||
class filelike:
|
||||
def __init__(self):
|
||||
self.written = ''
|
||||
self.flushed = 0
|
||||
|
||||
def write(self, str):
|
||||
self.written += str
|
||||
|
||||
def flush(self):
|
||||
self.flushed += 1
|
||||
|
||||
|
@ -130,15 +120,13 @@ class TestPrint(unittest.TestCase):
|
|||
self.assertEqual(f.flushed, 2)
|
||||
|
||||
# ensure exceptions from flush are passed through
|
||||
class noflush():
|
||||
class noflush:
|
||||
def write(self, str):
|
||||
pass
|
||||
|
||||
def flush(self):
|
||||
raise RuntimeError
|
||||
self.assertRaises(RuntimeError, print, 1, file=noflush(), flush=True)
|
||||
|
||||
def test_main():
|
||||
support.run_unittest(TestPrint)
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_main()
|
||||
unittest.main()
|
||||
|
|
Loading…
Reference in New Issue