Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
gh-138669: Increase test coverage for difflib (GH-138670)
(cherry picked from commit 4499161)

Co-authored-by: Jan-Eric Nitschke <47750513+JanEricNitschke@users.noreply.github.com>
  • Loading branch information
JanEricNitschke authored and miss-islington committed Sep 12, 2025
commit 363b85ec855cdb39116ac106f3a4fab4bf16963d
39 changes: 39 additions & 0 deletions Lib/test/test_difflib.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,16 @@ def test_one_delete(self):
('delete', 40, 41, 40, 40),
('equal', 41, 81, 40, 80)])

def test_opcode_caching(self):
sm = difflib.SequenceMatcher(None, 'b' * 100, 'a' + 'b' * 100)
opcode = sm.get_opcodes()
self.assertEqual(opcode,
[ ('insert', 0, 0, 0, 1),
('equal', 0, 100, 1, 101)])
# Implementation detail: opcodes are cached;
# `get_opcodes()` returns the same object
self.assertIs(opcode, sm.get_opcodes())

def test_bjunk(self):
sm = difflib.SequenceMatcher(isjunk=lambda x: x == ' ',
a='a' * 40 + 'b' * 40, b='a' * 44 + 'b' * 40)
Expand Down Expand Up @@ -293,6 +303,15 @@ def test_close_matches_aligned(self):
'+ kitten\n',
'+ puppy\n'])

def test_one_insert(self):
m = difflib.Differ().compare('b' * 2, 'a' + 'b' * 2)
self.assertEqual(list(m), ['+ a', ' b', ' b'])

def test_one_delete(self):
m = difflib.Differ().compare('a' + 'b' * 2, 'b' * 2)
self.assertEqual(list(m), ['- a', ' b', ' b'])


class TestOutputFormat(unittest.TestCase):
def test_tab_delimiter(self):
args = [['one'], ['two'], 'Original', 'Current',
Expand Down Expand Up @@ -585,6 +604,26 @@ def test_longest_match_with_popular_chars(self):
self.assertFalse(self.longer_match_exists(a, b, match.size))


class TestCloseMatches(unittest.TestCase):
# Happy paths are tested in the doctests of `difflib.get_close_matches`.

def test_invalid_inputs(self):
self.assertRaises(ValueError, difflib.get_close_matches, "spam", ['egg'], n=0)
self.assertRaises(ValueError, difflib.get_close_matches, "spam", ['egg'], n=-1)
self.assertRaises(ValueError, difflib.get_close_matches, "spam", ['egg'], cutoff=1.1)
self.assertRaises(ValueError, difflib.get_close_matches, "spam", ['egg'], cutoff=-0.1)


class TestRestore(unittest.TestCase):
# Happy paths are tested in the doctests of `difflib.restore`.

def test_invalid_input(self):
with self.assertRaises(ValueError):
''.join(difflib.restore([], 0))
with self.assertRaises(ValueError):
''.join(difflib.restore([], 3))


def setUpModule():
difflib.HtmlDiff._default_prefix = 0

Expand Down
Loading