//! Equivalence tests: every historical golden from the pre-T2 tests is
//! reproduced here at the integration level via the new public API.
//!
//! The in-crate tests in `src/history.rs::tests` and
//! `src/time_slice.rs::tests` are the primary regression net for numerical
//! behavior. This file provides Game-level goldens that stand alone and are
//! more naturally expressed as integration tests.

use approx::assert_ulps_eq;
use trueskill_tt::{ConstantDrift, Game, GameOptions, Gaussian, Outcome, Rating};

type R = Rating<i64, ConstantDrift>;

fn ts_rating(mu: f64, sigma: f64, beta: f64, gamma: f64) -> R {
    R::new(Gaussian::from_ms(mu, sigma), beta, ConstantDrift(gamma))
}

#[test]
fn game_1v1_golden_matches_historical() {
    let a = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
    let b = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
    let (a_post, b_post) = Game::<i64, _>::one_v_one(&a, &b, Outcome::winner(0, 2)).unwrap();
    // Historical golden from pre-T2 test_1vs1 (team 0 wins):
    assert_ulps_eq!(
        a_post,
        Gaussian::from_ms(29.205220, 7.194481),
        epsilon = 1e-6
    );
    assert_ulps_eq!(
        b_post,
        Gaussian::from_ms(20.794779, 7.194481),
        epsilon = 1e-6
    );
}

#[test]
fn game_1v1_draw_golden() {
    let a = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
    let b = ts_rating(25.0, 25.0 / 3.0, 25.0 / 6.0, 25.0 / 300.0);
    let g = Game::<i64, _>::ranked(
        &[&[a], &[b]],
        Outcome::draw(2),
        &GameOptions {
            p_draw: 0.25,
            score_sigma: 1.0,
            convergence: Default::default(),
        },
    )
    .unwrap();
    let p = g.posteriors();
    // Historical golden from pre-T2 test_1vs1_draw:
    assert_ulps_eq!(
        p[0][0],
        Gaussian::from_ms(24.999999, 6.469480),
        epsilon = 1e-6
    );
    assert_ulps_eq!(
        p[1][0],
        Gaussian::from_ms(24.999999, 6.469480),
        epsilon = 1e-6
    );
}
