veecle_os_test/
lib.rs

1//! Utilities for testing actors.
2//!
3//! [`veecle_os_test::execute!`](crate::execute) can be used in place of [`veecle_os::runtime::execute!`](veecle_os_runtime::execute!)
4//! to write tests for actors.
5//!
6//! [`veecle_os_test::block_on_future`](block_on_future) can be used to block the current thread until the future resolves.
7//!
8//! The following example shows how to implement a test:
9//!
10//! ```
11//! #[derive(Debug, Default, veecle_os_runtime::Storable)]
12//! pub struct Number(usize);
13//!
14//! #[derive(Debug, Default, veecle_os_runtime::Storable)]
15//! pub struct Total(usize);
16//! #
17//! # use veecle_os_runtime::{InitializedReader, Never, Reader, Writer};
18//!
19//! // `total_actor` reads numbers from a `Number` reader, keeps a running
20//! // total, and writes running totals to a `Total` writer.
21//! #[veecle_os_runtime::actor]
22//! async fn total_actor(
23//!     mut total: Writer<'_, Total>,
24//!     mut numbers: InitializedReader<'_, Number>,
25//! ) -> Never {
26//!     let mut sum: usize = 0;
27//!     loop {
28//!         numbers.wait_for_update().await.read(|value| {
29//!             sum += value.0;
30//!         });
31//!
32//!         total.write(Total(sum)).await;
33//!     }
34//! }
35//!
36//! // This test writes 1 and 2 to the `Number` slot and verifies that
37//! // `total_actor` writes 1 and 3 as the running totals.
38//!
39//! veecle_os_test::block_on_future(
40//!     veecle_os_test::execute! {
41//!         actors: [TotalActor],
42//!         validation: async |mut total_reader: Reader<'_, Total>, mut numbers_writer: Writer<'_, Number>| {
43//!             numbers_writer.write(Number(0)).await;
44//!             let mut total_reader = total_reader.wait_init().await;
45//!             total_reader.wait_for_update().await.read(|value| {
46//!                 assert_eq!(value.0, 0);
47//!             });
48//!             numbers_writer.write(Number(1)).await;
49//!             total_reader.wait_for_update().await.read(|value| {
50//!                 assert_eq!(value.0, 1);
51//!             });
52//!             numbers_writer.write(Number(2)).await;
53//!             total_reader.wait_for_update().await.read(|value| {
54//!                 assert_eq!(value.0, 3);
55//!             });
56//!         }
57//!     }
58//! );
59//! ```
60
61#![forbid(unsafe_code)]
62#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
63
64#[doc(hidden)]
65mod execute;
66
67/// Reexport of [`futures::executor::block_on`] for convenience.
68pub use futures::executor::block_on as block_on_future;
69
70/// Internal exports for `macro_rules!` purposes.
71#[doc(hidden)]
72pub mod __exports {
73    pub use ::veecle_os_runtime;
74    pub use futures;
75    pub use veecle_os_runtime::Never;
76}