#![deny(warnings)]
#![cfg_attr(feature = "cargo-clippy", allow(many_single_char_names))]
extern crate mpi;
use mpi::traits::*;
use mpi::topology::{SystemGroup, GroupRelation, Rank};
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));
}