futures_test/task/panic_spawner.rs
1use futures_core::future::FutureObj;
2use futures_core::task::{Spawn, SpawnError};
3
4/// An implementation of [`Spawn`](futures_core::task::Spawn) that panics
5/// when used.
6///
7/// # Examples
8///
9/// ```should_panic
10/// use futures::task::SpawnExt;
11/// use futures_test::task::PanicSpawner;
12///
13/// let mut spawn = PanicSpawner::new();
14/// spawn.spawn(async { })?; // Will panic
15/// # Ok::<(), Box<dyn std::error::Error>>(())
16/// ```
17#[derive(Debug)]
18pub struct PanicSpawner {
19 _reserved: (),
20}
21
22impl PanicSpawner {
23 /// Create a new instance
24 pub fn new() -> Self {
25 Self { _reserved: () }
26 }
27}
28
29impl Spawn for PanicSpawner {
30 fn spawn_obj(
31 &mut self,
32 _future: FutureObj<'static, ()>,
33 ) -> Result<(), SpawnError> {
34 panic!("should not spawn")
35 }
36}
37
38impl Default for PanicSpawner {
39 fn default() -> Self {
40 Self::new()
41 }
42}
43
44/// Get a reference to a singleton instance of [`PanicSpawner`].
45///
46/// # Examples
47///
48/// ```should_panic
49/// use futures::task::SpawnExt;
50/// use futures_test::task::panic_spawner_mut;
51///
52/// let spawner = panic_spawner_mut();
53/// spawner.spawn(async { })?; // Will panic
54/// # Ok::<(), Box<dyn std::error::Error>>(())
55/// ```
56pub fn panic_spawner_mut() -> &'static mut PanicSpawner {
57 Box::leak(Box::new(PanicSpawner::new()))
58}