import pytest from traite import comparables as cp def test_additif_et_multiplicatif(): assert cp.prix_ajuste_additif(400_000, {"sup": 12_000, "garage": -8_000}) == 404_000 assert cp.prix_ajuste_multiplicatif(400_000, [0.03, -0.02]) == pytest.approx(400_000 * 1.03 * 0.98) m = cp.prix_ajuste_mixte(400_000, [0.03], {"garage": -8_000}) assert m["prix_ajuste"] == pytest.approx(412_000 - 8_000) def test_ajustement_temps(): assert cp.ajustement_temps(400_000, 120, 126) == pytest.approx(20_000) assert cp.ajustement_temps_taux(400_000, 0.06, 12) == pytest.approx(24_000) assert cp.ajustement_temps_taux(400_000, 0.06, 6) == pytest.approx(400_000 * (1.06 ** 0.5 - 1)) def test_ventes_appariees(): r = cp.ventes_appariees([410_000, 425_000, 398_000], [395_000, 412_000, 380_000]) assert r["n"] == 3 and r["moyenne"] == pytest.approx(15_333.333) and r["mediane"] == 15_000 def test_brut_net_et_reconciliation(): comps = [cp.ComparableAjuste("A", 400_000, {"t": 8_000, "s": -4_000}), cp.ComparableAjuste("B", 420_000, {"t": -10_000, "s": 2_000}), cp.ComparableAjuste("C", 390_000, {"t": 0, "s": 20_000})] assert comps[0].brut_pct == pytest.approx(0.03) and comps[0].net_pct == pytest.approx(0.01) w = cp.poids_inverse_brut(comps) assert sum(w) == pytest.approx(1.0) and w[0] > w[2] # A a le plus petit ajustement brut r = cp.reconciliation(comps, w) assert r["min"] <= r["valeur_ponderee"] <= r["max"] assert r["mediane"] == 410_000 with pytest.raises(ValueError): cp.reconciliation(comps, [0.5, 0.5, 0.5]) def test_distance_et_log(): d = cp.distance_attributs({"s": 150, "a": 20}, {"s": 170, "a": 10}, {"s": 20, "a": 10}) assert d == pytest.approx((1 + 1) ** 0.5) assert cp.ajustement_depuis_coefficient_log(0.0953) == pytest.approx(0.10, abs=1e-3) assert cp.ajustement_depuis_coefficient_log_sans_biais(0.0953, 0.0) == pytest.approx(0.10, abs=1e-3)