1 use super::*;
2
3 use crate::Flags;
4
5 #[test]
cases()6 fn cases() {
7 case(
8 TestFlags::empty(),
9 &[
10 (TestFlags::A, 1),
11 (TestFlags::all(), 1 | 1 << 1 | 1 << 2),
12 (TestFlags::empty(), 0),
13 (TestFlags::from_bits_retain(1 << 3), 1 << 3),
14 ],
15 TestFlags::union,
16 );
17
18 case(
19 TestFlags::A | TestFlags::C,
20 &[
21 (TestFlags::A | TestFlags::B, 1 | 1 << 1 | 1 << 2),
22 (TestFlags::A, 1 | 1 << 2),
23 ],
24 TestFlags::union,
25 );
26 }
27
28 #[track_caller]
case<T: Flags + std::fmt::Debug + std::ops::BitOr<Output = T> + std::ops::BitOrAssign + Copy>( value: T, inputs: &[(T, T::Bits)], mut inherent: impl FnMut(T, T) -> T, ) where T::Bits: std::fmt::Debug + PartialEq + Copy,29 fn case<T: Flags + std::fmt::Debug + std::ops::BitOr<Output = T> + std::ops::BitOrAssign + Copy>(
30 value: T,
31 inputs: &[(T, T::Bits)],
32 mut inherent: impl FnMut(T, T) -> T,
33 ) where
34 T::Bits: std::fmt::Debug + PartialEq + Copy,
35 {
36 for (input, expected) in inputs {
37 assert_eq!(
38 *expected,
39 inherent(value, *input).bits(),
40 "{:?}.union({:?})",
41 value,
42 input
43 );
44 assert_eq!(
45 *expected,
46 Flags::union(value, *input).bits(),
47 "Flags::union({:?}, {:?})",
48 value,
49 input
50 );
51 assert_eq!(
52 *expected,
53 (value | *input).bits(),
54 "{:?} | {:?}",
55 value,
56 input
57 );
58 assert_eq!(
59 *expected,
60 {
61 let mut value = value;
62 value |= *input;
63 value
64 }
65 .bits(),
66 "{:?} |= {:?}",
67 value,
68 input,
69 );
70 }
71 }
72