1 use futures_task::{FutureObj, Spawn, SpawnError};
2 use std::cell::{Ref, RefCell};
3 
4 /// An implementation of [`Spawn`](futures_task::Spawn) that records
5 /// any [`Future`](futures_core::future::Future)s spawned on it.
6 ///
7 /// # Examples
8 ///
9 /// ```
10 /// use futures::task::SpawnExt;
11 /// use futures_test::task::RecordSpawner;
12 ///
13 /// let recorder = RecordSpawner::new();
14 /// recorder.spawn(async { }).unwrap();
15 /// assert_eq!(recorder.spawned().len(), 1);
16 /// ```
17 #[derive(Debug, Default)]
18 pub struct RecordSpawner {
19     spawned: RefCell<Vec<FutureObj<'static, ()>>>,
20 }
21 
22 impl RecordSpawner {
23     /// Create a new instance
new() -> Self24     pub fn new() -> Self {
25         Default::default()
26     }
27 
28     /// Inspect any futures that were spawned onto this [`Spawn`].
spawned(&self) -> Ref<'_, Vec<FutureObj<'static, ()>>>29     pub fn spawned(&self) -> Ref<'_, Vec<FutureObj<'static, ()>>> {
30         self.spawned.borrow()
31     }
32 }
33 
34 impl Spawn for RecordSpawner {
spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError>35     fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> {
36         self.spawned.borrow_mut().push(future);
37         Ok(())
38     }
39 }
40