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 def test_read_semi_sep(self
):
451 reader
= csv
.DictReader(["1;2;abc;4;5;6\r\n"],
452 fieldnames
="1 2 3 4 5 6".split(),
454 self
.assertEqual(reader
.next(), {"1": '1', "2": '2', "3": 'abc',
455 "4": '4', "5": '5', "6": '6'})
457 class TestArrayWrites(unittest
.TestCase
):
458 def test_int_write(self
):
460 contents
= [(20-i
) for i
in range(20)]
461 a
= array
.array('i', contents
)
463 writer
= csv
.writer(fileobj
, dialect
="excel")
465 expected
= ",".join([str(i
) for i
in a
])+"\r\n"
466 self
.assertEqual(fileobj
.getvalue(), expected
)
468 def test_double_write(self
):
470 contents
= [(20-i
)*0.1 for i
in range(20)]
471 a
= array
.array('d', contents
)
473 writer
= csv
.writer(fileobj
, dialect
="excel")
475 expected
= ",".join([str(i
) for i
in a
])+"\r\n"
476 self
.assertEqual(fileobj
.getvalue(), expected
)
478 def test_float_write(self
):
480 contents
= [(20-i
)*0.1 for i
in range(20)]
481 a
= array
.array('f', contents
)
483 writer
= csv
.writer(fileobj
, dialect
="excel")
485 expected
= ",".join([str(i
) for i
in a
])+"\r\n"
486 self
.assertEqual(fileobj
.getvalue(), expected
)
488 def test_char_write(self
):
490 a
= array
.array('c', string
.letters
)
492 writer
= csv
.writer(fileobj
, dialect
="excel")
494 expected
= ",".join(a
)+"\r\n"
495 self
.assertEqual(fileobj
.getvalue(), expected
)
497 class TestDialectValidity(unittest
.TestCase
):
498 def test_quoting(self
):
499 class mydialect(csv
.Dialect
):
503 skipinitialspace
= True
504 lineterminator
= '\r\n'
505 quoting
= csv
.QUOTE_NONE
508 mydialect
.quoting
= None
509 self
.assertRaises(csv
.Error
, mydialect
)
511 mydialect
.quoting
= csv
.QUOTE_NONE
512 mydialect
.escapechar
= None
513 self
.assertRaises(csv
.Error
, mydialect
)
515 mydialect
.doublequote
= True
516 mydialect
.quoting
= csv
.QUOTE_ALL
517 mydialect
.quotechar
= '"'
520 mydialect
.quotechar
= "''"
521 self
.assertRaises(csv
.Error
, mydialect
)
523 mydialect
.quotechar
= 4
524 self
.assertRaises(csv
.Error
, mydialect
)
526 def test_delimiter(self
):
527 class mydialect(csv
.Dialect
):
531 skipinitialspace
= True
532 lineterminator
= '\r\n'
533 quoting
= csv
.QUOTE_NONE
536 mydialect
.delimiter
= ":::"
537 self
.assertRaises(csv
.Error
, mydialect
)
539 mydialect
.delimiter
= 4
540 self
.assertRaises(csv
.Error
, mydialect
)
542 def test_lineterminator(self
):
543 class mydialect(csv
.Dialect
):
547 skipinitialspace
= True
548 lineterminator
= '\r\n'
549 quoting
= csv
.QUOTE_NONE
552 mydialect
.lineterminator
= ":::"
555 mydialect
.lineterminator
= 4
556 self
.assertRaises(csv
.Error
, mydialect
)
559 class TestSniffer(unittest
.TestCase
):
561 Harry's, Arlington Heights, IL, 2/1/03, Kimi Hayes
562 Shark City, Glendale Heights, IL, 12/28/02, Prezence
563 Tommy's Place, Blue Island, IL, 12/28/02, Blue Sunday/White Crow
564 Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back
567 'Harry''s':'Arlington Heights':'IL':'2/1/03':'Kimi Hayes'
568 'Shark City':'Glendale Heights':'IL':'12/28/02':'Prezence'
569 'Tommy''s Place':'Blue Island':'IL':'12/28/02':'Blue Sunday/White Crow'
570 'Stonecutters Seafood and Chop House':'Lemont':'IL':'12/19/02':'Week Back'
574 "venue","city","state","date","performers"
577 05/05/03?05/05/03?05/05/03?05/05/03?05/05/03?05/05/03
578 05/05/03?05/05/03?05/05/03?05/05/03?05/05/03?05/05/03
579 05/05/03?05/05/03?05/05/03?05/05/03?05/05/03?05/05/03
583 2147483648;43.0e12;17;abc;def
584 147483648;43.0e2;17;abc;def
585 47483648;43.0;170;abc;def
588 def test_has_header(self
):
589 sniffer
= csv
.Sniffer()
590 self
.assertEqual(sniffer
.has_header(self
.sample1
), False)
591 self
.assertEqual(sniffer
.has_header(self
.header
+self
.sample1
), True)
593 def test_sniff(self
):
594 sniffer
= csv
.Sniffer()
595 dialect
= sniffer
.sniff(self
.sample1
)
596 self
.assertEqual(dialect
.delimiter
, ",")
597 self
.assertEqual(dialect
.quotechar
, '"')
598 self
.assertEqual(dialect
.skipinitialspace
, True)
600 dialect
= sniffer
.sniff(self
.sample2
)
601 self
.assertEqual(dialect
.delimiter
, ":")
602 self
.assertEqual(dialect
.quotechar
, "'")
603 self
.assertEqual(dialect
.skipinitialspace
, False)
605 def test_delimiters(self
):
606 sniffer
= csv
.Sniffer()
607 dialect
= sniffer
.sniff(self
.sample3
)
608 self
.assertEqual(dialect
.delimiter
, "0")
609 dialect
= sniffer
.sniff(self
.sample3
, delimiters
="?,")
610 self
.assertEqual(dialect
.delimiter
, "?")
611 dialect
= sniffer
.sniff(self
.sample3
, delimiters
="/,")
612 self
.assertEqual(dialect
.delimiter
, "/")
613 dialect
= sniffer
.sniff(self
.sample4
)
614 self
.assertEqual(dialect
.delimiter
, ";")
616 if not hasattr(sys
, "gettotalrefcount"):
617 if test_support
.verbose
: print "*** skipping leakage tests ***"
624 class TestLeaks(unittest
.TestCase
):
625 def test_create_read(self
):
627 lastrc
= sys
.gettotalrefcount()
630 self
.assertEqual(gc
.garbage
, [])
631 rc
= sys
.gettotalrefcount()
632 csv
.reader(["a,b,c\r\n"])
633 csv
.reader(["a,b,c\r\n"])
634 csv
.reader(["a,b,c\r\n"])
637 # if csv.reader() leaks, last delta should be 3 or more
638 self
.assertEqual(delta
< 3, True)
640 def test_create_write(self
):
642 lastrc
= sys
.gettotalrefcount()
646 self
.assertEqual(gc
.garbage
, [])
647 rc
= sys
.gettotalrefcount()
653 # if csv.writer() leaks, last delta should be 3 or more
654 self
.assertEqual(delta
< 3, True)
658 rows
= ["a,b,c\r\n"]*5
659 lastrc
= sys
.gettotalrefcount()
662 self
.assertEqual(gc
.garbage
, [])
663 rc
= sys
.gettotalrefcount()
664 rdr
= csv
.reader(rows
)
669 # if reader leaks during read, delta should be 5 or more
670 self
.assertEqual(delta
< 5, True)
672 def test_write(self
):
676 lastrc
= sys
.gettotalrefcount()
679 self
.assertEqual(gc
.garbage
, [])
680 rc
= sys
.gettotalrefcount()
681 writer
= csv
.writer(s
)
686 # if writer leaks during write, last delta should be 5 or more
687 self
.assertEqual(delta
< 5, True)
689 # commented out for now - csv module doesn't yet support Unicode
691 from StringIO
import StringIO
694 class TestUnicode(unittest
.TestCase
):
695 def test_unicode_read(self
):
697 f
= codecs
.EncodedFile(StringIO("Martin von Löwis,"
698 "Marc André Lemburg,"
700 "François Pinard\r\n"),
701 data_encoding
='iso-8859-1')
702 reader
= csv
.reader(f
)
703 self
.assertEqual(list(reader
), [[u
"Martin von Löwis",
704 u
"Marc André Lemburg",
706 u
"François Pinardn"]])
709 mod
= sys
.modules
[__name__
]
710 test_support
.run_unittest(
711 *[getattr(mod
, name
) for name
in dir(mod
) if name
.startswith('Test')]
714 if __name__
== '__main__':