@@ -240,9 +240,11 @@ def test_write_lineterminator(self):
240
240
writer = csv .writer (sio , lineterminator = lineterminator )
241
241
writer .writerow (['a' , 'b' ])
242
242
writer .writerow ([1 , 2 ])
243
+ writer .writerow (['\r ' , '\n ' ])
243
244
self .assertEqual (sio .getvalue (),
244
245
f'a,b{ lineterminator } '
245
- f'1,2{ lineterminator } ' )
246
+ f'1,2{ lineterminator } '
247
+ f'"\r ","\n "{ lineterminator } ' )
246
248
247
249
def test_write_iterable (self ):
248
250
self ._write_test (iter (['a' , 1 , 'p,q' ]), 'a,1,"p,q"' )
@@ -469,22 +471,44 @@ def test_read_linenum(self):
469
471
self .assertEqual (r .line_num , 3 )
470
472
471
473
def test_roundtrip_quoteed_newlines (self ):
472
- with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
473
- writer = csv .writer (fileobj )
474
- rows = [['a\n b' ,'b' ],['c' ,'x\r \n d' ]]
475
- writer .writerows (rows )
476
- fileobj .seek (0 )
477
- for i , row in enumerate (csv .reader (fileobj )):
478
- self .assertEqual (row , rows [i ])
474
+ rows = [
475
+ ['\n a' , 'b\n c' , 'd\n ' ],
476
+ ['\r e' , 'f\r g' , 'h\r ' ],
477
+ ['\r \n i' , 'j\r \n k' , 'l\r \n ' ],
478
+ ['\n \r m' , 'n\n \r o' , 'p\n \r ' ],
479
+ ['\r \r q' , 'r\r \r s' , 't\r \r ' ],
480
+ ['\n \n u' , 'v\n \n w' , 'x\n \n ' ],
481
+ ]
482
+ for lineterminator in '\r \n ' , '\n ' , '\r ' :
483
+ with self .subTest (lineterminator = lineterminator ):
484
+ with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
485
+ writer = csv .writer (fileobj , lineterminator = lineterminator )
486
+ writer .writerows (rows )
487
+ fileobj .seek (0 )
488
+ for i , row in enumerate (csv .reader (fileobj )):
489
+ self .assertEqual (row , rows [i ])
479
490
480
491
def test_roundtrip_escaped_unquoted_newlines (self ):
481
- with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
482
- writer = csv .writer (fileobj ,quoting = csv .QUOTE_NONE ,escapechar = "\\ " )
483
- rows = [['a\n b' ,'b' ],['c' ,'x\r \n d' ]]
484
- writer .writerows (rows )
485
- fileobj .seek (0 )
486
- for i , row in enumerate (csv .reader (fileobj ,quoting = csv .QUOTE_NONE ,escapechar = "\\ " )):
487
- self .assertEqual (row ,rows [i ])
492
+ rows = [
493
+ ['\n a' , 'b\n c' , 'd\n ' ],
494
+ ['\r e' , 'f\r g' , 'h\r ' ],
495
+ ['\r \n i' , 'j\r \n k' , 'l\r \n ' ],
496
+ ['\n \r m' , 'n\n \r o' , 'p\n \r ' ],
497
+ ['\r \r q' , 'r\r \r s' , 't\r \r ' ],
498
+ ['\n \n u' , 'v\n \n w' , 'x\n \n ' ],
499
+ ]
500
+ for lineterminator in '\r \n ' , '\n ' , '\r ' :
501
+ with self .subTest (lineterminator = lineterminator ):
502
+ with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
503
+ writer = csv .writer (fileobj , lineterminator = lineterminator ,
504
+ quoting = csv .QUOTE_NONE , escapechar = "\\ " )
505
+ writer .writerows (rows )
506
+ fileobj .seek (0 )
507
+ for i , row in enumerate (csv .reader (fileobj ,
508
+ quoting = csv .QUOTE_NONE ,
509
+ escapechar = "\\ " )):
510
+ self .assertEqual (row , rows [i ])
511
+
488
512
489
513
class TestDialectRegistry (unittest .TestCase ):
490
514
def test_registry_badargs (self ):
0 commit comments