Ported example 5
This commit is contained in:
@@ -154,7 +154,7 @@ mod tests {
|
||||
use std::cell::{Cell as Counter, RefCell};
|
||||
use std::rc::Rc;
|
||||
|
||||
use ruin_runtime::{queue_task, run};
|
||||
use ruin_runtime::{queue_future, queue_task, run, yield_now};
|
||||
|
||||
use crate::{Reactor, cell_in};
|
||||
|
||||
@@ -213,4 +213,36 @@ mod tests {
|
||||
run();
|
||||
assert_eq!(reruns.get(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn effects_rerun_after_async_future_updates_a_dependency() {
|
||||
let seen = Rc::new(RefCell::new(Vec::new()));
|
||||
let handle_slot = Rc::new(RefCell::new(None::<EffectHandle>));
|
||||
|
||||
queue_task({
|
||||
let seen = Rc::clone(&seen);
|
||||
let handle_slot = Rc::clone(&handle_slot);
|
||||
move || {
|
||||
let reactor = Reactor::new();
|
||||
let source = cell_in(&reactor, 0usize);
|
||||
let effect = reactor.effect({
|
||||
let seen = Rc::clone(&seen);
|
||||
let source = source.clone();
|
||||
move || seen.borrow_mut().push(source.get())
|
||||
});
|
||||
*handle_slot.borrow_mut() = Some(effect);
|
||||
|
||||
std::mem::drop(queue_future({
|
||||
let source = source.clone();
|
||||
async move {
|
||||
yield_now().await;
|
||||
let _ = source.set(1);
|
||||
}
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
run();
|
||||
assert_eq!(&*seen.borrow(), &[0, 1]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user