zonza/tests/test_attente.py
Ralph Mayola 58ed0d9e6c Attend le relachement des touches avant de coller
Deux dictees ont ete transcrites correctement puis n'ont jamais atteint la zone de
saisie, sans la moindre erreur : inject_text avait bien envoye ses touches. Cause :
la hotkey Cmd+Ctrl+D etait encore enfoncee quand Zonza a simule Cmd+V. Le systeme a
recu Cmd+Ctrl+V, que l'application cible ignore. Le code croyait avoir reussi.

inject_text patiente donc jusqu'a ce qu'aucun modificateur physique ne soit enfonce
(drapeaux Quartz), au plus 2 s. Au-dela, il colle quand meme : mieux vaut un collage
douteux qu'une transcription perdue. Le delai du presse-papier passe de 0,05 a 0,12 s,
0,05 etant juste.

Et surtout, le collage se TRACE desormais ("[collage] ok" ou l'avertissement) : sans
cela, un echec futur resterait invisible dans le log, comme celui-ci l'a ete.

L'attente est une unite pure et bornee (core.attendre, horloge et sommeil injectables).
Detecteur verifie en conditions reelles : False au repos, retour immediat.

55 tests passent.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 01:42:44 +02:00

56 lines
1.8 KiB
Python

"""Attente d'une condition avant le collage.
Bug du 2026-08-21 : deux dictees transcrites correctement n'ont jamais atteint la
zone de saisie. Aucune exception — les touches AVAIENT ete envoyees. Cause : la
hotkey Cmd+Ctrl+D etait encore enfoncee quand Zonza a simule Cmd+V ; le systeme a
recu Cmd+Ctrl+V, que l'application cible ignore.
D'ou une attente du relachement des modificateurs avant de coller. Bornee : si une
touche reste enfoncee (clavier bloque), on colle quand meme plutot que de perdre le
texte.
"""
from core import attendre
def test_condition_deja_vraie_ne_dort_pas():
sommeils = []
assert attendre(lambda: True, 1.0, 0.05, dormir=sommeils.append, horloge=lambda: 0.0) is True
assert sommeils == []
def test_condition_devient_vraie_apres_quelques_tours():
tours = {"n": 0}
def cond():
tours["n"] += 1
return tours["n"] >= 3
t = {"v": 0.0}
def horloge(): return t["v"]
def dormir(s): t["v"] += s
assert attendre(cond, 1.0, 0.05, dormir=dormir, horloge=horloge) is True
assert tours["n"] == 3
def test_rend_False_au_bout_du_temps_imparti():
t = {"v": 0.0}
def horloge(): return t["v"]
def dormir(s): t["v"] += s
assert attendre(lambda: False, 0.2, 0.05, dormir=dormir, horloge=horloge) is False
def test_le_temps_imparti_est_respecte():
t = {"v": 0.0}
dormis = []
def horloge(): return t["v"]
def dormir(s): t["v"] += s; dormis.append(s)
attendre(lambda: False, 0.2, 0.05, dormir=dormir, horloge=horloge)
assert sum(dormis) <= 0.25, "l'attente ne doit pas deborder"
def test_un_delai_nul_tente_quand_meme_une_fois():
essais = {"n": 0}
def cond():
essais["n"] += 1
return False
attendre(cond, 0.0, 0.05, dormir=lambda s: None, horloge=lambda: 0.0)
assert essais["n"] >= 1