1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LoopBehavior {
    Infinite,
    Finite(std::num::NonZeroU32),
}

impl LoopBehavior {
    pub(crate) fn to_rep(self) -> u32 {
        match self {
            LoopBehavior::Infinite => 0xFFFFFFFF,
            LoopBehavior::Finite(n) => n.get() - 1,
        }
    }

    pub fn once() -> Self {
        LoopBehavior::Finite(std::num::NonZeroU32::new(1).unwrap())
    }
}

#[cfg(test)]
mod tests {
    use std::num::NonZeroU32;

    use super::*;

    #[rstest::rstest]
    #[test]
    #[case::infinite(0xFFFFFFFF, LoopBehavior::Infinite)]
    #[case::finite(0x12345677, LoopBehavior::Finite(NonZeroU32::new(0x12345678).unwrap()))]
    #[case::once(0x00000000, LoopBehavior::once())]
    fn test(#[case] expected: u32, #[case] target: LoopBehavior) {
        assert_eq!(expected, target.to_rep());
    }
}