"""Tests unitaires de compute_new_value (screens/data_actions/compute_operation.py) — logique partagée par apply_data_action.py (champ d'objet) et apply_variable_action.py (variable globale), factorisée pour ne plus être dupliquée dans les deux fichiers. Verrouille le comportement des 7 opérations historiques ET des 6 opérations ajoutées en Phase 2 (hasard + opérations mathématiques).""" import pytest from screens.data_actions.compute_operation import compute_new_value def test_definir_texte() -> None: assert compute_new_value("definir_texte", "ancien", "nouveau", False) == "nouveau" assert compute_new_value("definir_texte", "ancien", "", False) == "" assert compute_new_value("definir_texte", "ancien", None, False) == "" def test_definir_nombre_entier_et_decimal() -> None: assert compute_new_value("definir_nombre", 0, "5", False) == 5 assert isinstance(compute_new_value("definir_nombre", 0, "5", False), int) assert compute_new_value("definir_nombre", 0, "5.7", True) == 5.7 assert compute_new_value("definir_nombre", 0, "pas un nombre", False) == 0 def test_definir_bool() -> None: assert compute_new_value("definir_bool_vrai", 0, None, False) == 1 assert compute_new_value("definir_bool_faux", 1, None, False) == 0 def test_basculer_bool() -> None: assert compute_new_value("basculer_bool", 0, None, False) == 1 assert compute_new_value("basculer_bool", 1, None, False) == 0 assert compute_new_value("basculer_bool", None, None, False) == 1 def test_incrementer_decrementer_entier() -> None: assert compute_new_value("incrementer", 10, "5", False) == 15 assert compute_new_value("decrementer", 10, "5", False) == 5 assert compute_new_value("incrementer", None, "5", False) == 5 def test_incrementer_decimal_garde_les_decimales() -> None: result = compute_new_value("incrementer", 10.0, "0.5", True) assert result == 10.5 assert isinstance(result, float) def test_incrementer_valeur_invalide_ne_change_rien() -> None: assert compute_new_value("incrementer", 10, "pas un nombre", False) == 10 def test_operation_inconnue_leve_value_error() -> None: with pytest.raises(ValueError): compute_new_value("teleporter", 10, "2", False) # ---------- Phase 2 — hasard + opérations mathématiques ---------- def test_multiplier() -> None: assert compute_new_value("multiplier", 10, "3", False) == 30 assert compute_new_value("multiplier", 4.0, "2.5", True) == 10.0 def test_diviser() -> None: assert compute_new_value("diviser", 10, "2", False) == 5 assert compute_new_value("diviser", 5.0, "2", True) == 2.5 def test_diviser_par_zero_ne_change_rien() -> None: assert compute_new_value("diviser", 10, "0", False) == 10 def test_modulo() -> None: assert compute_new_value("modulo", 10, "3", False) == 1 assert compute_new_value("modulo", 10, "0", False) == 10 # garde-fou division par zéro def test_minimum_releve_la_valeur_si_en_dessous() -> None: assert compute_new_value("minimum", 3, "10", False) == 10 assert compute_new_value("minimum", 15, "10", False) == 15 # déjà au-dessus : inchangé def test_maximum_plafonne_la_valeur_si_au_dessus() -> None: assert compute_new_value("maximum", 15, "10", False) == 10 assert compute_new_value("maximum", 3, "10", False) == 3 # déjà en dessous : inchangé def test_minimum_maximum_valeur_invalide_ne_change_rien() -> None: assert compute_new_value("minimum", 5, "pas un nombre", False) == 5 assert compute_new_value("maximum", 5, "", False) == 5 def test_alea_entier_dans_les_bornes() -> None: for _ in range(50): result = compute_new_value("alea", 0, "1,6", False) assert isinstance(result, int) assert 1 <= result <= 6 def test_alea_decimal_dans_les_bornes() -> None: for _ in range(50): result = compute_new_value("alea", 0, "1.5,2.5", True) assert isinstance(result, float) assert 1.5 <= result <= 2.5 def test_alea_bornes_inversees_sont_remises_dans_lordre() -> None: for _ in range(50): result = compute_new_value("alea", 0, "6,1", False) assert 1 <= result <= 6 def test_alea_valeur_invalide_retombe_sur_zero() -> None: assert compute_new_value("alea", 0, "pas un nombre", False) == 0 assert compute_new_value("alea", 0, "", False) == 0 assert compute_new_value("alea", 0, "5", False) == 0 # une seule borne : incomplet