use darkmatter::cosmology::boltzmann::{
boltzmann_rhs, boltzmann_rhs_decay, coannihilation_effective_sigma_v,
collision_term_annihilation, comoving_number_density_eq, entropy_injection_ratio,
freeze_in_relic_density, freeze_in_yield, freeze_out_x_from_solution,
relic_density_from_solution, solve_boltzmann_freeze_out,
};
#[test]
fn comoving_number_density_decreases() {
let n_eq = comoving_number_density_eq(20.0, 2.0);
assert!(n_eq > 0.0);
let n_eq2 = comoving_number_density_eq(40.0, 2.0);
assert!(n_eq > n_eq2);
}
#[test]
fn collision_term() {
let ct = collision_term_annihilation(1e10, 1e8, 3e-26, 1e50);
assert!(ct < 0.0);
}
#[test]
fn rhs_returns_finite() {
let dy = boltzmann_rhs(20.0, 1e-10, 100.0, 3e-26, 2.0);
assert!(dy.is_finite());
}
#[test]
fn solve_freeze_out() {
let solution = solve_boltzmann_freeze_out(100.0, 3e-26, 2.0, 1.0, 50.0, 5000);
assert!(solution.len() > 1);
let (x_last, y_last) = solution.last().copied().unwrap();
assert!(x_last > 0.0);
assert!(y_last > 0.0);
}
#[test]
fn relic_density() {
let solution = solve_boltzmann_freeze_out(100.0, 3e-26, 2.0, 1.0, 50.0, 5000);
let (x_f, y_f) = solution.last().copied().unwrap();
let omega = relic_density_from_solution(y_f, 100.0, x_f);
assert!(omega.is_finite());
assert!(omega > 0.0);
}
#[test]
fn freeze_out_x() {
let solution = solve_boltzmann_freeze_out(100.0, 3e-26, 2.0, 1.0, 50.0, 5000);
let xf = freeze_out_x_from_solution(&solution, 2.0, 100.0);
assert!(xf > 1.0);
assert!(xf < 50.0);
}
#[test]
fn coannihilation() {
let sigma_eff = coannihilation_effective_sigma_v(3e-26, 2e-26, 1e-26, 2.0, 2.0, 0.1, 20.0);
assert!(sigma_eff > 0.0);
}
#[test]
fn freeze_in_yield_positive() {
let y = freeze_in_yield(1e-12, 1000.0, 10.0, 1.22e19);
assert!(y > 0.0);
assert!(y.is_finite());
}
#[test]
fn freeze_in_relic() {
let omega = freeze_in_relic_density(1e-12, 1000.0, 10.0);
assert!(omega > 0.0);
assert!(omega.is_finite());
}
#[test]
fn rhs_decay_finite() {
let dy = boltzmann_rhs_decay(5.0, 1e-8, 500.0, 1e-20, 10.0, 1.0);
assert!(dy.is_finite());
}
#[test]
fn entropy_injection() {
let ratio = entropy_injection_ratio(1e4, 1e2);
assert!(ratio >= 1.0);
let ratio_same = entropy_injection_ratio(1e4, 1e4);
assert_eq!(ratio_same, 1.0);
}