mod util; use util::*; use anyhow::Result; use firedbg_rust_debugger::{Bytes, Debugger, EventStream}; use sea_streamer::{Buffer, Consumer, Message, Producer}; #[tokio::test] async fn main() -> Result<()> { let testcase = "more_option"; let (producer, consumer) = setup(testcase).await?; let debugger_params = debugger_params_from_file(testcase); Debugger::run(debugger_params, producer.clone()); producer.end().await?; let expected = vec![ Expected::FnCall { name: "main".into(), args: vec![], }, Expected::FnCall { name: "capture".into(), args: vec![ expand("&BNode { i: 1i32, next: Option>::Some(Box::new(BNode { i: 2i32, next: Option>::None })) }") ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnCall { name: "capture".into(), args: vec![ expand("&BNode { i: 1i32, next: Option>::Some(Box::new(BNode { i: 2i32, next: Option>::Some(Box::new(BNode { i: 3i32, next: Option>::None })) })) }") ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnCall { name: "capture".into(), args: vec![ "&alloc::boxed::Box::::new(\"hello\")".to_owned() ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnCall { name: "capture".into(), args: vec![ expand("&Option>::Some(Box::::new(\"hello\"))") ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnCall { name: "capture".into(), args: vec![ expand("&RCNode { i: 11i32, next: Option>::None }") ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnCall { name: "capture".into(), args: vec![ expand("&RCNode { i: 11i32, next: Option>::Some(Rc::new(RCNode { i: 22i32, next: Option>::None })) }") ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnCall { name: "capture".into(), args: vec![ expand("&RCNode { i: 11i32, next: Option>::Some(Rc::new(RCNode { i: 22i32, next: Option>::Some(Rc::new(RCNode { i: 33i32, next: Option>::None })) })) }") ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnCall { name: "capture".into(), args: vec![ expand("&RCCNode { i: 11i32, next: Option>::Some(Arc::new(RCCNode { i: 22i32, next: Option>::Some(Arc::new(RCCNode { i: 33i32, next: Option>::None })) })) }") ], }, Expected::FnRet { name: "capture".into(), value: "()".into(), }, Expected::FnRet { name: "main".into(), value: "()".into(), }, ]; let mut events = Vec::new(); for i in 0..expected.len() { let payload = consumer.next().await?.message().into_bytes(); let event = EventStream::read_from(Bytes::from(payload)); println!("#{i} {:?}", event); events.push(event); } verify(testcase, events, expected); Ok(()) } fn expand(string: &str) -> String { string .replace("BNode", "more_option::BNode") .replace("RCNode", "more_option::RCNode") .replace("RCCNode", "more_option::RCCNode") .replace("Option<", "core::option::Option::<") .replace("Box", "alloc::boxed::Box") .replace("Rc", "alloc::rc::Rc") .replace("Arc", "alloc::sync::Arc") }