use eidetica::crdt::{Doc, doc::Value};
use super::helpers::*;
#[test]
fn test_doc_serialization() {
let mut map = eidetica::crdt::Doc::new();
map.set_string("string_key", "string_value");
let mut nested = eidetica::crdt::Doc::new();
nested.set_string("inner", "inner_value");
map.set_doc("map_key", nested);
map.remove("deleted_key");
test_serialization_roundtrip(&map).expect("Serialization roundtrip failed");
let serialized = serde_json::to_string(&map).expect("Serialization failed");
let deserialized: Doc = serde_json::from_str(&serialized).expect("Deserialization failed");
assert_text_value(deserialized.get("string_key").unwrap(), "string_value");
match deserialized.get("map_key").unwrap() {
Value::Doc(m) => assert_text_value(m.get("inner").unwrap(), "inner_value"),
_ => panic!("Expected map value"),
}
assert!(deserialized.as_hashmap().contains_key("deleted_key"));
assert_path_deleted(&deserialized, &["deleted_key"]);
}
#[test]
fn test_serialization_complex_nested_structure() {
let complex_map = create_complex_nested_structure();
test_serialization_roundtrip(&complex_map).expect("Complex serialization failed");
let serialized = serde_json::to_string(&complex_map).expect("Serialization failed");
let deserialized: Doc = serde_json::from_str(&serialized).expect("Deserialization failed");
assert_nested_value(
&deserialized,
&["level2", "level3", "level3_key1"],
"level3_value1",
);
assert_text_value(deserialized.get("top_key").unwrap(), "top_value");
}
#[test]
fn test_serialization_mixed_doc() {
let mixed_map = create_mixed_map();
test_serialization_roundtrip(&mixed_map).expect("Mixed doc serialization failed");
let serialized = serde_json::to_string(&mixed_map).expect("Serialization failed");
let deserialized: Doc = serde_json::from_str(&serialized).expect("Deserialization failed");
assert_text_value(deserialized.get("string_val").unwrap(), "test_string");
match deserialized.get("map_val").unwrap() {
Value::Doc(nested) => assert_text_value(nested.get("nested_key").unwrap(), "nested_value"),
_ => panic!("Expected nested map"),
}
assert_path_deleted(&deserialized, &["deleted_val"]);
}
#[test]
fn test_serialization_empty_doc() {
let empty_map = eidetica::crdt::Doc::new();
test_serialization_roundtrip(&empty_map).expect("Empty doc serialization failed");
let serialized = serde_json::to_string(&empty_map).expect("Serialization failed");
let deserialized: Doc = serde_json::from_str(&serialized).expect("Deserialization failed");
assert_eq!(
deserialized.as_hashmap().len(),
0,
"Empty map should remain empty"
);
}
#[test]
fn test_serialization_tombstone_only_doc() {
let mut tombstone_map = eidetica::crdt::Doc::new();
tombstone_map.remove("tombstone1");
tombstone_map.remove("tombstone2");
tombstone_map.set("direct_tombstone", Value::Deleted);
test_serialization_roundtrip(&tombstone_map).expect("Tombstone-only doc serialization failed");
let serialized = serde_json::to_string(&tombstone_map).expect("Serialization failed");
let deserialized: Doc = serde_json::from_str(&serialized).expect("Deserialization failed");
assert_path_deleted(&deserialized, &["tombstone1"]);
assert_path_deleted(&deserialized, &["tombstone2"]);
assert_path_deleted(&deserialized, &["direct_tombstone"]);
assert_eq!(deserialized.get("tombstone1"), None);
assert_eq!(deserialized.get("tombstone2"), None);
assert_eq!(deserialized.get("direct_tombstone"), None);
}