from csv_rfc4180 import parse_csv, write, loads, dumps def eq(a,b): assert a==b, (a,b) # basic eq(parse_csv("a,b,c\n1,2,3\n"), [["a","b","c"],["1","2","3"]]) # quoted embedded comma eq(parse_csv('a,"b,c",d\n'), [["a","b,c","d"]]) # quoted newline eq(parse_csv('a,"b\nc",d\n'), [["a","b\nc","d"]]) # doubled quote eq(parse_csv('a,"b""c",d\n'), [["a",'b"c',"d"]]) # CRLF eq(parse_csv("a,b\r\n1,2\r\n"), [["a","b"],["1","2"]]) # BOM eq(parse_csv("\ufeffa,b\n"), [["a","b"]]) # empty input eq(parse_csv(""), []) # trailing empty line -> blank record [''] eq(parse_csv("a,b\n\n"), [["a","b"],[""]]) # ragged eq(parse_csv("a,b,c\n1,2\n"), [["a","b","c"],["1","2"]]) # write roundtrip data = [["name","note"],["Alice","has, comma"],["Bob","line1\nline2"],["C","quote\"here"]] s = write(data) print(repr(s)) eq(parse_csv(s), data) # write quoting minimal eq(write([["a b","c"]]), 'a b,c\r\n') # empty field eq(parse_csv("a,,c\n"), [["a","","c"]]) print("ALL TESTS PASSED")