@@ -265,9 +265,11 @@ def test_write_lineterminator(self):
265
265
writer = csv .writer (sio , lineterminator = lineterminator )
266
266
writer .writerow (['a' , 'b' ])
267
267
writer .writerow ([1 , 2 ])
268
+ writer .writerow (['\r ' , '\n ' ])
268
269
self .assertEqual (sio .getvalue (),
269
270
f'a,b{ lineterminator } '
270
- f'1,2{ lineterminator } ' )
271
+ f'1,2{ lineterminator } '
272
+ f'"\r ","\n "{ lineterminator } ' )
271
273
272
274
def test_write_iterable (self ):
273
275
self ._write_test (iter (['a' , 1 , 'p,q' ]), 'a,1,"p,q"' )
@@ -507,22 +509,44 @@ def test_read_linenum(self):
507
509
self .assertEqual (r .line_num , 3 )
508
510
509
511
def test_roundtrip_quoteed_newlines (self ):
510
- with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
511
- writer = csv .writer (fileobj )
512
- rows = [['a\n b' ,'b' ],['c' ,'x\r \n d' ]]
513
- writer .writerows (rows )
514
- fileobj .seek (0 )
515
- for i , row in enumerate (csv .reader (fileobj )):
516
- self .assertEqual (row , rows [i ])
512
+ rows = [
513
+ ['\n a' , 'b\n c' , 'd\n ' ],
514
+ ['\r e' , 'f\r g' , 'h\r ' ],
515
+ ['\r \n i' , 'j\r \n k' , 'l\r \n ' ],
516
+ ['\n \r m' , 'n\n \r o' , 'p\n \r ' ],
517
+ ['\r \r q' , 'r\r \r s' , 't\r \r ' ],
518
+ ['\n \n u' , 'v\n \n w' , 'x\n \n ' ],
519
+ ]
520
+ for lineterminator in '\r \n ' , '\n ' , '\r ' :
521
+ with self .subTest (lineterminator = lineterminator ):
522
+ with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
523
+ writer = csv .writer (fileobj , lineterminator = lineterminator )
524
+ writer .writerows (rows )
525
+ fileobj .seek (0 )
526
+ for i , row in enumerate (csv .reader (fileobj )):
527
+ self .assertEqual (row , rows [i ])
517
528
518
529
def test_roundtrip_escaped_unquoted_newlines (self ):
519
- with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
520
- writer = csv .writer (fileobj ,quoting = csv .QUOTE_NONE ,escapechar = "\\ " )
521
- rows = [['a\n b' ,'b' ],['c' ,'x\r \n d' ]]
522
- writer .writerows (rows )
523
- fileobj .seek (0 )
524
- for i , row in enumerate (csv .reader (fileobj ,quoting = csv .QUOTE_NONE ,escapechar = "\\ " )):
525
- self .assertEqual (row ,rows [i ])
530
+ rows = [
531
+ ['\n a' , 'b\n c' , 'd\n ' ],
532
+ ['\r e' , 'f\r g' , 'h\r ' ],
533
+ ['\r \n i' , 'j\r \n k' , 'l\r \n ' ],
534
+ ['\n \r m' , 'n\n \r o' , 'p\n \r ' ],
535
+ ['\r \r q' , 'r\r \r s' , 't\r \r ' ],
536
+ ['\n \n u' , 'v\n \n w' , 'x\n \n ' ],
537
+ ]
538
+ for lineterminator in '\r \n ' , '\n ' , '\r ' :
539
+ with self .subTest (lineterminator = lineterminator ):
540
+ with TemporaryFile ("w+" , encoding = "utf-8" , newline = '' ) as fileobj :
541
+ writer = csv .writer (fileobj , lineterminator = lineterminator ,
542
+ quoting = csv .QUOTE_NONE , escapechar = "\\ " )
543
+ writer .writerows (rows )
544
+ fileobj .seek (0 )
545
+ for i , row in enumerate (csv .reader (fileobj ,
546
+ quoting = csv .QUOTE_NONE ,
547
+ escapechar = "\\ " )):
548
+ self .assertEqual (row , rows [i ])
549
+
526
550
527
551
class TestDialectRegistry (unittest .TestCase ):
528
552
def test_registry_badargs (self ):
0 commit comments