enumoid 0.4.0

Enum Indexed Containers
Documentation
use crate::test::types::{
  CompoundSeven, Seventeen, Sixteen, StructOne, StructThree, Three,
  ThreeHundred, WideThree,
};
use enumoid::{EnumIndex, Enumoid};
use std::{fmt::Debug, iter::zip};

use super::types::{CompoundOnWideSeven, CompoundWideOnSeven};

fn test_type<T: Enumoid + Copy + Debug + PartialEq>(values: &Vec<T>) {
  assert_eq!(T::FIRST, *values.first().unwrap());
  assert_eq!(T::LAST, *values.last().unwrap());
  assert_eq!(T::SIZE, values.len());
  let test: Vec<T> = values.iter().copied().collect();
  assert_eq!(T::SIZE, test.len());
  for (i, (x, y)) in zip(test, values.iter().copied()).enumerate() {
    assert_eq!(x, y);
    assert_eq!(EnumIndex::from_value(x).into_usize(), i);
    if i == 0 {
      assert_eq!(x.prev(), None);
      assert_eq!(x.prev_wrapped(), T::LAST);
    } else {
      assert_eq!(x.prev(), Some(values[i - 1]));
      assert_eq!(x.prev_wrapped(), values[i - 1]);
    }
    if i == values.len() - 1 {
      assert_eq!(x.next(), None);
      assert_eq!(x.next_wrapped(), T::FIRST);
    } else {
      assert_eq!(x.next(), Some(values[i + 1]));
      assert_eq!(x.next_wrapped(), values[i + 1]);
    }
  }
}

#[test]
fn test_three() {
  test_type::<Three>(&vec![Three::A, Three::B, Three::C]);
  test_type::<WideThree>(&vec![WideThree::A, WideThree::B, WideThree::C]);
}

#[test]
fn test_struct() {
  test_type::<StructOne>(&vec![StructOne]);
  test_type::<StructThree>(&vec![
    StructThree(Three::A),
    StructThree(Three::B),
    StructThree(Three::C),
  ]);
}

#[test]
fn test_compound_seven() {
  test_type::<CompoundSeven>(&vec![
    CompoundSeven::X(Three::A),
    CompoundSeven::X(Three::B),
    CompoundSeven::X(Three::C),
    CompoundSeven::Y,
    CompoundSeven::Z(Three::A),
    CompoundSeven::Z(Three::B),
    CompoundSeven::Z(Three::C),
  ]);
  test_type::<CompoundOnWideSeven>(&vec![
    CompoundOnWideSeven::X(WideThree::A),
    CompoundOnWideSeven::X(WideThree::B),
    CompoundOnWideSeven::X(WideThree::C),
    CompoundOnWideSeven::Y,
    CompoundOnWideSeven::Z(WideThree::A),
    CompoundOnWideSeven::Z(WideThree::B),
    CompoundOnWideSeven::Z(WideThree::C),
  ]);
  test_type::<CompoundWideOnSeven>(&vec![
    CompoundWideOnSeven::X(Three::A),
    CompoundWideOnSeven::X(Three::B),
    CompoundWideOnSeven::X(Three::C),
    CompoundWideOnSeven::Y,
    CompoundWideOnSeven::Z(Three::A),
    CompoundWideOnSeven::Z(Three::B),
    CompoundWideOnSeven::Z(Three::C),
  ]);
}

#[test]
fn test_sixteen() {
  test_type::<Sixteen>(&vec![
    Sixteen::A,
    Sixteen::B,
    Sixteen::C,
    Sixteen::D,
    Sixteen::E,
    Sixteen::F,
    Sixteen::G,
    Sixteen::H,
    Sixteen::I,
    Sixteen::J,
    Sixteen::K,
    Sixteen::L,
    Sixteen::M,
    Sixteen::N,
    Sixteen::O,
    Sixteen::P,
  ]);
}

#[test]
fn test_seventeen() {
  test_type::<Seventeen>(&vec![
    Seventeen::A,
    Seventeen::B,
    Seventeen::C,
    Seventeen::D,
    Seventeen::E,
    Seventeen::F,
    Seventeen::G,
    Seventeen::H,
    Seventeen::I,
    Seventeen::J,
    Seventeen::K,
    Seventeen::L,
    Seventeen::M,
    Seventeen::N,
    Seventeen::O,
    Seventeen::P,
    Seventeen::Q,
  ]);
}

#[test]
fn test_three_hundred() {
  assert_eq!(ThreeHundred::SIZE, 300);
}