bounce 0.9.0

The uncomplicated state management library for Yew.
Documentation
use std::time::Duration;

use anymap2::AnyMap;
use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure};

wasm_bindgen_test_configure!(run_in_browser);

use bounce::prelude::*;
use bounce::BounceRoot;
use gloo::timers::future::sleep;
use gloo::utils::document;
use yew::prelude::*;

async fn get_text_content<S: AsRef<str>>(selector: S) -> String {
    sleep(Duration::ZERO).await;

    document()
        .query_selector(selector.as_ref())
        .unwrap()
        .unwrap()
        .text_content()
        .unwrap()
}

#[derive(Atom, PartialEq, Default)]
struct State {
    inner: u32,
}

#[function_component(Comp)]
fn comp() -> Html {
    let a = use_atom_value::<State>();

    html! {
        <div>
            <div id="a">{a.inner}</div>
        </div>
    }
}

#[test]
async fn test_without_init_states() {
    #[function_component(Root)]
    fn root() -> Html {
        html! {
            <BounceRoot>
                <Comp />
            </BounceRoot>
        }
    }

    yew::Renderer::<Root>::with_root(document().query_selector("#output").unwrap().unwrap())
        .render();

    let s = get_text_content("#a").await;
    assert_eq!(s, "0");
}

#[test]
async fn test_with_init_states() {
    #[function_component(Root)]
    fn root() -> Html {
        fn get_init_states(_: ()) -> AnyMap {
            let mut map = AnyMap::new();
            map.insert(State { inner: 1 });

            map
        }

        html! {
            <BounceRoot {get_init_states}>
                <Comp />
            </BounceRoot>
        }
    }

    yew::Renderer::<Root>::with_root(document().query_selector("#output").unwrap().unwrap())
        .render();

    let s = get_text_content("#a").await;
    assert_eq!(s, "1");
}