"""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 "