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}