#[cfg(feature = "ffi")] #[test] fn ffi_bmi_and_patient() { let mut out: f32 = 0.0; let rc = medicallib_rust::ffi::medicallib_bmi(70.0, 1.75, &mut out as *mut f32); assert_eq!(rc, medicallib_rust::ffi::ML_OK); assert!(out > 10.0); use std::ffi::CString; let id = CString::new("ffi-test").unwrap(); let p = medicallib_rust::ffi::ml_patient_new(id.as_ptr()); assert!(!p.is_null()); let _ = medicallib_rust::ffi::ml_patient_update(p, 0.1); let s = medicallib_rust::ffi::ml_patient_summary(p); assert!(!s.is_null()); medicallib_rust::ffi::ml_string_free(s); medicallib_rust::ffi::ml_patient_free(p); } #[cfg(feature = "ffi")] #[test] fn ffi_errors() { // Null out pointer arguments should error gracefully let rc = medicallib_rust::ffi::medicallib_bmi(70.0, 1.75, std::ptr::null_mut()); assert_eq!(rc, medicallib_rust::ffi::ML_EINVAL); let p = medicallib_rust::ffi::ml_patient_new(std::ptr::null()); assert!(p.is_null()); // Summary with null patient returns null let s = medicallib_rust::ffi::ml_patient_summary(std::ptr::null()); assert!(s.is_null()); } #[cfg(feature = "ffi")] #[test] fn ffi_bloodstream_metrics() { use medicallib_rust::ffi::*; use std::ffi::CString; let id = CString::new("ffi-blood").unwrap(); let p = ml_patient_new(id.as_ptr()); assert!(!p.is_null()); let mut metrics = std::mem::MaybeUninit::::uninit(); assert_eq!(ml_patient_update(p, 0.5), ML_OK); let rc = ml_patient_bloodstream_metrics(p, metrics.as_mut_ptr()); assert_eq!(rc, ML_OK); let metrics = unsafe { metrics.assume_init() }; assert!(metrics.oncotic_pressure_mm_hg > 15.0); assert!(metrics.rbc_mature_fraction > 0.4); ml_patient_free(p); }