dioxus-core 0.3.3

Core functionality for Dioxus - a concurrent renderer-agnostic Virtual DOM for interactive user experiences
Documentation
//! Verify that tasks get polled by the virtualdom properly, and that we escape wait_for_work safely

use dioxus::prelude::*;
use std::time::Duration;

static mut POLL_COUNT: usize = 0;

#[tokio::test]
async fn it_works() {
    let mut dom = VirtualDom::new(app);

    let _ = dom.rebuild();

    tokio::select! {
        _ = dom.wait_for_work() => {}
        _ = tokio::time::sleep(Duration::from_millis(500)) => {}
    };

    // By the time the tasks are finished, we should've accumulated ticks from two tasks
    // Be warned that by setting the delay to too short, tokio might not schedule in the tasks
    assert_eq!(unsafe { POLL_COUNT }, 135);
}

fn app(cx: Scope) -> Element {
    cx.use_hook(|| {
        cx.spawn(async {
            for x in 0..10 {
                tokio::time::sleep(Duration::from_micros(50)).await;
                unsafe { POLL_COUNT += x }
            }
        });

        cx.spawn(async {
            for x in 0..10 {
                tokio::time::sleep(Duration::from_micros(25)).await;
                unsafe { POLL_COUNT += x * 2 }
            }
        });
    });

    cx.render(rsx!(()))
}