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