"""Tests Sprint 72 — A.I.1 chantier 1 : vue « Worst lines globale ».
Couvre :
1. ``extract_worst_lines`` :
- Top-N respecté, tri par CER décroissant
- Filtre par moteur
- Filtre par strate (``script_type``)
- Lignes avec CER == 0 ignorées
- DocumentResult sans ``line_metrics`` ignoré
- Index de ligne hors borne → texte vide mais entrée incluse
si au moins l'un des deux côtés a du texte
- top_n=0 → liste vide
2. ``WorstLineEntry`` : rang attribué après tri (1-based).
3. ``build_worst_lines_table_html`` :
- Tableau rendu avec colonnes attendues
- Chaîne vide si entries vide
- Colonne strate omise si aucune entry n'a script_type
- Cellule CER colorée
- Diff GT/hyp rendu (rouge barré + vert)
4. Anti-injection : nom moteur, doc_id, ligne GT/hyp avec
``",
doc_id="d", line_index=0,
gt_line="abc", hyp_line="aXc",
),
]
html = build_worst_lines_table_html(entries)
assert "