1 use super::*;
2 
3 use crate::Flags;
4 
5 #[test]
cases()6 fn cases() {
7     case(
8         TestFlags::empty(),
9         &[
10             (TestFlags::A, 0),
11             (TestFlags::empty(), 0),
12             (TestFlags::from_bits_retain(1 << 3), 0),
13         ],
14         TestFlags::remove,
15         TestFlags::set,
16     );
17 
18     case(
19         TestFlags::A,
20         &[
21             (TestFlags::A, 0),
22             (TestFlags::empty(), 1),
23             (TestFlags::B, 1),
24         ],
25         TestFlags::remove,
26         TestFlags::set,
27     );
28 
29     case(
30         TestFlags::ABC,
31         &[
32             (TestFlags::A, 1 << 1 | 1 << 2),
33             (TestFlags::A | TestFlags::C, 1 << 1),
34         ],
35         TestFlags::remove,
36         TestFlags::set,
37     );
38 }
39 
40 #[track_caller]
case<T: Flags + std::fmt::Debug + Copy>( value: T, inputs: &[(T, T::Bits)], mut inherent_remove: impl FnMut(&mut T, T), mut inherent_set: impl FnMut(&mut T, T, bool), ) where T::Bits: std::fmt::Debug + PartialEq + Copy,41 fn case<T: Flags + std::fmt::Debug + Copy>(
42     value: T,
43     inputs: &[(T, T::Bits)],
44     mut inherent_remove: impl FnMut(&mut T, T),
45     mut inherent_set: impl FnMut(&mut T, T, bool),
46 ) where
47     T::Bits: std::fmt::Debug + PartialEq + Copy,
48 {
49     for (input, expected) in inputs {
50         assert_eq!(
51             *expected,
52             {
53                 let mut value = value;
54                 inherent_remove(&mut value, *input);
55                 value
56             }
57             .bits(),
58             "{:?}.remove({:?})",
59             value,
60             input
61         );
62         assert_eq!(
63             *expected,
64             {
65                 let mut value = value;
66                 Flags::remove(&mut value, *input);
67                 value
68             }
69             .bits(),
70             "Flags::remove({:?}, {:?})",
71             value,
72             input
73         );
74 
75         assert_eq!(
76             *expected,
77             {
78                 let mut value = value;
79                 inherent_set(&mut value, *input, false);
80                 value
81             }
82             .bits(),
83             "{:?}.set({:?}, false)",
84             value,
85             input
86         );
87         assert_eq!(
88             *expected,
89             {
90                 let mut value = value;
91                 Flags::set(&mut value, *input, false);
92                 value
93             }
94             .bits(),
95             "Flags::set({:?}, {:?}, false)",
96             value,
97             input
98         );
99     }
100 }
101