use ferrompi::{Mpi, ThreadLevel};
fn main() {
let mpi = Mpi::init().expect("MPI init failed");
assert!(
Mpi::is_initialized(),
"is_initialized should be true after init"
);
println!("PASS: is_initialized");
assert!(
!Mpi::is_finalized(),
"is_finalized should be false before drop"
);
println!("PASS: is_finalized (false before drop)");
let level = mpi.thread_level();
assert!(
level >= ThreadLevel::Single,
"thread_level should be >= Single"
);
println!("PASS: thread_level = {:?}", level);
let version = Mpi::version().expect("version() failed");
assert!(!version.is_empty(), "version string should not be empty");
println!("PASS: version = {}", version);
let t1 = Mpi::wtime();
assert!(t1 >= 0.0, "wtime should return non-negative value");
let t2 = Mpi::wtime();
assert!(t2 >= t1, "wtime should be monotonic");
println!("PASS: wtime = {}", t1);
let world = mpi.world();
let rank = world.rank();
let size = world.size();
assert!(rank >= 0 && rank < size, "rank should be in [0, size)");
assert!(size >= 1, "size should be >= 1");
println!("PASS: world rank={} size={}", rank, size);
let name = world.processor_name().expect("processor_name failed");
assert!(!name.is_empty(), "processor_name should not be empty");
println!("PASS: processor_name = {}", name);
let handle = world.raw_handle();
assert!(handle >= 0, "raw_handle should be non-negative");
println!("PASS: raw_handle = {}", handle);
drop(mpi);
if rank == 0 {
println!("\n========================================");
println!("All lifecycle tests passed!");
println!("========================================");
}
}