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