Skip to main content

wolfram_expr/
numeric_array.rs

1//! [`NumericArray`][ref/NumericArray]<sub>WL</sub> data type and supporting traits.
2//!
3//! [ref/NumericArray]: https://reference.wolfram.com/language/ref/NumericArray.html
4
5use crate::array_buf::ArrayBuf;
6use crate::wxf::NumericArrayEnum;
7
8/// Portable, owned [`NumericArray`][ref/NumericArray]<sub>WL</sub> value.
9///
10/// Type alias over [`ArrayBuf<NumericArrayEnum>`].
11///
12/// [ref/NumericArray]: https://reference.wolfram.com/language/ref/NumericArray.html
13pub type NumericArray = ArrayBuf<NumericArrayEnum>;
14
15#[cfg(test)]
16mod tests {
17    use super::*;
18    use std::convert::TryFrom;
19
20    #[test]
21    fn wxf_byte_roundtrip() {
22        for byte in [
23            0x00u8, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, 0x22, 0x23, 0x33, 0x34,
24        ] {
25            let dt = NumericArrayEnum::try_from(byte).unwrap();
26            assert_eq!(dt as u8, byte);
27        }
28        assert!(NumericArrayEnum::try_from(0x05u8).is_err());
29    }
30
31    #[test]
32    fn size_in_bytes() {
33        assert_eq!(NumericArrayEnum::Integer8.size_in_bytes(), 1);
34        assert_eq!(NumericArrayEnum::Real64.size_in_bytes(), 8);
35        assert_eq!(NumericArrayEnum::ComplexReal64.size_in_bytes(), 16);
36        assert_eq!(NumericArrayEnum::Integer8 as u8, 0x00);
37        assert_eq!(NumericArrayEnum::Real64 as u8, 0x23);
38        assert_eq!(NumericArrayEnum::ComplexReal64 as u8, 0x34);
39    }
40
41    #[test]
42    fn from_slice_basic() {
43        let arr = NumericArray::from_slice::<i32>(vec![2, 3], &[1, 2, 3, 4, 5, 6]);
44        assert_eq!(arr.data_type(), NumericArrayEnum::Integer32);
45        assert_eq!(arr.dimensions(), &[2, 3]);
46        assert_eq!(arr.element_count(), 6);
47        assert_eq!(arr.byte_count(), 24);
48        assert_eq!(
49            arr.try_as_slice::<i32>(),
50            Some([1, 2, 3, 4, 5, 6].as_slice())
51        );
52        assert_eq!(arr.try_as_slice::<i64>(), None);
53    }
54}