#![deny(warnings)]
#![allow(clippy::many_single_char_names)]
extern crate mpi_fork_fnsp as mpi;
use mpi::topology::{GroupRelation, Rank, SystemGroup};
use mpi::traits::*;
fn main() {
let universe = mpi::initialize().unwrap();
let world = universe.world();
let g = world.group();
assert_eq!(world.size(), g.size());
assert_eq!(world.rank(), g.rank().unwrap());
assert_eq!(GroupRelation::Identical, g.compare(&g));
let h = world.group();
assert_eq!(GroupRelation::Identical, g.compare(&h));
let i = g.union(&h);
assert_eq!(GroupRelation::Identical, g.compare(&i));
let empty = g.difference(&h);
assert_eq!(
GroupRelation::Identical,
SystemGroup::empty().compare(&empty)
);
assert_eq!(0, empty.size());
assert_eq!(0, g.intersection(&empty).size());
let first_half: Vec<Rank> = (0..g.size() / 2).collect();
let f = g.include(&first_half[..]);
let s = g.exclude(&first_half[..]);
assert_eq!(GroupRelation::Unequal, f.compare(&s));
let f_ = g.intersection(&f);
assert_eq!(GroupRelation::Identical, f.compare(&f_));
let s_ = g.intersection(&s);
assert_eq!(GroupRelation::Identical, s.compare(&s_));
let f__ = g.difference(&s);
assert_eq!(GroupRelation::Identical, f.compare(&f__));
let s__ = g.difference(&f);
assert_eq!(GroupRelation::Identical, s.compare(&s__));
let fs = f.union(&s);
assert_eq!(GroupRelation::Identical, g.compare(&fs));
let fs = f.intersection(&s);
assert_eq!(GroupRelation::Identical, empty.compare(&fs));
assert!(
(f.rank().is_some() && s.rank().is_none()) ^ (f.rank().is_none() && s.rank().is_some())
);
let rev: Vec<Rank> = (0..g.size()).rev().collect();
let r = g.include(&rev[..]);
assert_eq!(
Some(rev[g.rank().unwrap() as usize]),
r.translate_rank(g.rank().unwrap(), &g)
);
}