cougr-core 1.0.0

Cougr - A Soroban-compatible ECS framework for on-chain gaming on Stellar
Documentation
use super::*;
use soroban_sdk::{symbol_short, Env};

#[test]
fn test_simple_query_cache() {
    let env = Env::default();
    let mut world = crate::simple_world::SimpleWorld::new(&env);

    let e1 = world.spawn_entity();
    let data = soroban_sdk::Bytes::from_array(&env, &[1, 2, 3, 4]);
    world.add_component(e1, symbol_short!("pos"), data);

    let mut cache = SimpleQueryCache::new(symbol_short!("pos"), &env);

    let results = cache.execute(&world, &env);
    assert_eq!(results.len(), 1);
    assert!(cache.is_valid(world.version()));

    let results2 = cache.execute(&world, &env);
    assert_eq!(results2.len(), 1);

    let e2 = world.spawn_entity();
    let data2 = soroban_sdk::Bytes::from_array(&env, &[5, 6, 7, 8]);
    world.add_component(e2, symbol_short!("pos"), data2);
    assert!(!cache.is_valid(world.version()));

    let results3 = cache.execute(&world, &env);
    assert_eq!(results3.len(), 2);
    assert!(cache.is_valid(world.version()));
}

#[test]
fn test_simple_query_cache_invalidate() {
    let env = Env::default();
    let mut cache = SimpleQueryCache::new(symbol_short!("test"), &env);
    let mut world = crate::simple_world::SimpleWorld::new(&env);
    let entity = world.spawn_entity();
    world.add_component(
        entity,
        symbol_short!("test"),
        soroban_sdk::Bytes::from_array(&env, &[1]),
    );
    let _ = cache.execute(&world, &env);
    assert!(cache.is_valid(world.version()));
    cache.invalidate();
    assert!(!cache.is_valid(world.version()));
}

#[test]
fn test_simple_query_builder_with_sparse_and_any() {
    let env = Env::default();
    let mut world = crate::simple_world::SimpleWorld::new(&env);

    let e1 = world.spawn_entity();
    world.add_component(
        e1,
        symbol_short!("pos"),
        soroban_sdk::Bytes::from_array(&env, &[1]),
    );

    let e2 = world.spawn_entity();
    world.add_component_with_storage(
        e2,
        symbol_short!("tag"),
        soroban_sdk::Bytes::from_array(&env, &[2]),
        crate::component::ComponentStorage::Sparse,
    );

    let query = SimpleQueryBuilder::new(&env)
        .with_any_component(symbol_short!("pos"))
        .with_any_component(symbol_short!("tag"))
        .include_sparse()
        .build();

    let results = query.execute(&world, &env);
    assert_eq!(results.len(), 2);
}

#[test]
fn test_simple_query_state_tracks_world_version() {
    let env = Env::default();
    let mut world = crate::simple_world::SimpleWorld::new(&env);
    let query = SimpleQueryBuilder::new(&env)
        .with_component(symbol_short!("pos"))
        .build();
    let mut state = SimpleQueryState::new(query, &env);

    assert_eq!(state.execute(&world, &env).len(), 0);
    assert!(state.is_valid(world.version()));

    let entity = world.spawn_entity();
    world.add_component(
        entity,
        symbol_short!("pos"),
        soroban_sdk::Bytes::from_array(&env, &[3]),
    );

    assert!(!state.is_valid(world.version()));
    assert_eq!(state.execute(&world, &env).len(), 1);
}

#[test]
fn test_simple_query_bulk_filters_and_candidate_count() {
    let env = Env::default();
    let mut world = crate::simple_world::SimpleWorld::new(&env);

    let e1 = world.spawn_entity();
    world.add_component(
        e1,
        symbol_short!("pos"),
        soroban_sdk::Bytes::from_array(&env, &[1]),
    );
    world.add_component(
        e1,
        symbol_short!("vel"),
        soroban_sdk::Bytes::from_array(&env, &[2]),
    );

    let e2 = world.spawn_entity();
    world.add_component(
        e2,
        symbol_short!("pos"),
        soroban_sdk::Bytes::from_array(&env, &[3]),
    );
    world.add_component_with_storage(
        e2,
        symbol_short!("sleep"),
        soroban_sdk::Bytes::from_array(&env, &[4]),
        crate::component::ComponentStorage::Sparse,
    );

    let query = SimpleQueryBuilder::new(&env)
        .with_components(&[symbol_short!("pos")])
        .without_components(&[symbol_short!("sleep")])
        .with_any_components(&[symbol_short!("vel"), symbol_short!("sleep")])
        .include_sparse()
        .build();

    assert_eq!(query.candidate_count(&world, &env), 2);
    let results = query.execute(&world, &env);
    assert_eq!(results.len(), 1);
    assert_eq!(results.get(0), Some(e1));
}