arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-hal/src/test_suite/serialization.rs
poulpy-hal/src/test_suite/serialization.rsRaw
 1use std::fmt::Debug;
 2
 3use crate::{
 4    layouts::{FillUniform, ReaderFrom, WriterTo},
 5    source::Source,
 6};
 7
 8/// Generic test for serialization and deserialization.
 9///
10/// - `T` must implement I/O traits, zeroing, cloning, and random filling.
11pub fn test_reader_writer_interface<T>(mut original: T)
12where
13    T: WriterTo + ReaderFrom + PartialEq + Eq + Debug + Clone + FillUniform,
14{
15    // Fill original with uniform random data
16    let mut source = Source::new([0u8; 32]);
17    original.fill_uniform(50, &mut source);
18
19    // Serialize into a buffer
20    let mut buffer = Vec::new();
21    original.write_to(&mut buffer).expect("write_to failed");
22
23    // Prepare receiver: same shape, but randomized
24    let mut receiver = original.clone();
25    receiver.fill_uniform(50, &mut source);
26
27    // Deserialize from buffer
28    let mut reader: &[u8] = &buffer;
29    receiver.read_from(&mut reader).expect("read_from failed");
30
31    // Ensure serialization round-trip correctness
32    assert_eq!(
33        &original, &receiver,
34        "Deserialized object does not match the original"
35    );
36}
37
38#[test]
39fn scalar_znx_serialize() {
40    let original: crate::layouts::ScalarZnx<Vec<u8>> = crate::layouts::ScalarZnx::alloc(1024, 3);
41    test_reader_writer_interface(original);
42}
43
44#[test]
45fn vec_znx_serialize() {
46    let original: crate::layouts::VecZnx<Vec<u8>> = crate::layouts::VecZnx::alloc(1024, 3, 4);
47    test_reader_writer_interface(original);
48}
49
50#[test]
51fn mat_znx_serialize() {
52    let original: crate::layouts::MatZnx<Vec<u8>> = crate::layouts::MatZnx::alloc(1024, 3, 2, 2, 4);
53    test_reader_writer_interface(original);
54}