blackbox_log/parser/decode/
negative_14_bit.rs

1use super::variable;
2use crate::parser::InternalResult;
3use crate::Reader;
4
5pub(crate) fn negative_14_bit(data: &mut Reader) -> InternalResult<i32> {
6    let result = variable(data)? as u16;
7    let result: i32 = if (result & 0x2000) > 0 {
8        (result | 0xC000).cast_signed().into()
9    } else {
10        result.into()
11    };
12
13    Ok(-result)
14}
15
16#[cfg(test)]
17mod tests {
18    use test_case::case;
19
20    use super::*;
21
22    #[case(0, &[0]; "zero")]
23    #[case(-0x1FFF, &[0xFF, 0x3F]; "min")]
24    #[case(0x2000, &[0x80, 0x40]; "max")]
25    #[case(1, &[0xFF, 0x7F]; "all bits set")]
26    #[case(1, &[0xFF, 0xFF, 0xFF, 0xFF, 0x7F]; "extra bits ignored")]
27    fn decode(expected: i32, bytes: &[u8]) {
28        let mut b = Reader::new(bytes);
29        assert_eq!(expected, negative_14_bit(&mut b).unwrap());
30    }
31}