xref: /aosp_15_r20/external/crosvm/bit_field/tests/test_enum.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2019 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use bit_field::*;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker #[bitfield]
8*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Eq)]
9*bb4ee6a4SAndroid Build Coastguard Worker enum TwoBits {
10*bb4ee6a4SAndroid Build Coastguard Worker     Zero = 0b00,
11*bb4ee6a4SAndroid Build Coastguard Worker     One = 0b01,
12*bb4ee6a4SAndroid Build Coastguard Worker     Two = 0b10,
13*bb4ee6a4SAndroid Build Coastguard Worker     Three = 0b11,
14*bb4ee6a4SAndroid Build Coastguard Worker }
15*bb4ee6a4SAndroid Build Coastguard Worker 
16*bb4ee6a4SAndroid Build Coastguard Worker #[bitfield]
17*bb4ee6a4SAndroid Build Coastguard Worker #[bits = 3]
18*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Eq)]
19*bb4ee6a4SAndroid Build Coastguard Worker enum ThreeBits {
20*bb4ee6a4SAndroid Build Coastguard Worker     Zero = 0b00,
21*bb4ee6a4SAndroid Build Coastguard Worker     One = 0b01,
22*bb4ee6a4SAndroid Build Coastguard Worker     Two = 0b10,
23*bb4ee6a4SAndroid Build Coastguard Worker     Three = 0b111,
24*bb4ee6a4SAndroid Build Coastguard Worker }
25*bb4ee6a4SAndroid Build Coastguard Worker 
26*bb4ee6a4SAndroid Build Coastguard Worker #[bitfield]
27*bb4ee6a4SAndroid Build Coastguard Worker struct Struct {
28*bb4ee6a4SAndroid Build Coastguard Worker     prefix: BitField1,
29*bb4ee6a4SAndroid Build Coastguard Worker     two_bits: TwoBits,
30*bb4ee6a4SAndroid Build Coastguard Worker     three_bits: ThreeBits,
31*bb4ee6a4SAndroid Build Coastguard Worker     suffix: BitField2,
32*bb4ee6a4SAndroid Build Coastguard Worker }
33*bb4ee6a4SAndroid Build Coastguard Worker 
34*bb4ee6a4SAndroid Build Coastguard Worker #[test]
test_enum()35*bb4ee6a4SAndroid Build Coastguard Worker fn test_enum() {
36*bb4ee6a4SAndroid Build Coastguard Worker     let mut s = Struct::new();
37*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(s.get(0, 8), 0b_0000_0000);
38*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(s.get_two_bits(), TwoBits::Zero);
39*bb4ee6a4SAndroid Build Coastguard Worker 
40*bb4ee6a4SAndroid Build Coastguard Worker     s.set_two_bits(TwoBits::Three);
41*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(s.get(0, 8), 0b_0000_0110);
42*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(s.get_two_bits(), TwoBits::Three);
43*bb4ee6a4SAndroid Build Coastguard Worker 
44*bb4ee6a4SAndroid Build Coastguard Worker     s.set(0, 8, 0b_1010_1010);
45*bb4ee6a4SAndroid Build Coastguard Worker     //                   ^^ TwoBits
46*bb4ee6a4SAndroid Build Coastguard Worker     //               ^^_^ Three Bits.
47*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(s.get_two_bits(), TwoBits::One);
48*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(s.get_three_bits().unwrap_err().raw_val(), 0b101);
49*bb4ee6a4SAndroid Build Coastguard Worker 
50*bb4ee6a4SAndroid Build Coastguard Worker     s.set_three_bits(ThreeBits::Two);
51*bb4ee6a4SAndroid Build Coastguard Worker     assert_eq!(s.get(0, 8), 0b_1001_0010);
52*bb4ee6a4SAndroid Build Coastguard Worker }
53