Reprend le design demande par Ralph, d'apres une capture : barre sombre arrondie posee en bas de l'ecran, et dedans, de gauche a droite, un bouton stop rond rouge-orange a carre blanc, une forme d'onde en barres verticales dont la traine retombe en pointilles, une icone de micro. Au-dessus, une bulle sombre a pointe. La forme d'onde demandait un HISTORIQUE de niveaux, la ou l'ancien cercle ne lisait que le niveau courant : push_level et bar_heights sont ajoutes a audio_level.py comme unites pures (le plus recent a gauche, les positions vides ou silencieuses retombent sur un plancher — c'est lui qui donne les pointilles). La bulle ne peut pas afficher le texte en direct comme la reference : Zonza transcrit APRES l'arret, il n'y a pas de flux continu. Elle porte donc l'etape en cours, et la fenetre reste affichee jusqu'au collage au lieu de disparaitre pendant les secondes de calcul — l'ecran ne se vide plus sans explication. Rendu verifie par capture d'ecran, pas seulement par les tests : le micro a ete redessine apres coup (il sortait en tache blanche) et une marge basse ajoutee, l'arrondi de la barre etant rogne par le bord de la fenetre. 45 tests passent. Le cdhash du stub est inchange, donc les autorisations d'Accessibilite survivent a cette mise a jour (verifie : accordee = True). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
from core import CONFIG, validate_config, is_long_enough, clean_transcript
|
|
|
|
|
|
def test_config_has_required_keys():
|
|
for key in ("model", "language", "hotkey", "sounds", "min_duration_s", "sample_rate"):
|
|
assert key in CONFIG
|
|
|
|
|
|
def test_config_defaults():
|
|
assert CONFIG["language"] == "fr"
|
|
assert CONFIG["min_duration_s"] == 0.3
|
|
assert CONFIG["sample_rate"] == 16000
|
|
|
|
|
|
def test_validate_config_accepts_default():
|
|
validate_config(CONFIG) # ne doit pas lever
|
|
|
|
|
|
def test_validate_config_rejects_bad_duration():
|
|
import pytest
|
|
bad = dict(CONFIG, min_duration_s=-1)
|
|
with pytest.raises(ValueError):
|
|
validate_config(bad)
|
|
|
|
|
|
def test_is_long_enough_true():
|
|
# 1 seconde d'audio à 16000 Hz = 16000 échantillons
|
|
assert is_long_enough(16000, sample_rate=16000, min_duration_s=0.3) is True
|
|
|
|
|
|
def test_is_long_enough_false_too_short():
|
|
# 0.1 s = 1600 échantillons < seuil 0.3 s
|
|
assert is_long_enough(1600, sample_rate=16000, min_duration_s=0.3) is False
|
|
|
|
|
|
def test_is_long_enough_empty():
|
|
assert is_long_enough(0, sample_rate=16000, min_duration_s=0.3) is False
|
|
|
|
|
|
def test_clean_transcript_trims():
|
|
assert clean_transcript(" bonjour ") == "bonjour"
|
|
|
|
|
|
def test_clean_transcript_collapses_internal_whitespace():
|
|
assert clean_transcript("crée moi un\noutil") == "crée moi un outil"
|
|
|
|
|
|
def test_clean_transcript_empty_stays_empty():
|
|
assert clean_transcript(" ") == ""
|
|
|
|
|
|
def test_config_has_ui_keys():
|
|
for key in ("fps", "bar_width", "bar_height", "bar_radius", "bar_bg_rgba",
|
|
"stop_button_rgb", "waveform_rgb", "waveform_bars", "mic_rgb"):
|
|
assert key in CONFIG
|
|
|
|
|
|
def test_config_ui_defaults():
|
|
assert CONFIG["fps"] == 30
|
|
assert CONFIG["bar_width"] > CONFIG["bar_height"] # barre couchee, pas carree
|
|
assert CONFIG["bar_radius"] <= CONFIG["bar_height"] / 2
|
|
assert len(CONFIG["bar_bg_rgba"]) == 4
|
|
assert CONFIG["waveform_bars"] >= 8
|
|
assert 0.0 < CONFIG["waveform_floor"] < 1.0
|