use mecha10_core::state::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct TestState {
counter: u64,
name: String,
}
#[tokio::test]
async fn test_memory_state_manager_save_load() {
let mgr = MemoryStateManager::new();
let state = TestState {
counter: 42,
name: "test".to_string(),
};
mgr.save("node1", &state).await.unwrap();
let loaded: Option<TestState> = mgr.load("node1").await.unwrap();
assert_eq!(loaded, Some(state));
}
#[tokio::test]
async fn test_memory_state_manager_snapshot() {
let mgr = MemoryStateManager::new();
let state = TestState {
counter: 1,
name: "v1".to_string(),
};
mgr.save("node1", &state).await.unwrap();
let snapshot = mgr
.create_snapshot("node1", Some("Snapshot 1".to_string()))
.await
.unwrap();
let state2 = TestState {
counter: 2,
name: "v2".to_string(),
};
mgr.save("node1", &state2).await.unwrap();
let loaded: TestState = mgr.load("node1").await.unwrap().unwrap();
assert_eq!(loaded.counter, 2);
mgr.restore_snapshot(&snapshot.id).await.unwrap();
let restored: TestState = mgr.load("node1").await.unwrap().unwrap();
assert_eq!(restored.counter, 1);
}
#[tokio::test]
async fn test_memory_state_manager_compare_and_swap() {
let mgr = MemoryStateManager::new();
let state = TestState {
counter: 10,
name: "cas".to_string(),
};
mgr.save("node1", &state).await.unwrap();
let new_state = TestState {
counter: 20,
name: "cas".to_string(),
};
let success = mgr.compare_and_swap("node1", &state, &new_state).await.unwrap();
assert!(success);
let loaded: TestState = mgr.load("node1").await.unwrap().unwrap();
assert_eq!(loaded.counter, 20);
let wrong_expected = TestState {
counter: 15,
name: "cas".to_string(),
};
let success = mgr.compare_and_swap("node1", &wrong_expected, &state).await.unwrap();
assert!(!success);
}