#![cfg(any(feature = "notebook", feature = "mcp"))]
use std::future::Future as StdFuture;
use std::pin::Pin;
use std::task::{Context, Poll};
use std::time::Duration;
use tokio::time::sleep;
pub struct AsyncRuntime {
}
impl AsyncRuntime {
pub fn new() -> Self {
Self {}
}
pub fn spawn<T>(&self, future: impl StdFuture<Output = T> + Send + 'static) -> JoinHandle<T>
where
T: Send + 'static,
{
JoinHandle {
handle: tokio::spawn(future),
}
}
pub async fn sleep(&self, duration: Duration) {
sleep(duration).await;
}
}
impl Default for AsyncRuntime {
fn default() -> Self {
Self::new()
}
}
pub struct JoinHandle<T> {
handle: tokio::task::JoinHandle<T>,
}
impl<T> StdFuture for JoinHandle<T> {
type Output = T;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match Pin::new(&mut self.handle).poll(cx) {
Poll::Ready(Ok(value)) => Poll::Ready(value),
Poll::Ready(Err(_)) => panic!("Task panicked"),
Poll::Pending => Poll::Pending,
}
}
}
pub trait Future {
type Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[test]
fn test_async_runtime_new() {
let _runtime = AsyncRuntime::new();
}
#[test]
fn test_async_runtime_default() {
let _runtime = AsyncRuntime::default();
}
#[tokio::test]
async fn test_async_runtime_sleep() {
let runtime = AsyncRuntime::new();
runtime.sleep(Duration::from_millis(1)).await;
}
#[tokio::test]
async fn test_async_runtime_sleep_actually_waits() {
use std::time::Instant;
let runtime = AsyncRuntime::new();
let start = Instant::now();
runtime.sleep(Duration::from_millis(50)).await;
let elapsed = start.elapsed();
assert!(
elapsed >= Duration::from_millis(40),
"Sleep should delay at least 40ms, got {elapsed:?}"
);
}
#[tokio::test]
async fn test_async_runtime_spawn() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { 42 });
let result = handle.await;
assert_eq!(result, 42);
}
#[tokio::test]
async fn test_async_runtime_spawn_multiple() {
let runtime = AsyncRuntime::new();
let handle1 = runtime.spawn(async { 10 });
let handle2 = runtime.spawn(async { 20 });
let handle3 = runtime.spawn(async { 30 });
assert_eq!(handle1.await, 10);
assert_eq!(handle2.await, 20);
assert_eq!(handle3.await, 30);
}
#[tokio::test]
async fn test_async_runtime_spawn_with_sleep() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async {
sleep(Duration::from_millis(1)).await;
"completed"
});
let result = handle.await;
assert_eq!(result, "completed");
}
#[test]
fn test_async_runtime_is_send_sync() {
fn assert_send<T: Send>() {}
fn assert_sync<T: Sync>() {}
assert_send::<AsyncRuntime>();
assert_sync::<AsyncRuntime>();
}
#[tokio::test]
async fn test_spawn_returns_correct_type_integer_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { 100i64 });
let result: i64 = handle.await;
assert_eq!(result, 100);
}
#[tokio::test]
async fn test_spawn_returns_correct_type_string_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { String::from("hello world") });
let result: String = handle.await;
assert_eq!(result, "hello world");
}
#[tokio::test]
async fn test_spawn_returns_correct_type_vec_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { vec![1, 2, 3, 4, 5] });
let result: Vec<i32> = handle.await;
assert_eq!(result, vec![1, 2, 3, 4, 5]);
}
#[tokio::test]
async fn test_spawn_returns_option_some_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { Some(42) });
let result: Option<i32> = handle.await;
assert_eq!(result, Some(42));
}
#[tokio::test]
async fn test_spawn_returns_option_none_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { None::<i32> });
let result: Option<i32> = handle.await;
assert_eq!(result, None);
}
#[tokio::test]
async fn test_spawn_returns_result_ok_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { Ok::<_, String>(42) });
let result: Result<i32, String> = handle.await;
assert_eq!(result, Ok(42));
}
#[tokio::test]
async fn test_spawn_returns_result_err_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { Err::<i32, _>("error".to_string()) });
let result: Result<i32, String> = handle.await;
assert_eq!(result, Err("error".to_string()));
}
#[tokio::test]
async fn test_spawn_returns_tuple_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async { (1, "two", 3.0) });
let result = handle.await;
assert_eq!(result, (1, "two", 3.0));
}
#[tokio::test]
async fn test_spawn_concurrent_execution_r162() {
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
let runtime = AsyncRuntime::new();
let counter = Arc::new(AtomicUsize::new(0));
let c1 = counter.clone();
let c2 = counter.clone();
let c3 = counter.clone();
let h1 = runtime.spawn(async move {
c1.fetch_add(1, Ordering::SeqCst);
});
let h2 = runtime.spawn(async move {
c2.fetch_add(10, Ordering::SeqCst);
});
let h3 = runtime.spawn(async move {
c3.fetch_add(100, Ordering::SeqCst);
});
h1.await;
h2.await;
h3.await;
assert_eq!(counter.load(Ordering::SeqCst), 111);
}
#[tokio::test]
async fn test_sleep_zero_duration_r162() {
let runtime = AsyncRuntime::new();
runtime.sleep(Duration::from_secs(0)).await;
}
#[tokio::test]
async fn test_sleep_very_short_duration_r162() {
let runtime = AsyncRuntime::new();
let start = std::time::Instant::now();
runtime.sleep(Duration::from_nanos(1)).await;
assert!(start.elapsed() < Duration::from_millis(100));
}
#[tokio::test]
async fn test_spawn_with_captured_variables_r162() {
let runtime = AsyncRuntime::new();
let x = 10;
let y = 20;
let handle = runtime.spawn(async move { x + y });
assert_eq!(handle.await, 30);
}
#[tokio::test]
async fn test_spawn_nested_async_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async {
let inner = async { 42 };
inner.await
});
assert_eq!(handle.await, 42);
}
#[tokio::test]
async fn test_multiple_runtimes_r162() {
let runtime1 = AsyncRuntime::new();
let runtime2 = AsyncRuntime::new();
let h1 = runtime1.spawn(async { 1 });
let h2 = runtime2.spawn(async { 2 });
assert_eq!(h1.await, 1);
assert_eq!(h2.await, 2);
}
#[tokio::test]
async fn test_spawn_empty_closure_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async {});
handle.await; }
#[tokio::test]
async fn test_spawn_with_loop_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async {
let mut sum = 0;
for i in 0..10 {
sum += i;
}
sum
});
assert_eq!(handle.await, 45);
}
#[tokio::test]
async fn test_spawn_with_match_r162() {
let runtime = AsyncRuntime::new();
let handle = runtime.spawn(async {
let x = Some(42);
match x {
Some(v) => v * 2,
None => 0,
}
});
assert_eq!(handle.await, 84);
}
#[tokio::test]
async fn test_spawn_chain_r162() {
let runtime = AsyncRuntime::new();
let h1 = runtime.spawn(async { 10 });
let v1 = h1.await;
let h2 = runtime.spawn(async move { v1 + 20 });
let v2 = h2.await;
let h3 = runtime.spawn(async move { v2 + 30 });
let v3 = h3.await;
assert_eq!(v3, 60);
}
}