mod util; use util::*; use anyhow::Result; use firedbg_rust_debugger::{Bytes, Debugger, Event, EventStream}; use pretty_assertions::assert_eq; use sea_streamer::{Buffer, Consumer, Message, Producer}; #[tokio::test] async fn main() -> Result<()> { let testcase = "fn_prologue"; let (producer, consumer) = setup(testcase).await?; let debugger_params = debugger_params_from_file(testcase); Debugger::run(debugger_params, producer.clone()); producer.end().await?; for i in 0..12 { let payload = consumer.next().await?.message().into_bytes(); let event = EventStream::read_from(Bytes::from(payload)); // println!("#{i} {:?}", event); match &event { Event::FunctionCall { function_name, arguments, .. } => { assert_eq!( function_name, match i { 0 => "fn_prologue::main", 1 => "fn_prologue::no_prolog", 3 => "fn_prologue::prolog", 4 => "fn_prologue::dice", 6 => "fn_prologue::dice", 8 => "fn_prologue::dice", _ => panic!("Unexpected i {i}"), } ); match i { 1 => { assert_eq!(arguments.len(), 1); assert_eq!(arguments[0].1.to_string(), "12345678i32"); } 3 => { assert_eq!(arguments.len(), 3); assert_eq!(arguments[0].1.to_string(), "1234i32"); assert_eq!(arguments[1].1.to_string(), "5678i32"); assert_eq!(arguments[2].1.to_string(), "12345678i32"); } _ => (), } println!("[{i}] {function_name}({})", event.format_arguments()); } Event::FunctionReturn { function_name, return_value, .. } => { let return_value = return_value.to_string(); assert_eq!( return_value, match i { 2 => "()", 5 => "core::result::Result::::Ok(1234i32)", 7 => "core::result::Result::::Ok(5678i32)", 9 => "core::result::Result::::Ok(12345678i32)", 10 => "core::result::Result::<(), ()>::Ok(())", 11 => "()", i => panic!("Unexpected i {i}"), } ); println!("[{i}] {function_name}(..) -> {return_value}"); } _ => (), } } Ok(()) }