Skip to content

Misunderstanding Enum id_pat and id ? #590

@redeexpressos

Description

@redeexpressos
use deku::prelude::*;

use crate::common::U8B;

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(id_type = "u8", bits = 4, endian = "big")]
pub enum MyEnum {
    #[deku(id = 0)]
    A,

    #[deku(id = 1)]
    B,

    #[deku(id = 2)]
    C,

    /// [3..254] - Reserved
    #[deku(id_pat = "_")]
    Reserved(U8B),
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_read() {
        let tests = vec![
            (0b0000_0000, MyEnum::A),
            (0b0001_0000, MyEnum::B),
            (0b0010_0000, MyEnum::C),
            (0b1000_0000, MyEnum::Reserved(1)),
            (0b1000_0000, MyEnum::Reserved(8)),
            (0b1111_0000, MyEnum::Reserved(15)),
        ];

        for (byte_val, expected_t) in tests {
            let data: Vec<u8> = vec![byte_val];
            let (_rest, t) = MyEnum::from_bytes((data.as_ref(), 0)).unwrap();
            assert_eq!(t, expected_t);
        }
    }

    #[test]
    fn test_write() {
        let tests = vec![
            (MyEnum::A, 0b0000_0000),
            (MyEnum::B, 0b0001_0000),
            (MyEnum::C, 0b0010_0000),
            (MyEnum::Reserved(9), 0b1001_0000),
            (MyEnum::Reserved(15), 0b1111_0000),
        ];

        for (t, expected_byte_val) in tests {
            let data_out = t.to_bytes().unwrap();
            assert_eq!(data_out, vec![expected_byte_val],);
        }
    }

    fn test_round_trip() {
        let tests = vec![
            MyEnum::A,
            MyEnum::B,
            MyEnum::C,
            MyEnum::Reserved(8),
            MyEnum::Reserved(1),
        ];

        for t in tests {
            let bytes = t.to_bytes().unwrap();
            let (_rest, decoded_t) = MyEnum::from_bytes((bytes.as_ref(), 0)).unwrap();
            assert_eq!(t, decoded_t);
        }
    }
}

The tests are failing. Am I doing something wrong?

thread 'common::test::tests::test_read' panicked at src/common/test.rs:40:13:
assertion `left == right` failed
  left: Reserved(8)
 right: Reserved(1)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions