library_tests/
test_data_store.rs1use 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#[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#[wll::export]
115fn test_data_store_arg(ds: DataStore) -> i64 {
116 ds.len() as i64
117}
118
119#[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 {
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 {
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}