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