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