Spaces:
Sleeping
Sleeping
| """Tests pour picarones.report.diff_utils.""" | |
| import pytest | |
| from picarones.report.diff_utils import compute_word_diff, compute_char_diff, diff_stats | |
| class TestComputeWordDiff: | |
| def test_equal_texts(self): | |
| ops = compute_word_diff("bonjour monde", "bonjour monde") | |
| assert len(ops) == 1 | |
| assert ops[0]["op"] == "equal" | |
| assert ops[0]["text"] == "bonjour monde" | |
| def test_empty_reference(self): | |
| ops = compute_word_diff("", "bonjour") | |
| assert any(o["op"] == "insert" for o in ops) | |
| def test_empty_hypothesis(self): | |
| ops = compute_word_diff("bonjour", "") | |
| assert any(o["op"] == "delete" for o in ops) | |
| def test_both_empty(self): | |
| ops = compute_word_diff("", "") | |
| assert ops == [] | |
| def test_insertion(self): | |
| ops = compute_word_diff("le chat", "le grand chat") | |
| assert any(o["op"] == "insert" and "grand" in o["text"] for o in ops) | |
| def test_deletion(self): | |
| ops = compute_word_diff("le grand chat", "le chat") | |
| assert any(o["op"] == "delete" and "grand" in o["text"] for o in ops) | |
| def test_replacement(self): | |
| ops = compute_word_diff("le chat dort", "le chien dort") | |
| assert any(o["op"] == "replace" and "chat" in o["old"] and "chien" in o["new"] for o in ops) | |
| def test_ops_cover_all_words(self): | |
| ref = "Bonjour monde médiéval" | |
| hyp = "Bonjour univers médiéval" | |
| ops = compute_word_diff(ref, hyp) | |
| # Reconstruction de la référence depuis les ops equal+delete+replace.old | |
| ref_reconstructed = [] | |
| for op in ops: | |
| if op["op"] in ("equal", "delete"): | |
| ref_reconstructed.extend(op["text"].split()) | |
| elif op["op"] == "replace": | |
| ref_reconstructed.extend(op["old"].split()) | |
| assert ref_reconstructed == ref.split() | |
| def test_result_is_list_of_dicts(self): | |
| ops = compute_word_diff("texte", "text") | |
| assert isinstance(ops, list) | |
| assert all(isinstance(o, dict) for o in ops) | |
| def test_all_ops_have_op_key(self): | |
| ops = compute_word_diff("abc def ghi", "abc xyz ghi") | |
| assert all("op" in o for o in ops) | |
| def test_valid_op_types(self): | |
| valid_ops = {"equal", "insert", "delete", "replace"} | |
| ops = compute_word_diff("un deux trois", "un trois quatre") | |
| assert all(o["op"] in valid_ops for o in ops) | |
| class TestComputeCharDiff: | |
| def test_equal(self): | |
| ops = compute_char_diff("abc", "abc") | |
| assert len(ops) == 1 | |
| assert ops[0]["op"] == "equal" | |
| def test_single_char_replace(self): | |
| ops = compute_char_diff("abc", "axc") | |
| assert any(o["op"] == "replace" and o["old"] == "b" and o["new"] == "x" for o in ops) | |
| def test_empty_strings(self): | |
| assert compute_char_diff("", "") == [] | |
| class TestDiffStats: | |
| def test_empty(self): | |
| stats = diff_stats([]) | |
| assert stats == {"equal": 0, "insert": 0, "delete": 0, "replace": 0} | |
| def test_counts(self): | |
| ops = [ | |
| {"op": "equal", "text": "a"}, | |
| {"op": "insert", "text": "b"}, | |
| {"op": "delete", "text": "c"}, | |
| {"op": "replace", "old": "d", "new": "e"}, | |
| {"op": "equal", "text": "f"}, | |
| ] | |
| stats = diff_stats(ops) | |
| assert stats["equal"] == 2 | |
| assert stats["insert"] == 1 | |
| assert stats["delete"] == 1 | |
| assert stats["replace"] == 1 | |