mecha10-core 4.2.2

Mecha10 core runtime and foundational types
Documentation
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);
}