mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-138621: Increase test coverage for csv.DictReader and csv.Sniffer (GH-138622)
* Increase test coverage for csv.DictReader and csv.Sniffer Previously there were no tests for the DictReader fieldnames setter, the case where a StopIteration was encountered when trying to determine the fieldnames from the content or the case where Sniffer could not find a delimiter. * Revert whitespace change to comment * Add a test that csv.Sniffer.has_header checks up to 20 rows * Replace name and age with letter and offset Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> * Address review comment --------- Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com>
This commit is contained in:
parent
0d7b48a8f5
commit
0e88be6f55
1 changed files with 31 additions and 0 deletions
|
|
@ -918,6 +918,14 @@ def test_dict_reader_fieldnames_accepts_list(self):
|
||||||
reader = csv.DictReader(f, fieldnames)
|
reader = csv.DictReader(f, fieldnames)
|
||||||
self.assertEqual(reader.fieldnames, fieldnames)
|
self.assertEqual(reader.fieldnames, fieldnames)
|
||||||
|
|
||||||
|
def test_dict_reader_set_fieldnames(self):
|
||||||
|
fieldnames = ["a", "b", "c"]
|
||||||
|
f = StringIO()
|
||||||
|
reader = csv.DictReader(f)
|
||||||
|
self.assertIsNone(reader.fieldnames)
|
||||||
|
reader.fieldnames = fieldnames
|
||||||
|
self.assertEqual(reader.fieldnames, fieldnames)
|
||||||
|
|
||||||
def test_dict_writer_fieldnames_rejects_iter(self):
|
def test_dict_writer_fieldnames_rejects_iter(self):
|
||||||
fieldnames = ["a", "b", "c"]
|
fieldnames = ["a", "b", "c"]
|
||||||
f = StringIO()
|
f = StringIO()
|
||||||
|
|
@ -933,6 +941,7 @@ def test_dict_writer_fieldnames_accepts_list(self):
|
||||||
def test_dict_reader_fieldnames_is_optional(self):
|
def test_dict_reader_fieldnames_is_optional(self):
|
||||||
f = StringIO()
|
f = StringIO()
|
||||||
reader = csv.DictReader(f, fieldnames=None)
|
reader = csv.DictReader(f, fieldnames=None)
|
||||||
|
self.assertIsNone(reader.fieldnames)
|
||||||
|
|
||||||
def test_read_dict_fields(self):
|
def test_read_dict_fields(self):
|
||||||
with TemporaryFile("w+", encoding="utf-8") as fileobj:
|
with TemporaryFile("w+", encoding="utf-8") as fileobj:
|
||||||
|
|
@ -1353,6 +1362,19 @@ class TestSniffer(unittest.TestCase):
|
||||||
ghi\0jkl
|
ghi\0jkl
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
sample15 = "\n\n\n"
|
||||||
|
sample16 = "abc\ndef\nghi"
|
||||||
|
|
||||||
|
sample17 = ["letter,offset"]
|
||||||
|
sample17.extend(f"{chr(ord('a') + i)},{i}" for i in range(20))
|
||||||
|
sample17.append("v,twenty_one") # 'u' was skipped
|
||||||
|
sample17 = '\n'.join(sample17)
|
||||||
|
|
||||||
|
sample18 = ["letter,offset"]
|
||||||
|
sample18.extend(f"{chr(ord('a') + i)},{i}" for i in range(21))
|
||||||
|
sample18.append("v,twenty_one") # 'u' was not skipped
|
||||||
|
sample18 = '\n'.join(sample18)
|
||||||
|
|
||||||
def test_issue43625(self):
|
def test_issue43625(self):
|
||||||
sniffer = csv.Sniffer()
|
sniffer = csv.Sniffer()
|
||||||
self.assertTrue(sniffer.has_header(self.sample12))
|
self.assertTrue(sniffer.has_header(self.sample12))
|
||||||
|
|
@ -1374,6 +1396,11 @@ def test_has_header_regex_special_delimiter(self):
|
||||||
self.assertIs(sniffer.has_header(self.sample8), False)
|
self.assertIs(sniffer.has_header(self.sample8), False)
|
||||||
self.assertIs(sniffer.has_header(self.header2 + self.sample8), True)
|
self.assertIs(sniffer.has_header(self.header2 + self.sample8), True)
|
||||||
|
|
||||||
|
def test_has_header_checks_20_rows(self):
|
||||||
|
sniffer = csv.Sniffer()
|
||||||
|
self.assertFalse(sniffer.has_header(self.sample17))
|
||||||
|
self.assertTrue(sniffer.has_header(self.sample18))
|
||||||
|
|
||||||
def test_guess_quote_and_delimiter(self):
|
def test_guess_quote_and_delimiter(self):
|
||||||
sniffer = csv.Sniffer()
|
sniffer = csv.Sniffer()
|
||||||
for header in (";'123;4';", "'123;4';", ";'123;4'", "'123;4'"):
|
for header in (";'123;4';", "'123;4';", ";'123;4'", "'123;4'"):
|
||||||
|
|
@ -1423,6 +1450,10 @@ def test_delimiters(self):
|
||||||
self.assertEqual(dialect.quotechar, "'")
|
self.assertEqual(dialect.quotechar, "'")
|
||||||
dialect = sniffer.sniff(self.sample14)
|
dialect = sniffer.sniff(self.sample14)
|
||||||
self.assertEqual(dialect.delimiter, '\0')
|
self.assertEqual(dialect.delimiter, '\0')
|
||||||
|
self.assertRaisesRegex(csv.Error, "Could not determine delimiter",
|
||||||
|
sniffer.sniff, self.sample15)
|
||||||
|
self.assertRaisesRegex(csv.Error, "Could not determine delimiter",
|
||||||
|
sniffer.sniff, self.sample16)
|
||||||
|
|
||||||
def test_doublequote(self):
|
def test_doublequote(self):
|
||||||
sniffer = csv.Sniffer()
|
sniffer = csv.Sniffer()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue