serial_int 2.0.1

Safe, easy-to-use auto-increment integers
Documentation
#![cfg(test)]

use crate::{Serial, SerialGenerator};

pub fn creates_unique_values_until_end<T: Serial + Ord>(start: T) {
    let mut gen = SerialGenerator::with_init_value(start);
    let mut used = Vec::new();

    while !gen.is_at_max() {
        let serial = gen.generate();

        assert!(!used.contains(&serial));

        used.push(serial);
    }

    assert!(!used.is_empty(), "Test did not check for anything...")
}

pub fn recreates_end_value<T: Serial + Clone + std::fmt::Debug>(init: T, end: T) {
    let mut gen = SerialGenerator::with_init_value(init.clone());

    assert_eq!(init, gen.generate());
    assert_eq!(end, gen.generate());
    assert_eq!(end, gen.generate());
    assert_eq!(end, gen.generate());
}

macro_rules! test_type {
    ($($t:tt), *) => {
        $(
            mod $t {
                use super::*;

                #[test]
                fn generator_creates_unique_values_until_end () {
                    creates_unique_values_until_end(<$t>::MAX - 5);

                }

                #[test]
                fn generator_recreates_end_value () {
                    recreates_end_value($t::MAX - 1, $t::MAX);
                }
            }
        )+
    }
}

test_type!(u8, u16, u32, u64, u128, usize);