From d766d906a6f1d11e3588798a061f9d840dff8764 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Mon, 6 Nov 2023 06:41:49 -0800 Subject: [PATCH] Added async value test --- Cargo.lock | 1 + Cargo.toml | 3 +++ src/value.rs | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index f63204c..5cc6cec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -638,6 +638,7 @@ dependencies = [ "interner", "kempt", "kludgine", + "pollster", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c140e6f..77a4289 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,3 +25,6 @@ kempt = "0.2.1" [profile.dev.package."*"] opt-level = 2 + +[dev-dependencies] +pollster = "0.3.0" diff --git a/src/value.rs b/src/value.rs index 91b8424..1f6cabc 100644 --- a/src/value.rs +++ b/src/value.rs @@ -435,6 +435,61 @@ fn disconnecting_reader_from_dynamic() { assert!(!ref_reader.block_until_updated()); } +#[test] +fn disconnecting_reader_threaded() { + let a = Dynamic::new(1); + let mut a_reader = a.create_reader(); + let b = Dynamic::new(1); + let mut b_reader = b.create_reader(); + + let thread = std::thread::spawn(move || { + b.set(2); + + assert!(a_reader.block_until_updated()); + assert_eq!(a_reader.get(), 2); + assert!(!a_reader.block_until_updated()); + }); + + // Wait for the thread to set b to 2. + assert!(b_reader.block_until_updated()); + assert_eq!(b_reader.get(), 2); + + // Set a to 2 and drop the handle. + a.set(2); + drop(a); + + thread.join().unwrap(); +} + +#[test] +fn disconnecting_reader_async() { + let a = Dynamic::new(1); + let mut a_reader = a.create_reader(); + let b = Dynamic::new(1); + let mut b_reader = b.create_reader(); + + let async_thread = std::thread::spawn(move || { + pollster::block_on(async move { + // Set b to 2, allowing the thread to execute its code. + b.set(2); + + assert!(a_reader.wait_until_updated().await); + assert_eq!(a_reader.get(), 2); + assert!(!a_reader.wait_until_updated().await); + }); + }); + + // Wait for the pollster thread to set b to 2. + assert!(b_reader.block_until_updated()); + assert_eq!(b_reader.get(), 2); + + // Set a to 2 and drop the handle. + a.set(2); + drop(a); + + async_thread.join().unwrap(); +} + /// A tag that represents an individual revision of a [`Dynamic`] value. #[derive(Debug, Clone, Copy, Eq, PartialEq, Default)] pub struct Generation(usize);