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