leptos_sync_core/crdt/basic/
mod.rs

1//! Basic CRDT implementations
2//!
3//! This module provides fundamental CRDT types including:
4//! - ReplicaId: Unique identifier for replicas
5//! - LwwRegister: Last-Write-Wins Register
6//! - LwwMap: Last-Write-Wins Map
7//! - GCounter: Grow-only Counter
8
9pub mod counter;
10pub mod lww_map;
11pub mod lww_register;
12pub mod replica_id;
13pub mod traits;
14
15// Re-export main types for convenience
16pub 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        // Test LwwRegister
31        let mut register = LwwRegister::new("initial", replica_id);
32        register.update("updated", replica_id);
33        assert_eq!(register.value(), &"updated");
34
35        // Test LwwMap
36        let mut map = LwwMap::new();
37        map.insert("key1", "value1", replica_id);
38        assert_eq!(map.get(&"key1"), Some(&"value1"));
39
40        // Test GCounter
41        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        // Test that all basic CRDT types implement the required traits
52        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        // This should compile if all types implement CRDT trait
57        let _: &dyn CRDT = &register;
58        let _: &dyn CRDT = &map;
59        let _: &dyn CRDT = &counter;
60    }
61
62    #[test]
63    fn test_mergeable_traits_implementation() {
64        let replica_id = ReplicaId::default();
65
66        // Test LwwRegister merge
67        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(&reg2).unwrap();
72        assert_eq!(reg1.value(), &"value2");
73
74        // Test LwwMap merge
75        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        // Test GCounter merge
85        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        // Test that different replicas are different
102        assert_ne!(replica_id1, replica_id2);
103
104        // Test serialization
105        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}