1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2001,2002 Python Software Foundation
3 # csv package unit tests
7 from StringIO
import StringIO
10 from test
import test_support
12 class Test_Csv(unittest
.TestCase
):
14 Test the underlying C csv parser in ways that are not appropriate
15 from the high level interface. Further tests of this nature are done
16 in TestDialectRegistry.
18 def test_reader_arg_valid(self
):
19 self
.assertRaises(TypeError, csv
.reader
)
20 self
.assertRaises(TypeError, csv
.reader
, None)
21 self
.assertRaises(AttributeError, csv
.reader
, [], bad_attr
= 0)
22 self
.assertRaises(csv
.Error
, csv
.reader
, [], 'foo')
26 self
.assertRaises(IOError, csv
.reader
, [], BadClass
)
27 self
.assertRaises(TypeError, csv
.reader
, [], None)
30 self
.assertRaises(AttributeError, csv
.reader
, [], BadDialect
)
32 def test_writer_arg_valid(self
):
33 self
.assertRaises(TypeError, csv
.writer
)
34 self
.assertRaises(TypeError, csv
.writer
, None)
35 self
.assertRaises(AttributeError, csv
.writer
, StringIO(), bad_attr
= 0)
37 def _test_attrs(self
, obj
):
38 self
.assertEqual(obj
.dialect
.delimiter
, ',')
39 obj
.dialect
.delimiter
= '\t'
40 self
.assertEqual(obj
.dialect
.delimiter
, '\t')
41 self
.assertRaises(TypeError, delattr, obj
.dialect
, 'delimiter')
42 self
.assertRaises(TypeError, setattr, obj
.dialect
,
43 'lineterminator', None)
44 obj
.dialect
.escapechar
= None
45 self
.assertEqual(obj
.dialect
.escapechar
, None)
46 self
.assertRaises(TypeError, delattr, obj
.dialect
, 'quoting')
47 self
.assertRaises(TypeError, setattr, obj
.dialect
, 'quoting', None)
48 obj
.dialect
.quoting
= csv
.QUOTE_MINIMAL
49 self
.assertEqual(obj
.dialect
.quoting
, csv
.QUOTE_MINIMAL
)
51 def test_reader_attrs(self
):
52 self
._test
_attrs
(csv
.reader([]))
54 def test_writer_attrs(self
):
55 self
._test
_attrs
(csv
.writer(StringIO()))
57 def _write_test(self
, fields
, expect
, **kwargs
):
59 writer
= csv
.writer(fileobj
, **kwargs
)
60 writer
.writerow(fields
)
61 self
.assertEqual(fileobj
.getvalue(),
62 expect
+ writer
.dialect
.lineterminator
)
64 def test_write_arg_valid(self
):
65 self
.assertRaises(csv
.Error
, self
._write
_test
, None, '')
66 self
._write
_test
((), '')
67 self
._write
_test
([None], '""')
68 self
.assertRaises(csv
.Error
, self
._write
_test
,
69 [None], None, quoting
= csv
.QUOTE_NONE
)
70 # Check that exceptions are passed up the chain
74 def __getitem__(self
, i
):
77 self
.assertRaises(IOError, self
._write
_test
, BadList(), '')
81 self
.assertRaises(IOError, self
._write
_test
, [BadItem()], '')
83 def test_write_bigfield(self
):
84 # This exercises the buffer realloc functionality
85 bigstring
= 'X' * 50000
86 self
._write
_test
([bigstring
,bigstring
], '%s,%s' % \
87 (bigstring
, bigstring
))
89 def test_write_quoting(self
):
90 self
._write
_test
(['a','1','p,q'], 'a,1,"p,q"')
91 self
.assertRaises(csv
.Error
,
93 ['a','1','p,q'], 'a,1,"p,q"',
94 quoting
= csv
.QUOTE_NONE
)
95 self
._write
_test
(['a','1','p,q'], 'a,1,"p,q"',
96 quoting
= csv
.QUOTE_MINIMAL
)
97 self
._write
_test
(['a','1','p,q'], '"a",1,"p,q"',
98 quoting
= csv
.QUOTE_NONNUMERIC
)
99 self
._write
_test
(['a','1','p,q'], '"a","1","p,q"',
100 quoting
= csv
.QUOTE_ALL
)
102 def test_write_escape(self
):
103 self
._write
_test
(['a','1','p,q'], 'a,1,"p,q"',
105 # FAILED - needs to be fixed [am]:
106 # self._write_test(['a','1','p,"q"'], 'a,1,"p,\\"q\\"',
107 # escapechar='\\', doublequote = 0)
108 self
._write
_test
(['a','1','p,q'], 'a,1,p\\,q',
109 escapechar
='\\', quoting
= csv
.QUOTE_NONE
)
111 def test_writerows(self
):
113 def write(self
, buf
):
115 writer
= csv
.writer(BrokenFile())
116 self
.assertRaises(IOError, writer
.writerows
, [['a']])
118 writer
= csv
.writer(fileobj
)
119 self
.assertRaises(TypeError, writer
.writerows
, None)
120 writer
.writerows([['a','b'],['c','d']])
121 self
.assertEqual(fileobj
.getvalue(), "a,b\r\nc,d\r\n")
123 def _read_test(self
, input, expect
, **kwargs
):
124 reader
= csv
.reader(input, **kwargs
)
125 result
= list(reader
)
126 self
.assertEqual(result
, expect
)
128 def test_read_oddinputs(self
):
129 self
._read
_test
([], [])
130 self
._read
_test
([''], [[]])
131 self
.assertRaises(csv
.Error
, self
._read
_test
,
132 ['"ab"c'], None, strict
= 1)
133 # cannot handle null bytes for the moment
134 self
.assertRaises(csv
.Error
, self
._read
_test
,
135 ['ab\0c'], None, strict
= 1)
136 self
._read
_test
(['"ab"c'], [['abc']], doublequote
= 0)
138 def test_read_eol(self
):
139 self
._read
_test
(['a,b'], [['a','b']])
140 self
._read
_test
(['a,b\n'], [['a','b']])
141 self
._read
_test
(['a,b\r\n'], [['a','b']])
142 self
._read
_test
(['a,b\r'], [['a','b']])
143 self
.assertRaises(csv
.Error
, self
._read
_test
, ['a,b\rc,d'], [])
144 self
.assertRaises(csv
.Error
, self
._read
_test
, ['a,b\nc,d'], [])
145 self
.assertRaises(csv
.Error
, self
._read
_test
, ['a,b\r\nc,d'], [])
147 def test_read_escape(self
):
148 self
._read
_test
(['a,\\b,c'], [['a', '\\b', 'c']], escapechar
='\\')
149 self
._read
_test
(['a,b\\,c'], [['a', 'b,c']], escapechar
='\\')
150 self
._read
_test
(['a,"b\\,c"'], [['a', 'b,c']], escapechar
='\\')
151 self
._read
_test
(['a,"b,\\c"'], [['a', 'b,\\c']], escapechar
='\\')
152 self
._read
_test
(['a,"b,c\\""'], [['a', 'b,c"']], escapechar
='\\')
153 self
._read
_test
(['a,"b,c"\\'], [['a', 'b,c\\']], escapechar
='\\')
155 def test_read_bigfield(self
):
156 # This exercises the buffer realloc functionality
157 bigstring
= 'X' * 50000
158 bigline
= '%s,%s' % (bigstring
, bigstring
)
159 self
._read
_test
([bigline
], [[bigstring
, bigstring
]])
161 class TestDialectRegistry(unittest
.TestCase
):
162 def test_registry_badargs(self
):
163 self
.assertRaises(TypeError, csv
.list_dialects
, None)
164 self
.assertRaises(TypeError, csv
.get_dialect
)
165 self
.assertRaises(csv
.Error
, csv
.get_dialect
, None)
166 self
.assertRaises(csv
.Error
, csv
.get_dialect
, "nonesuch")
167 self
.assertRaises(TypeError, csv
.unregister_dialect
)
168 self
.assertRaises(csv
.Error
, csv
.unregister_dialect
, None)
169 self
.assertRaises(csv
.Error
, csv
.unregister_dialect
, "nonesuch")
170 self
.assertRaises(TypeError, csv
.register_dialect
, None)
171 self
.assertRaises(TypeError, csv
.register_dialect
, None, None)
172 self
.assertRaises(TypeError, csv
.register_dialect
, "nonesuch", None)
176 self
.assertRaises(KeyError, csv
.register_dialect
, "nonesuch", bogus
)
178 def test_registry(self
):
179 class myexceltsv(csv
.excel
):
182 expected_dialects
= csv
.list_dialects() + [name
]
183 expected_dialects
.sort()
184 csv
.register_dialect(name
, myexceltsv
)
186 self
.failUnless(isinstance(csv
.get_dialect(name
), myexceltsv
))
187 got_dialects
= csv
.list_dialects()
189 self
.assertEqual(expected_dialects
, got_dialects
)
191 csv
.unregister_dialect(name
)
193 def test_incomplete_dialect(self
):
194 class myexceltsv(csv
.Dialect
):
196 self
.assertRaises(csv
.Error
, myexceltsv
)
198 def test_space_dialect(self
):
199 class space(csv
.excel
):
201 quoting
= csv
.QUOTE_NONE
204 s
= StringIO("abc def\nc1ccccc1 benzene\n")
205 rdr
= csv
.reader(s
, dialect
=space())
206 self
.assertEqual(rdr
.next(), ["abc", "def"])
207 self
.assertEqual(rdr
.next(), ["c1ccccc1", "benzene"])
209 def test_dialect_apply(self
):
210 class testA(csv
.excel
):
212 class testB(csv
.excel
):
214 class testC(csv
.excel
):
217 csv
.register_dialect('testC', testC
)
220 writer
= csv
.writer(fileobj
)
221 writer
.writerow([1,2,3])
222 self
.assertEqual(fileobj
.getvalue(), "1,2,3\r\n")
225 writer
= csv
.writer(fileobj
, testA
)
226 writer
.writerow([1,2,3])
227 self
.assertEqual(fileobj
.getvalue(), "1\t2\t3\r\n")
230 writer
= csv
.writer(fileobj
, dialect
=testB())
231 writer
.writerow([1,2,3])
232 self
.assertEqual(fileobj
.getvalue(), "1:2:3\r\n")
235 writer
= csv
.writer(fileobj
, dialect
='testC')
236 writer
.writerow([1,2,3])
237 self
.assertEqual(fileobj
.getvalue(), "1|2|3\r\n")
240 writer
= csv
.writer(fileobj
, dialect
=testA
, delimiter
=';')
241 writer
.writerow([1,2,3])
242 self
.assertEqual(fileobj
.getvalue(), "1;2;3\r\n")
244 csv
.unregister_dialect('testC')
246 def test_bad_dialect(self
):
248 self
.assertRaises(AttributeError, csv
.reader
, [], bad_attr
= 0)
250 self
.assertRaises(TypeError, csv
.reader
, [], delimiter
= None)
251 self
.assertRaises(TypeError, csv
.reader
, [], quoting
= -1)
252 self
.assertRaises(TypeError, csv
.reader
, [], quoting
= 100)
254 class TestCsvBase(unittest
.TestCase
):
255 def readerAssertEqual(self
, input, expected_result
):
256 reader
= csv
.reader(StringIO(input), dialect
= self
.dialect
)
257 fields
= list(reader
)
258 self
.assertEqual(fields
, expected_result
)
260 def writerAssertEqual(self
, input, expected_result
):
262 writer
= csv
.writer(fileobj
, dialect
= self
.dialect
)
263 writer
.writerows(input)
264 self
.assertEqual(fileobj
.getvalue(), expected_result
)
266 class TestDialectExcel(TestCsvBase
):
269 def test_single(self
):
270 self
.readerAssertEqual('abc', [['abc']])
272 def test_simple(self
):
273 self
.readerAssertEqual('1,2,3,4,5', [['1','2','3','4','5']])
275 def test_blankline(self
):
276 self
.readerAssertEqual('', [])
278 def test_empty_fields(self
):
279 self
.readerAssertEqual(',', [['', '']])
281 def test_singlequoted(self
):
282 self
.readerAssertEqual('""', [['']])
284 def test_singlequoted_left_empty(self
):
285 self
.readerAssertEqual('"",', [['','']])
287 def test_singlequoted_right_empty(self
):
288 self
.readerAssertEqual(',""', [['','']])
290 def test_single_quoted_quote(self
):
291 self
.readerAssertEqual('""""', [['"']])
293 def test_quoted_quotes(self
):
294 self
.readerAssertEqual('""""""', [['""']])
296 def test_inline_quote(self
):
297 self
.readerAssertEqual('a""b', [['a""b']])
299 def test_inline_quotes(self
):
300 self
.readerAssertEqual('a"b"c', [['a"b"c']])
302 def test_quotes_and_more(self
):
303 self
.readerAssertEqual('"a"b', [['ab']])
305 def test_lone_quote(self
):
306 self
.readerAssertEqual('a"b', [['a"b']])
308 def test_quote_and_quote(self
):
309 self
.readerAssertEqual('"a" "b"', [['a "b"']])
311 def test_space_and_quote(self
):
312 self
.readerAssertEqual(' "a"', [[' "a"']])
314 def test_quoted(self
):
315 self
.readerAssertEqual('1,2,3,"I think, therefore I am",5,6',
317 'I think, therefore I am',
320 def test_quoted_quote(self
):
321 self
.readerAssertEqual('1,2,3,"""I see,"" said the blind man","as he picked up his hammer and saw"',
323 '"I see," said the blind man',
324 'as he picked up his hammer and saw']])
326 def test_quoted_nl(self
):
329 said the blind man","as he picked up his
332 self
.readerAssertEqual(input,
334 '"I see,"\nsaid the blind man',
335 'as he picked up his\nhammer and saw'],
338 def test_dubious_quote(self
):
339 self
.readerAssertEqual('12,12,1",', [['12', '12', '1"', '']])
342 self
.writerAssertEqual([], '')
344 def test_single(self
):
345 self
.writerAssertEqual([['abc']], 'abc\r\n')
347 def test_simple(self
):
348 self
.writerAssertEqual([[1, 2, 'abc', 3, 4]], '1,2,abc,3,4\r\n')
350 def test_quotes(self
):
351 self
.writerAssertEqual([[1, 2, 'a"bc"', 3, 4]], '1,2,"a""bc""",3,4\r\n')
353 def test_quote_fieldsep(self
):
354 self
.writerAssertEqual([['abc,def']], '"abc,def"\r\n')
356 def test_newlines(self
):
357 self
.writerAssertEqual([[1, 2, 'a\nbc', 3, 4]], '1,2,"a\nbc",3,4\r\n')
359 class EscapedExcel(csv
.excel
):
360 quoting
= csv
.QUOTE_NONE
363 class TestEscapedExcel(TestCsvBase
):
364 dialect
= EscapedExcel()
366 def test_escape_fieldsep(self
):
367 self
.writerAssertEqual([['abc,def']], 'abc\\,def\r\n')
369 def test_read_escape_fieldsep(self
):
370 self
.readerAssertEqual('abc\\,def\r\n', [['abc,def']])
372 class QuotedEscapedExcel(csv
.excel
):
373 quoting
= csv
.QUOTE_NONNUMERIC
376 class TestQuotedEscapedExcel(TestCsvBase
):
377 dialect
= QuotedEscapedExcel()
379 def test_write_escape_fieldsep(self
):
380 self
.writerAssertEqual([['abc,def']], '"abc,def"\r\n')
382 def test_read_escape_fieldsep(self
):
383 self
.readerAssertEqual('"abc\\,def"\r\n', [['abc,def']])
385 # Disabled, pending support in csv.utils module
386 class TestDictFields(unittest
.TestCase
):
387 ### "long" means the row is longer than the number of fieldnames
388 ### "short" means there are fewer elements in the row than fieldnames
389 def test_write_simple_dict(self
):
391 writer
= csv
.DictWriter(fileobj
, fieldnames
= ["f1", "f2", "f3"])
392 writer
.writerow({"f1": 10, "f3": "abc"})
393 self
.assertEqual(fileobj
.getvalue(), "10,,abc\r\n")
395 def test_write_no_fields(self
):
397 self
.assertRaises(TypeError, csv
.DictWriter
, fileobj
)
399 def test_read_dict_fields(self
):
400 reader
= csv
.DictReader(StringIO("1,2,abc\r\n"),
401 fieldnames
=["f1", "f2", "f3"])
402 self
.assertEqual(reader
.next(), {"f1": '1', "f2": '2', "f3": 'abc'})
404 def test_read_long(self
):
405 reader
= csv
.DictReader(StringIO("1,2,abc,4,5,6\r\n"),
406 fieldnames
=["f1", "f2"])
407 self
.assertEqual(reader
.next(), {"f1": '1', "f2": '2',
408 None: ["abc", "4", "5", "6"]})
410 def test_read_long_with_rest(self
):
411 reader
= csv
.DictReader(StringIO("1,2,abc,4,5,6\r\n"),
412 fieldnames
=["f1", "f2"], restkey
="_rest")
413 self
.assertEqual(reader
.next(), {"f1": '1', "f2": '2',
414 "_rest": ["abc", "4", "5", "6"]})
416 def test_read_short(self
):
417 reader
= csv
.DictReader(["1,2,abc,4,5,6\r\n","1,2,abc\r\n"],
418 fieldnames
="1 2 3 4 5 6".split(),
420 self
.assertEqual(reader
.next(), {"1": '1', "2": '2', "3": 'abc',
421 "4": '4', "5": '5', "6": '6'})
422 self
.assertEqual(reader
.next(), {"1": '1', "2": '2', "3": 'abc',
423 "4": 'DEFAULT', "5": 'DEFAULT',
426 def test_read_multi(self
):
428 '2147483648,43.0e12,17,abc,def\r\n',
429 '147483648,43.0e2,17,abc,def\r\n',
430 '47483648,43.0,170,abc,def\r\n'
433 reader
= csv
.DictReader(sample
,
434 fieldnames
="i1 float i2 s1 s2".split())
435 self
.assertEqual(reader
.next(), {"i1": '2147483648',
441 def test_read_with_blanks(self
):
442 reader
= csv
.DictReader(["1,2,abc,4,5,6\r\n","\r\n",
443 "1,2,abc,4,5,6\r\n"],
444 fieldnames
="1 2 3 4 5 6".split())
445 self
.assertEqual(reader
.next(), {"1": '1', "2": '2', "3": 'abc',
446 "4": '4', "5": '5', "6": '6'})
447 self
.assertEqual(reader
.next(), {"1": '1', "2": '2', "3": 'abc',
448 "4": '4', "5": '5', "6": '6'})
450 class TestArrayWrites(unittest
.TestCase
):
451 def test_int_write(self
):
453 contents
= [(20-i
) for i
in range(20)]
454 a
= array
.array('i', contents
)
456 writer
= csv
.writer(fileobj
, dialect
="excel")
458 expected
= ",".join([str(i
) for i
in a
])+"\r\n"
459 self
.assertEqual(fileobj
.getvalue(), expected
)
461 def test_double_write(self
):
463 contents
= [(20-i
)*0.1 for i
in range(20)]
464 a
= array
.array('d', contents
)
466 writer
= csv
.writer(fileobj
, dialect
="excel")
468 expected
= ",".join([str(i
) for i
in a
])+"\r\n"
469 self
.assertEqual(fileobj
.getvalue(), expected
)
471 def test_float_write(self
):
473 contents
= [(20-i
)*0.1 for i
in range(20)]
474 a
= array
.array('f', contents
)
476 writer
= csv
.writer(fileobj
, dialect
="excel")
478 expected
= ",".join([str(i
) for i
in a
])+"\r\n"
479 self
.assertEqual(fileobj
.getvalue(), expected
)
481 def test_char_write(self
):
483 a
= array
.array('c', string
.letters
)
485 writer
= csv
.writer(fileobj
, dialect
="excel")
487 expected
= ",".join(a
)+"\r\n"
488 self
.assertEqual(fileobj
.getvalue(), expected
)
490 class TestDialectValidity(unittest
.TestCase
):
491 def test_quoting(self
):
492 class mydialect(csv
.Dialect
):
496 skipinitialspace
= True
497 lineterminator
= '\r\n'
498 quoting
= csv
.QUOTE_NONE
501 mydialect
.quoting
= None
502 self
.assertRaises(csv
.Error
, mydialect
)
504 mydialect
.quoting
= csv
.QUOTE_NONE
505 mydialect
.escapechar
= None
506 self
.assertRaises(csv
.Error
, mydialect
)
508 mydialect
.doublequote
= True
509 mydialect
.quoting
= csv
.QUOTE_ALL
510 mydialect
.quotechar
= '"'
513 mydialect
.quotechar
= "''"
514 self
.assertRaises(csv
.Error
, mydialect
)
516 mydialect
.quotechar
= 4
517 self
.assertRaises(csv
.Error
, mydialect
)
519 def test_delimiter(self
):
520 class mydialect(csv
.Dialect
):
524 skipinitialspace
= True
525 lineterminator
= '\r\n'
526 quoting
= csv
.QUOTE_NONE
529 mydialect
.delimiter
= ":::"
530 self
.assertRaises(csv
.Error
, mydialect
)
532 mydialect
.delimiter
= 4
533 self
.assertRaises(csv
.Error
, mydialect
)
535 def test_lineterminator(self
):
536 class mydialect(csv
.Dialect
):
540 skipinitialspace
= True
541 lineterminator
= '\r\n'
542 quoting
= csv
.QUOTE_NONE
545 mydialect
.lineterminator
= ":::"
548 mydialect
.lineterminator
= 4
549 self
.assertRaises(csv
.Error
, mydialect
)
552 class TestSniffer(unittest
.TestCase
):
554 Harry's, Arlington Heights, IL, 2/1/03, Kimi Hayes
555 Shark City, Glendale Heights, IL, 12/28/02, Prezence
556 Tommy's Place, Blue Island, IL, 12/28/02, Blue Sunday/White Crow
557 Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back
560 'Harry''s':'Arlington Heights':'IL':'2/1/03':'Kimi Hayes'
561 'Shark City':'Glendale Heights':'IL':'12/28/02':'Prezence'
562 'Tommy''s Place':'Blue Island':'IL':'12/28/02':'Blue Sunday/White Crow'
563 'Stonecutters Seafood and Chop House':'Lemont':'IL':'12/19/02':'Week Back'
567 "venue","city","state","date","performers"
570 05/05/03?05/05/03?05/05/03?05/05/03?05/05/03?05/05/03
571 05/05/03?05/05/03?05/05/03?05/05/03?05/05/03?05/05/03
572 05/05/03?05/05/03?05/05/03?05/05/03?05/05/03?05/05/03
576 2147483648;43.0e12;17;abc;def
577 147483648;43.0e2;17;abc;def
578 47483648;43.0;170;abc;def
581 def test_has_header(self
):
582 sniffer
= csv
.Sniffer()
583 self
.assertEqual(sniffer
.has_header(self
.sample1
), False)
584 self
.assertEqual(sniffer
.has_header(self
.header
+self
.sample1
), True)
586 def test_sniff(self
):
587 sniffer
= csv
.Sniffer()
588 dialect
= sniffer
.sniff(self
.sample1
)
589 self
.assertEqual(dialect
.delimiter
, ",")
590 self
.assertEqual(dialect
.quotechar
, '"')
591 self
.assertEqual(dialect
.skipinitialspace
, True)
593 dialect
= sniffer
.sniff(self
.sample2
)
594 self
.assertEqual(dialect
.delimiter
, ":")
595 self
.assertEqual(dialect
.quotechar
, "'")
596 self
.assertEqual(dialect
.skipinitialspace
, False)
598 def test_delimiters(self
):
599 sniffer
= csv
.Sniffer()
600 dialect
= sniffer
.sniff(self
.sample3
)
601 self
.assertEqual(dialect
.delimiter
, "0")
602 dialect
= sniffer
.sniff(self
.sample3
, delimiters
="?,")
603 self
.assertEqual(dialect
.delimiter
, "?")
604 dialect
= sniffer
.sniff(self
.sample3
, delimiters
="/,")
605 self
.assertEqual(dialect
.delimiter
, "/")
606 dialect
= sniffer
.sniff(self
.sample4
)
607 self
.assertEqual(dialect
.delimiter
, ";")
609 if not hasattr(sys
, "gettotalrefcount"):
610 if test_support
.verbose
: print "*** skipping leakage tests ***"
617 class TestLeaks(unittest
.TestCase
):
618 def test_create_read(self
):
620 lastrc
= sys
.gettotalrefcount()
623 self
.assertEqual(gc
.garbage
, [])
624 rc
= sys
.gettotalrefcount()
625 csv
.reader(["a,b,c\r\n"])
626 csv
.reader(["a,b,c\r\n"])
627 csv
.reader(["a,b,c\r\n"])
630 # if csv.reader() leaks, last delta should be 3 or more
631 self
.assertEqual(delta
< 3, True)
633 def test_create_write(self
):
635 lastrc
= sys
.gettotalrefcount()
639 self
.assertEqual(gc
.garbage
, [])
640 rc
= sys
.gettotalrefcount()
646 # if csv.writer() leaks, last delta should be 3 or more
647 self
.assertEqual(delta
< 3, True)
651 rows
= ["a,b,c\r\n"]*5
652 lastrc
= sys
.gettotalrefcount()
655 self
.assertEqual(gc
.garbage
, [])
656 rc
= sys
.gettotalrefcount()
657 rdr
= csv
.reader(rows
)
662 # if reader leaks during read, delta should be 5 or more
663 self
.assertEqual(delta
< 5, True)
665 def test_write(self
):
669 lastrc
= sys
.gettotalrefcount()
672 self
.assertEqual(gc
.garbage
, [])
673 rc
= sys
.gettotalrefcount()
674 writer
= csv
.writer(s
)
679 # if writer leaks during write, last delta should be 5 or more
680 self
.assertEqual(delta
< 5, True)
682 # commented out for now - csv module doesn't yet support Unicode
684 from StringIO
import StringIO
687 class TestUnicode(unittest
.TestCase
):
688 def test_unicode_read(self
):
690 f
= codecs
.EncodedFile(StringIO("Martin von Löwis,"
691 "Marc André Lemburg,"
693 "François Pinard\r\n"),
694 data_encoding
='iso-8859-1')
695 reader
= csv
.reader(f
)
696 self
.assertEqual(list(reader
), [[u
"Martin von Löwis",
697 u
"Marc André Lemburg",
699 u
"François Pinardn"]])
702 mod
= sys
.modules
[__name__
]
703 test_support
.run_unittest(
704 *[getattr(mod
, name
) for name
in dir(mod
) if name
.startswith('Test')]
707 if __name__
== '__main__':