leptos_sync_core/crdt/basic/
mod.rs1pub mod counter;
10pub mod lww_map;
11pub mod lww_register;
12pub mod replica_id;
13pub mod traits;
14
15pub use counter::GCounter;
17pub use lww_map::LwwMap;
18pub use lww_register::LwwRegister;
19pub use replica_id::ReplicaId;
20pub use traits::{CRDT, Mergeable};
21
22#[cfg(test)]
23mod integration_tests {
24 use super::*;
25
26 #[test]
27 fn test_basic_crdt_integration() {
28 let replica_id = ReplicaId::default();
29
30 let mut register = LwwRegister::new("initial", replica_id);
32 register.update("updated", replica_id);
33 assert_eq!(register.value(), &"updated");
34
35 let mut map = LwwMap::new();
37 map.insert("key1", "value1", replica_id);
38 assert_eq!(map.get(&"key1"), Some(&"value1"));
39
40 let mut counter = GCounter::new();
42 counter.increment(replica_id);
43 counter.increment(replica_id);
44 assert_eq!(counter.value(), 2);
45 }
46
47 #[test]
48 fn test_crdt_traits_implementation() {
49 let replica_id = ReplicaId::default();
50
51 let register: LwwRegister<String> = LwwRegister::new("test".to_string(), replica_id);
53 let map: LwwMap<String, String> = LwwMap::new();
54 let counter = GCounter::new();
55
56 let _: &dyn CRDT = ®ister;
58 let _: &dyn CRDT = ↦
59 let _: &dyn CRDT = &counter;
60 }
61
62 #[test]
63 fn test_mergeable_traits_implementation() {
64 let replica_id = ReplicaId::default();
65
66 let mut reg1 = LwwRegister::new("value1", replica_id);
68 let reg2 = LwwRegister::new("value2", replica_id);
69
70 std::thread::sleep(std::time::Duration::from_millis(1));
71 reg1.merge(®2).unwrap();
72 assert_eq!(reg1.value(), &"value2");
73
74 let mut map1 = LwwMap::new();
76 let mut map2 = LwwMap::new();
77
78 map1.insert("key1", "value1", replica_id);
79 map2.insert("key2", "value2", replica_id);
80
81 map1.merge(&map2).unwrap();
82 assert_eq!(map1.len(), 2);
83
84 let mut counter1 = GCounter::new();
86 let mut counter2 = GCounter::new();
87
88 counter1.increment(replica_id);
89 counter2.increment(replica_id);
90 counter2.increment(replica_id);
91
92 counter1.merge(&counter2).unwrap();
93 assert_eq!(counter1.value(), 2);
94 }
95
96 #[test]
97 fn test_replica_id_usage() {
98 let replica_id1 = ReplicaId::default();
99 let replica_id2 = ReplicaId::default();
100
101 assert_ne!(replica_id1, replica_id2);
103
104 let serialized = serde_json::to_string(&replica_id1).unwrap();
106 let deserialized: ReplicaId = serde_json::from_str(&serialized).unwrap();
107 assert_eq!(replica_id1, deserialized);
108 }
109}