Skip to main content

library_tests/
test_data_store.rs

1use std::os::raw::c_int;
2use wolfram_library_link::{
3    self as wll,
4    sys::{self, WolframLibraryData},
5    DataStore, NumericArray,
6};
7
8#[no_mangle]
9pub unsafe extern "C" fn WolframLibrary_initialize(lib: WolframLibraryData) -> c_int {
10    match wll::initialize(lib) {
11        Ok(()) => return 0,
12        Err(()) => return 1,
13    }
14}
15
16#[wll::export]
17fn test_empty_data_store() -> DataStore {
18    DataStore::new()
19}
20
21#[wll::export]
22fn test_single_int_data_store() -> DataStore {
23    let mut data = DataStore::new();
24    data.add_i64(1);
25
26    data
27}
28
29#[wll::export]
30fn test_multiple_int_data_store() -> DataStore {
31    let mut data = DataStore::new();
32    data.add_i64(1);
33    data.add_i64(2);
34    data.add_i64(3);
35
36    data
37}
38
39#[wll::export]
40fn test_unnamed_heterogenous_data_store() -> DataStore {
41    let mut data = DataStore::new();
42    data.add_i64(1);
43    data.add_f64(2.0);
44    data.add_str("hello");
45
46    data
47}
48
49#[wll::export]
50fn test_named_heterogenous_data_store() -> DataStore {
51    let mut data = DataStore::new();
52    data.add_named_i64("an i64", 1);
53    data.add_named_f64("an f64", 2.0);
54    data.add_named_str("a str", "hello");
55
56    data
57}
58
59#[wll::export]
60fn test_named_and_unnamed_heterogenous_data_store() -> DataStore {
61    let mut data = DataStore::new();
62    data.add_i64(1);
63    data.add_named_f64("real", 2.0);
64    data.add_named_str("hello", "world");
65
66    data
67}
68
69//======================================
70// Non-atomic types
71//======================================
72
73#[wll::export]
74fn test_named_numeric_array_data_store() -> DataStore {
75    let array = NumericArray::<i64>::from_slice(&[1, 2, 3]).into_generic();
76
77    let mut data = DataStore::new();
78    data.add_named_numeric_array("array", array);
79
80    data
81}
82
83#[wll::export]
84fn test_nested_data_store() -> DataStore {
85    let mut inner = DataStore::new();
86    inner.add_named_bool("is_inner", true);
87
88    let mut outer = DataStore::new();
89    outer.add_named_bool("is_inner", false);
90    outer.add_data_store(inner);
91
92    outer
93}
94
95#[wll::export]
96fn test_iterated_nested_data_store() -> DataStore {
97    let mut store = DataStore::new();
98
99    for level in 0..3 {
100        store.add_named_i64("level", level);
101        let mut new = DataStore::new();
102        new.add_data_store(store);
103        store = new;
104    }
105
106    store
107}
108
109//======================================
110// DataStore arguments
111//======================================
112
113#[wll::export]
114fn test_data_store_arg(ds: DataStore) -> i64 {
115    ds.len() as i64
116}
117
118//======================================
119// DataStore nodes
120//======================================
121
122#[wll::export]
123fn test_data_store_nodes() {
124    {
125        let mut data = DataStore::new();
126        data.add_i64(5);
127
128        assert_eq!(data.len(), 1);
129
130        let node = data.first_node().expect("got first node");
131
132        let ty: sys::type_t = node.data_type_raw();
133
134        assert_eq!(ty, sys::MType_Integer as i32);
135    }
136
137    // Test DataStoreNode::name() method.
138    {
139        let mut data = DataStore::new();
140        data.add_named_i64("hello", 5);
141
142        assert_eq!(data.len(), 1);
143
144        let node = data.first_node().expect("got first node");
145
146        assert_eq!(node.data_type_raw(), sys::MType_Integer as i32);
147        assert_eq!(node.name(), Some("hello".to_owned()))
148    }
149
150    // Test DataStore::nodes() method and Debug formatting of DataStoreNode.
151    {
152        let mut store = DataStore::new();
153
154        store.add_i64(5);
155        store.add_named_bool("condition", true);
156        store.add_str("Hello, World!");
157
158        let mut nodes = store.nodes();
159
160        assert_eq!(
161            format!("{:?}", nodes.next().unwrap()),
162            r#"DataStoreNode { name: None, value: 5 }"#
163        );
164        assert_eq!(
165            format!("{:?}", nodes.next().unwrap()),
166            r#"DataStoreNode { name: Some("condition"), value: true }"#
167        );
168        assert_eq!(
169            format!("{:?}", nodes.next().unwrap()),
170            r#"DataStoreNode { name: None, value: "Hello, World!" }"#
171        );
172        assert!(nodes.next().is_none());
173    }
174}