zonza/tests/test_systeme.py
Ralph Mayola bfafc6a48c Le masque des modificateurs couvre enfin Command, et jamais Caps Lock
Deux defauts trouves en rendant la sonde injectable.

1. Le masque etait ecrit 0x000F0000 A LA MAIN. Il couvrait Shift, Control et Alt
   mais PAS Command (0x00100000) — pourtant la touche du raccourci de Zonza.
   Maintenir Cmd seul passait donc inapercu. Le masque est desormais COMPOSE
   depuis les constantes nommees de Quartz : un masque calcule de tete se trompe
   en silence, compose il ne peut plus.

2. Le test lisait le CLAVIER PHYSIQUE (`modificateurs_enfonces() is False`). Son
   resultat dependait des mains de l'utilisateur pendant la suite — un echec
   inreproductible a ete observe ce jour, puis 17 executions vertes. La sonde est
   rendue injectable, comme SystemeWindows l'avait deja, et les quatre
   modificateurs sont eprouves un par un. Un test verifie que la sonde reelle rend
   un booleen sans lever, SANS affirmer sa valeur.

Le repli hors Quartz excluait aussi le verrouillage majuscule : actif, il aurait
fait attendre 2 s avant CHAQUE collage, en permanence.

195 tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 20:04:52 +02:00

72 lines
2.9 KiB
Python

"""La fabrique rend une implémentation conforme au contrat Systeme."""
import os
import tempfile
import pytest
from systeme import choisir_systeme
def test_la_fabrique_rend_une_implementation_complete():
s = choisir_systeme()
for methode in ("jouer_son", "modificateurs_enfonces", "raccourci_defaut",
"chemin_log", "dossier_donnees", "acquerir_verrou_instance"):
assert callable(getattr(s, methode)), f"{methode} manque"
def test_une_plateforme_inconnue_est_refusee_clairement():
with pytest.raises(NotImplementedError) as e:
choisir_systeme(plateforme="haiku-os")
assert "haiku-os" in str(e.value)
def test_le_raccourci_macos_est_celui_d_aujourd_hui():
assert choisir_systeme(plateforme="darwin").raccourci_defaut() == "<cmd>+<ctrl>+d"
def test_le_verrou_refuse_une_seconde_prise():
s = choisir_systeme()
chemin = os.path.join(tempfile.mkdtemp(), "sous-dossier", "z.lock")
# Référence gardée : sinon CPython ramasse l'objet fichier dès la fin de
# l'assert (refcount à 0), ce qui referme le fichier et relâche le verrou
# AVANT la seconde prise — le test passerait pour la mauvaise raison.
verrou = s.acquerir_verrou_instance(chemin)
assert verrou is not None
assert s.acquerir_verrou_instance(chemin) is None
def test_les_modificateurs_sont_lus_par_le_masque():
"""La sonde est injectee : sans cela ce test lirait le CLAVIER PHYSIQUE et
echouerait au hasard, selon qu'une touche est enfoncee ou non pendant la
suite. C'est arrive le 2026-08-23."""
from systeme.macos import SystemeMacOS
assert SystemeMacOS(sonde_modificateurs=lambda: 0x00000000).modificateurs_enfonces() is False
# chaque modificateur, un par un, depuis les constantes nommees
from Quartz import (kCGEventFlagMaskAlternate, kCGEventFlagMaskCommand,
kCGEventFlagMaskControl, kCGEventFlagMaskShift)
for drapeau in (kCGEventFlagMaskShift, kCGEventFlagMaskControl,
kCGEventFlagMaskAlternate, kCGEventFlagMaskCommand):
assert SystemeMacOS(sonde_modificateurs=lambda d=drapeau: d).modificateurs_enfonces() is True
def test_une_sonde_qui_leve_ne_bloque_jamais_le_collage():
from systeme.macos import SystemeMacOS
def sonde_cassee():
raise RuntimeError("Quartz indisponible")
assert SystemeMacOS(sonde_modificateurs=sonde_cassee).modificateurs_enfonces() is False
def test_le_masque_couvre_command():
"""Command etait ABSENT du masque ecrit a la main : Zonza ne voyait jamais
cette touche, pourtant celle de son propre raccourci."""
from Quartz import kCGEventFlagMaskCommand
from systeme.macos import _MASQUE_MODIFICATEURS
assert kCGEventFlagMaskCommand & _MASQUE_MODIFICATEURS
def test_la_sonde_reelle_rend_un_booleen_sans_lever():
"""On n'affirme PAS sa valeur : elle depend du clavier de l'utilisateur."""
assert isinstance(choisir_systeme().modificateurs_enfonces(), bool)