fusor-core 0.1.5

Signals, component ownership and the browser DOM runtime for fusor applications
Documentation
use fusor::{
    bind::{Checkbox, TextValue, selected},
    effect, signal,
};
use std::{cell::RefCell, rc::Rc};

#[test]
fn text_adapter_preserves_invalid_drafts_and_equivalent_edits_until_model_changes() {
    let model = signal(12_i32);
    let draft = Rc::new(RefCell::new("12".to_owned()));
    let _binding = effect({
        let (model, draft) = (model.clone(), draft.clone());
        move || {
            if !model.shows(&draft.borrow()) {
                *draft.borrow_mut() = model.text();
            }
        }
    });
    *draft.borrow_mut() = "-".into();
    model.edit(draft.borrow().clone());
    assert_eq!(model.get(), 12);
    assert_eq!(&*draft.borrow(), "-");
    *draft.borrow_mut() = "012".into();
    model.edit(draft.borrow().clone());
    assert_eq!(model.get(), 12);
    assert_eq!(&*draft.borrow(), "012");
    model.set(13);
    assert_eq!(&*draft.borrow(), "13");
}

#[test]
fn checkbox_adapters_reuse_boolean_and_parsed_membership_behavior() {
    let flag = signal(false);
    flag.check("unused", true);
    assert!(flag.checked("unused"));
    flag.check("unused", false);
    assert!(!flag.get());

    let choices = signal(vec![1_u32]);
    choices.check("2", true);
    choices.check("02", true);
    choices.check("invalid", true);
    assert_eq!(choices.get(), [1, 2]);
    assert!(selected(&choices, "02"));
    choices.check("2", false);
    assert_eq!(choices.get(), [1]);
    assert!(!choices.checked("2"));
}