1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
class AppTestWriter(object):
spaceconfig = dict(usemodules=['_csv'])
def setup_class(cls):
w__write_test = cls.space.appexec([], r"""():
import _csv
class DummyFile(object):
def __init__(self):
self._parts = []
self.write = self._parts.append
def getvalue(self):
return ''.join(self._parts)
def _write_test(fields, expect, **kwargs):
fileobj = DummyFile()
writer = _csv.writer(fileobj, **kwargs)
if len(fields) > 0 and type(fields[0]) is list:
writer.writerows(fields)
else:
writer.writerow(fields)
result = fileobj.getvalue()
expect += writer.dialect.lineterminator
assert result == expect, 'result: %r\nexpect: %r' % (
result, expect)
return _write_test
""")
if type(w__write_test) is type(lambda:0):
w__write_test = staticmethod(w__write_test)
cls.w__write_test = w__write_test
def test_write_arg_valid(self):
import _csv as csv
raises(TypeError, self._write_test, None, '') # xxx different API!
self._write_test((), '')
self._write_test([None], '""')
raises(csv.Error, self._write_test,
[None], None, quoting = csv.QUOTE_NONE)
# Check that exceptions are passed up the chain
class BadList:
def __len__(self):
return 10;
def __getitem__(self, i):
if i > 2:
raise IOError
raises(IOError, self._write_test, BadList(), '')
class BadItem:
def __str__(self):
raise IOError
raises(IOError, self._write_test, [BadItem()], '')
def test_write_quoting(self):
import _csv as csv
self._write_test(['a',1,'p,q'], 'a,1,"p,q"')
raises(csv.Error, self._write_test,
['a',1,'p,q'], 'a,1,p,q',
quoting = csv.QUOTE_NONE)
self._write_test(['a',1,'p,q'], 'a,1,"p,q"',
quoting = csv.QUOTE_MINIMAL)
self._write_test(['a',1,'p,q'], '"a",1,"p,q"',
quoting = csv.QUOTE_NONNUMERIC)
self._write_test(['a',1,'p,q'], '"a","1","p,q"',
quoting = csv.QUOTE_ALL)
self._write_test(['a\nb',1], '"a\nb","1"',
quoting = csv.QUOTE_ALL)
def test_write_escape(self):
import _csv as csv
self._write_test(['a',1,'p,q'], 'a,1,"p,q"',
escapechar='\\')
raises(csv.Error, self._write_test,
['a',1,'p,"q"'], 'a,1,"p,\\"q\\""',
escapechar=None, doublequote=False)
self._write_test(['a',1,'p,"q"'], 'a,1,"p,\\"q\\""',
escapechar='\\', doublequote = False)
self._write_test(['"'], '""""',
escapechar='\\', quoting = csv.QUOTE_MINIMAL)
self._write_test(['"'], '\\"',
escapechar='\\', quoting = csv.QUOTE_MINIMAL,
doublequote = False)
self._write_test(['"'], '\\"',
escapechar='\\', quoting = csv.QUOTE_NONE)
self._write_test(['a',1,'p,q'], 'a,1,p\\,q',
escapechar='\\', quoting = csv.QUOTE_NONE)
def test_writerows(self):
self._write_test([['a'],['b','c']], 'a\r\nb,c')
|