1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use super::variable;
use crate::parser::InternalResult;
use crate::utils::as_i16;
use crate::Reader;

pub(crate) fn negative_14_bit(data: &mut Reader) -> InternalResult<i32> {
    let result = variable(data)? as u16;
    let result: i32 = if (result & 0x2000) > 0 {
        as_i16(result | 0xC000).into()
    } else {
        result.into()
    };

    Ok(-result)
}

#[cfg(test)]
mod tests {
    use test_case::case;

    use super::*;

    #[case(0, &[0]; "zero")]
    #[case(-0x1FFF, &[0xFF, 0x3F]; "min")]
    #[case(0x2000, &[0x80, 0x40]; "max")]
    #[case(1, &[0xFF, 0x7F]; "all bits set")]
    #[case(1, &[0xFF, 0xFF, 0xFF, 0xFF, 0x7F]; "extra bits ignored")]
    fn decode(expected: i32, bytes: &[u8]) {
        let mut b = Reader::new(bytes);
        assert_eq!(expected, negative_14_bit(&mut b).unwrap());
    }
}