#[test]
fn validate_ecoli_doubling_time() {
let mu = core::f64::consts::LN_2 / (20.0 / 60.0); let td = jivanu::growth::doubling_time(mu).unwrap();
assert!((td - 20.0 / 60.0).abs() < 0.001, "td = {td}");
}
#[test]
fn validate_monod_half_saturation() {
let mu_max = 2.0;
let k_s = 3.0; let mu = jivanu::growth::monod_kinetics(k_s, mu_max, k_s).unwrap();
assert!((mu - mu_max / 2.0).abs() < 1e-10);
}
#[test]
fn validate_michaelis_menten_identity() {
let v_max = 100.0;
let k_m = 5.0;
let v = jivanu::metabolism::michaelis_menten(k_m, v_max, k_m).unwrap();
assert!((v - v_max / 2.0).abs() < 1e-10);
}
#[test]
fn validate_competitive_inhibition_vmax_unchanged() {
let v_max = 100.0;
let v = jivanu::metabolism::competitive_inhibition(1e6, v_max, 1.0, 10.0, 1.0).unwrap();
assert!((v - v_max).abs() < 0.1, "v = {v}");
}
#[test]
fn validate_noncompetitive_reduces_vmax() {
let v_max = 100.0;
let inhibitor = 5.0;
let k_i = 5.0;
let v = jivanu::metabolism::noncompetitive_inhibition(1e6, v_max, 1.0, inhibitor, k_i).unwrap();
assert!((v - 50.0).abs() < 0.1, "v = {v}");
}
#[test]
fn validate_aerobic_atp_yield() {
assert_eq!(jivanu::metabolism::total_aerobic_atp(), 38);
assert_eq!(jivanu::metabolism::glycolysis_atp(), 2);
assert_eq!(jivanu::metabolism::oxidative_phosphorylation_atp(), 34);
}
#[test]
fn validate_measles_herd_immunity() {
let h = jivanu::epidemiology::herd_immunity_threshold(15.0).unwrap();
assert!(h > 0.90 && h < 0.97, "measles HIT = {h}");
}
#[test]
fn validate_covid_herd_immunity() {
let h = jivanu::epidemiology::herd_immunity_threshold(2.5).unwrap();
assert!((h - 0.6).abs() < 1e-10);
}
#[test]
fn validate_sir_population_conservation() {
let traj =
jivanu::epidemiology::sir_trajectory(0.999, 0.001, 0.0, 0.5, 0.1, 0.01, 1000).unwrap();
for state in &traj {
let total = state.s + state.i + state.r;
assert!((total - 1.0).abs() < 0.01, "S+I+R = {total} at some step");
}
}
#[test]
fn validate_vaccination_suppresses_transmission() {
let r0 = 5.0;
let vc = jivanu::epidemiology::critical_vaccination_coverage(r0).unwrap();
let r_eff = jivanu::epidemiology::effective_r(r0, vc + 0.01).unwrap();
assert!(r_eff < 1.0, "R_eff = {r_eff} should be < 1 above Vc");
}
#[test]
fn validate_half_life_identity() {
for k_e in [0.01, 0.1, 0.5, 1.0, 5.0] {
let t_half = jivanu::pharmacokinetics::half_life(k_e).unwrap();
let k_back = jivanu::pharmacokinetics::elimination_rate(t_half).unwrap();
assert!((k_e - k_back).abs() < 1e-10, "k_e={k_e}, k_back={k_back}");
}
}
#[test]
fn validate_gentamicin_pk() {
let dose = 350.0;
let v_d = 17.5;
let k_e = core::f64::consts::LN_2 / 2.0; let c0 = jivanu::pharmacokinetics::iv_bolus_concentration(dose, v_d, k_e, 0.0).unwrap();
assert!((c0 - 20.0).abs() < 0.1, "C0 = {c0}");
let c2 = jivanu::pharmacokinetics::iv_bolus_concentration(dose, v_d, k_e, 2.0).unwrap();
assert!((c2 - 10.0).abs() < 0.1, "C(2hr) = {c2}");
}
#[test]
fn validate_ecoli_gc_range() {
let gc = jivanu::genetics::gc_content("ATGCATGCATGC").unwrap();
assert!((gc - 0.5).abs() < 0.01);
}
#[test]
fn validate_standard_genetic_code() {
assert_eq!(
jivanu::genetics::translate_codon_to_aa("ATG").unwrap(),
jivanu::genetics::AminoAcid::Methionine
);
assert_eq!(
jivanu::genetics::translate_codon_to_aa("TAA").unwrap(),
jivanu::genetics::AminoAcid::Stop
);
assert_eq!(
jivanu::genetics::translate_codon_to_aa("TAG").unwrap(),
jivanu::genetics::AminoAcid::Stop
);
assert_eq!(
jivanu::genetics::translate_codon_to_aa("TGA").unwrap(),
jivanu::genetics::AminoAcid::Stop
);
}
#[test]
fn validate_amino_acid_mw_extremes() {
let gly = jivanu::genetics::AminoAcid::Glycine.molecular_weight();
let trp = jivanu::genetics::AminoAcid::Tryptophan.molecular_weight();
assert!((gly - 75.032).abs() < 0.01);
assert!((trp - 204.228).abs() < 0.01);
assert!(gly < trp);
}
#[test]
fn validate_kyte_doolittle_extremes() {
assert!((jivanu::genetics::AminoAcid::Isoleucine.hydrophobicity() - 4.5).abs() < 1e-10);
assert!((jivanu::genetics::AminoAcid::Arginine.hydrophobicity() - (-4.5)).abs() < 1e-10);
}
#[test]
fn validate_fic_synergy_threshold() {
let interaction = jivanu::resistance::classify_interaction(0.5).unwrap();
assert_eq!(interaction, jivanu::resistance::DrugInteraction::Synergy);
let interaction = jivanu::resistance::classify_interaction(0.51).unwrap();
assert_eq!(interaction, jivanu::resistance::DrugInteraction::Additive);
}
#[test]
fn validate_aminoglycoside_pk_pd_target() {
let ratio = jivanu::bridge::cmax_mic_ratio(350.0, 17.5, 2.0).unwrap();
assert!(ratio >= 8.0, "Cmax/MIC = {ratio}, target ≥ 8");
}