Skip to main content

mdflib_sys/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5// Include the generated bindings from bindgen
6include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
7
8#[cfg(test)]
9mod tests {
10    use super::*;
11    use std::ffi::{CStr, CString};
12    use std::fs;
13    use std::os::raw::c_char;
14    use std::path::Path;
15
16    #[test]
17    fn test_writer_and_reader() {
18        let filename_str = "test_rust.mdf";
19        let filename = CString::new(filename_str).unwrap();
20
21        // Cleanup previous test file if it exists
22        if Path::new(filename_str).exists() {
23            fs::remove_file(filename_str).unwrap();
24        }
25
26        unsafe {
27            // Writer part
28            let writer = MdfWriterInit(MdfWriterType::Mdf4Basic, filename.as_ptr());
29            assert!(!writer.is_null(), "Failed to initialize MdfWriter");
30
31            let file = MdfWriterGetFile(writer);
32            assert!(!file.is_null(), "Failed to get MdfFile from writer");
33
34            let data_group = MdfFileCreateDataGroup(file);
35            assert!(!data_group.is_null(), "Failed to create IDataGroup");
36
37            let channel_group = DataGroupCreateChannelGroup(data_group);
38            assert!(!channel_group.is_null(), "Failed to create IChannelGroup");
39
40            let channel_name = CString::new("TestChannel").unwrap();
41            let channel = ChannelGroupCreateChannel(channel_group);
42            assert!(!channel.is_null(), "Failed to create IChannel");
43            ChannelSetName(channel, channel_name.as_ptr());
44            ChannelSetDataType(channel, ChannelDataType::UnsignedIntegerLe as u8);
45            ChannelSetDataBytes(channel, 4);
46
47            assert!(
48                MdfWriterInitMeasurement(writer),
49                "Failed to init measurement"
50            );
51
52            // Write a single sample
53            let value: u32 = 12345;
54            ChannelSetChannelValue(channel, value, true);
55            MdfWriterSaveSample(writer, channel_group, 0);
56
57            assert!(
58                MdfWriterFinalizeMeasurement(writer),
59                "Failed to finalize measurement"
60            );
61            MdfWriterUnInit(writer);
62
63            // Reader part
64            let reader = MdfReaderInit(filename.as_ptr());
65            assert!(!reader.is_null(), "Failed to initialize MdfReader");
66            assert!(MdfReaderIsOk(reader), "MdfReader is not OK");
67
68            assert!(
69                MdfReaderReadEverythingButData(reader),
70                "Failed to read file metadata"
71            );
72
73            let read_file = MdfReaderGetFile(reader);
74            assert!(!read_file.is_null());
75
76            let dg_count = MdfFileGetDataGroupCount(read_file);
77            assert_eq!(dg_count, 1, "Expected 1 data group");
78
79            let read_dg = MdfFileGetDataGroupByIndex(read_file, 0);
80            assert!(!read_dg.is_null());
81
82            let cg_count = DataGroupGetChannelGroupCount(read_dg);
83            assert_eq!(cg_count, 1, "Expected 1 channel group");
84
85            let read_cg = DataGroupGetChannelGroupByIndex(read_dg, 0);
86            assert!(!read_cg.is_null());
87
88            let ch_count = ChannelGroupGetChannelCount(read_cg);
89            assert_eq!(ch_count, 1, "Expected 1 channel");
90
91            let read_ch = ChannelGroupGetChannelByIndex(read_cg, 0);
92            assert!(!read_ch.is_null());
93
94            let mut buffer: [c_char; 128] = [0; 128];
95            ChannelGetName(read_ch, buffer.as_mut_ptr(), buffer.len());
96            let read_channel_name = CStr::from_ptr(buffer.as_ptr()).to_str().unwrap();
97
98            assert_eq!(
99                read_channel_name, "TestChannel",
100                "Channel name does not match"
101            );
102
103            MdfReaderUnInit(reader);
104        }
105
106        // Final cleanup
107        if Path::new(filename_str).exists() {
108            fs::remove_file(filename_str).unwrap();
109        }
110    }
111}