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