lgui-core 0.2.0

Platform-neutral runtime and UI primitives for LGUI
Documentation
use super::*;

#[test]
fn queued_updates_are_batched_by_owner() {
    let store = HookStateStore::new();
    let queue = UiUpdateQueue::new();
    let components = ComponentTree::new();
    components.begin_render();
    let owner = components.root(UiId::owned("component"), "component");
    let hook = HookId::new(owner, 0, super::super::HookSlotKind::State);
    let invalidation_id = UiId::owned("component");
    assert_eq!(store.value(hook, || 1_i32), 1);

    queue.enqueue(owner, invalidation_id.clone(), hook, 2_i32);
    queue.enqueue_update(owner, invalidation_id.clone(), hook, |value: &mut i32| {
        *value += 3
    });

    assert_eq!(queue.apply(&store, &components), vec![invalidation_id]);
    assert_eq!(store.value(hook, || 0_i32), 5);
}

#[test]
fn stale_updates_do_not_recreate_unmounted_state() {
    let store = HookStateStore::new();
    let queue = UiUpdateQueue::new();
    let components = ComponentTree::new();
    components.begin_render();
    let owner = components.root(UiId::owned("removed"), "removed");
    let hook = HookId::new(owner, 0, super::super::HookSlotKind::State);

    queue.enqueue(owner, UiId::owned("removed"), hook, 4_i32);
    components.begin_render();
    components.end_render();

    assert!(queue.apply(&store, &components).is_empty());
    assert!(!store.contains(hook));
}

#[test]
fn explicit_frame_requests_are_coalesced_and_consumed_separately_from_state_updates() {
    let queue = UiUpdateQueue::new();

    queue.request_frame();
    queue.request_frame();

    assert!(!queue.is_empty());
    assert!(queue.take_frame_request());
    assert!(!queue.take_frame_request());
    assert!(queue.is_empty());
}

#[test]
fn abort_render_removes_hooks_created_by_the_abandoned_frame() {
    let store = HookStateStore::new();
    let components = ComponentTree::new();
    components.begin_render();
    let owner = components.root(UiId::owned("component"), "component");
    components.finish_component(owner);
    components.end_render();
    let hook = HookId::new(owner, 0, super::super::HookSlotKind::State);

    store.begin_render();
    assert_eq!(store.value(hook, || 7_u32), 7);
    store.abort_render(&components);

    assert!(!store.contains(hook));
}