cranpose-ui 0.1.164

UI primitives for Cranpose
Documentation
use std::{cell::Cell, rc::Rc};

use cranpose_core::{Composition, MemoryApplier, location_key};

use super::*;

fn composed<T: Copy + Default + 'static>(body: impl Fn(&Cell<T>) + 'static) -> T {
    let mut composition = Composition::new(MemoryApplier::new());
    let seen = Rc::new(Cell::new(T::default()));
    let recorder = Rc::clone(&seen);
    let mut render = move || body(&recorder);
    composition
        .render(location_key(file!(), line!(), column!()), &mut render)
        .expect("render");
    seen.get()
}

#[test]
fn an_item_key_reaches_what_the_row_composes() {
    let seen: (Option<u64>, Option<u64>, Option<u64>) = composed(|cell| {
        let before = lazy_item_key();
        let inside = Cell::new(None);
        ProvideLazyItemKey(Some(17), || inside.set(lazy_item_key()));
        cell.set((before, inside.get(), lazy_item_key()));
    });
    assert_eq!(seen, (None, Some(17), None));
}

#[test]
fn an_unkeyed_list_reports_no_identity_rather_than_its_position() {
    let seen: Option<u64> = composed(|cell| {
        cell.set(Some(0));
        ProvideLazyItemKey(None, || cell.set(lazy_item_key()));
    });
    assert_eq!(seen, None);
}

#[test]
fn the_composition_local_is_one_instance_per_thread() {
    let seen: bool = composed(|cell| {
        ProvideLazyItemKey(Some(3), || {
            cell.set(local_lazy_item_key().current() == Some(3));
        });
    });
    assert!(seen);
}