use atomr_core::serialization::{JsonSerializer, SerializationRegistry, Serializer, SerializerError};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
struct Greeting {
who: String,
n: u32,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
struct Other {
flag: bool,
}
#[test]
fn registered_serializer_roundtrips_typed_value() {
let reg = SerializationRegistry::new();
reg.register(JsonSerializer::<Greeting>::new(101));
let original = Greeting { who: "world".into(), n: 7 };
let bytes = reg.to_bytes(&original).expect("serialize");
let back: Greeting = reg.from_bytes(&bytes).expect("deserialize");
assert_eq!(back, original);
}
#[test]
fn manifest_reports_rust_type_name() {
let s = JsonSerializer::<Greeting>::new(7);
assert_eq!(s.manifest(), std::any::type_name::<Greeting>());
assert_eq!(s.identifier(), 7);
}
#[test]
fn registry_resolves_registered_type_and_rejects_unregistered() {
let reg = SerializationRegistry::new();
reg.register(JsonSerializer::<Greeting>::new(1));
let g = Greeting { who: "a".into(), n: 1 };
let bytes = reg.to_bytes(&g).expect("serialize Greeting");
let _: Greeting = reg.from_bytes(&bytes).expect("deserialize Greeting");
let other = Other { flag: true };
let err = reg.to_bytes(&other).expect_err("Other not registered");
assert!(matches!(err, SerializerError::NotRegistered));
let err = reg.from_bytes::<Other>(&[1, 2, 3]).expect_err("Other not registered");
assert!(matches!(err, SerializerError::NotRegistered));
}
#[test]
fn registering_twice_overrides_previous_serializer() {
let reg = SerializationRegistry::new();
reg.register(JsonSerializer::<Greeting>::new(1));
reg.register(JsonSerializer::<Greeting>::new(2));
let g = Greeting { who: "z".into(), n: 9 };
let bytes = reg.to_bytes(&g).expect("serialize");
let back: Greeting = reg.from_bytes(&bytes).expect("deserialize");
assert_eq!(back, g);
}
#[test]
fn decode_failure_surfaces_decode_error() {
let reg = SerializationRegistry::new();
reg.register(JsonSerializer::<Greeting>::new(1));
let err = reg.from_bytes::<Greeting>(b"not json").expect_err("decode fails");
assert!(matches!(err, SerializerError::Decode(_)), "unexpected: {err:?}");
}
#[test]
fn json_default_produces_stable_bytes_for_primitives() {
let s_u32 = JsonSerializer::<u32>::new(10);
assert_eq!(Serializer::<u32>::to_bytes(&s_u32, &42).expect("encode"), b"42".to_vec());
let s_str = JsonSerializer::<String>::new(11);
assert_eq!(
Serializer::<String>::to_bytes(&s_str, &"hi".to_string()).expect("encode"),
b"\"hi\"".to_vec(),
);
let s_bool = JsonSerializer::<bool>::new(12);
assert_eq!(Serializer::<bool>::to_bytes(&s_bool, &true).expect("encode"), b"true".to_vec());
let a = Serializer::<u32>::to_bytes(&s_u32, &123).expect("encode a");
let b = Serializer::<u32>::to_bytes(&s_u32, &123).expect("encode b");
assert_eq!(a, b);
}
#[test]
fn json_default_struct_bytes_are_stable_and_roundtrip() {
let reg = SerializationRegistry::new();
reg.register(JsonSerializer::<Greeting>::new(1));
let g = Greeting { who: "stable".into(), n: 3 };
let a = reg.to_bytes(&g).expect("encode a");
let b = reg.to_bytes(&g).expect("encode b");
assert_eq!(a, b, "JSON encoding must be deterministic");
assert_eq!(a, br#"{"who":"stable","n":3}"#.to_vec());
}