use super::Diffable;
use std::fmt::Debug;
use crate::{CreatedDelta, Patchable};
use serde::de::DeserializeOwned;
use serde::Serialize;
pub struct DipaImplTester<
's,
'e,
T: Debug + Diffable<'s, 'e, T> + Patchable<<T as Diffable<'s, 'e, T>>::DeltaOwned> + PartialEq,
> {
pub label: Option<&'s str>,
pub start: &'s mut T,
pub end: &'e T,
pub expected_delta: T::Delta,
pub expected_serialized_patch_size: usize,
pub expected_did_change: bool,
}
impl<'s, 'e, T> DipaImplTester<'s, 'e, T>
where
<T as Diffable<'s, 'e, T>>::Delta: Serialize + Debug + PartialEq,
<T as Diffable<'s, 'e, T>>::DeltaOwned: DeserializeOwned,
T: Debug,
T: Diffable<'s, 'e, T>,
T: Patchable<<T as Diffable<'s, 'e, T>>::DeltaOwned>,
T: PartialEq,
{
pub fn test(self) {
let start = unsafe { &mut *(self.start as *mut T) };
let CreatedDelta { delta, did_change } = start.create_delta_towards(self.end);
assert_eq!(
delta, self.expected_delta,
r#"
Test Label {:?}
"#,
self.label
);
assert_eq!(did_change, self.expected_did_change);
let delta_bytes = postcard::to_allocvec(&delta).unwrap();
let patch: <T as Diffable<'s, 'e, T>>::DeltaOwned =
postcard::from_bytes(&delta_bytes[..]).unwrap();
self.start.apply_patch(patch);
assert_eq!(self.start, self.end, "{:?}", self.label);
assert_eq!(
delta_bytes.len(),
self.expected_serialized_patch_size,
r#"
Expected patch size to be: {}
Actually computed: {}
Test Label: {:?}
"#,
self.expected_serialized_patch_size,
delta_bytes.len(),
self.label
);
}
}