mod util; use util::*; use anyhow::Result; use firedbg_rust_debugger::{Bytes, Debugger, Event, EventStream, RValue}; use pretty_assertions::assert_eq; use sea_streamer::{Buffer, Consumer, Message, Producer}; #[tokio::test] async fn main() -> Result<()> { let testcase = "return_result"; let debugger_params = debugger_params_from_file(testcase); let (producer, consumer) = setup(testcase).await?; Debugger::run(debugger_params, producer.clone()); producer.end().await?; for i in 0..138 { let payload = consumer.next().await?.message().into_bytes(); let event = EventStream::read_from(Bytes::from(payload)); // println!("#{i} {:?}", event); match event { Event::FunctionReturn { function_name, mut return_value, .. } => { return_value.redact_addr(); let json = serde_json::to_string(&return_value).unwrap(); if let RValue::Result { .. } = return_value { assert_eq!( json, match i { 2 => r#"{"type":"Result","typename":"core::result::Result<(), ()>","variant":"Ok","value":{"type":"Unit"}}"#.to_owned(), 4 => r#"{"type":"Result","typename":"core::result::Result<(), ()>","variant":"Err","value":{"type":"Unit"}}"#.to_owned(), 6 => make_result("i8", "()", Ok(()), "8"), 8 => r#"{"type":"Result","typename":"core::result::Result","variant":"Err","value":{"type":"Unit"}}"#.to_owned(), 10 => make_result("i32", "i32", Ok(()), "88888"), 12 => make_result("i32", "i32", Err(()), "-222222"), 14 => make_result("u32", "i32", Ok(()), "88888"), 16 => make_result("u32", "i32", Err(()), "-222222"), 18 => make_result("i8", "u8", Ok(()), "-2"), 20 => make_result("i8", "u8", Err(()), "250"), 22 => make_result("i16", "i32", Ok(()), "-4444"), 24 => make_result("i16", "i32", Err(()), "222222"), 26 => make_result("i32", "i64", Ok(()), "-222222"), 28 => make_result("i32", "i64", Err(()), "\"22222222222\""), 30 => make_result("i8", "i8", Ok(()), "22"), 32 => make_result("i8", "i8", Err(()), "-108"), 34 => make_result("u64", "i64", Ok(()), "\"22222222222\""), 36 => make_result("u64", "i64", Err(()), "\"-222222222\""), 38 => make_result("f32", "f32", Ok(()), "2.2"), 40 => make_result("f32", "f32", Err(()), "3.3"), 42 => make_result("f32", "f64", Ok(()), "2.2"), 44 => make_result("f32", "f64", Err(()), "3.3"), 46 => make_result("f64", "f64", Ok(()), "2.2"), 48 => make_result("f64", "f64", Err(()), "3.3"), // 50 => r#"{"type":"Result","typename":"core::result::Result<&i32, &u64>","variant":"Err","value":{"type":"Ref","typename":"ref","addr":"","value":{"type":"Prim","typename":"u64","value":"12"}}}"#.to_owned(), 52 => r#"{"type":"Result","typename":"core::result::Result<&i32, &u64>","variant":"Ok","value":{"type":"Ref","typename":"ref","addr":"","value":{"type":"Prim","typename":"i32","value":2222}}}"#.to_owned(), 54 => // Small has been boiled down r#"{"type":"Result","typename":"core::result::Result","variant":"Ok","value":{"type":"Prim","typename":"i32","value":8888}}"#.to_owned(), 56 => make_result("return_result::Small", "i32", Err(()), "-222222"), 58 => r#"{"type":"Result","typename":"core::result::Result","variant":"Ok","value":{"type":"Struct","typename":"return_result::Small","fields":{"i":{"type":"Struct","typename":"return_result::Inner","fields":{"0":{"type":"Prim","typename":"i32","value":8888}}}}}}"#.to_owned(), 60 => r#"{"type":"Result","typename":"core::result::Result","variant":"Err","value":{"type":"Struct","typename":"return_result::Big","fields":{"i":{"type":"Struct","typename":"return_result::Inner","fields":{"0":{"type":"Prim","typename":"i32","value":2222}}},"t":{"type":"Prim","typename":"i64","value":"-101"}}}}"#.to_owned(), 62 => r#"{"type":"Result","typename":"core::result::Result<(), &str>","variant":"Ok","value":{"type":"Unit"}}"#.to_owned(), 64 => r#"{"type":"Result","typename":"core::result::Result<(), &str>","variant":"Err","value":{"type":"String","typename":"&str","value":"hello"}}"#.to_owned(), 66 => r#"{"type":"Result","typename":"core::result::Result<&str, ()>","variant":"Ok","value":{"type":"String","typename":"&str","value":"world"}}"#.to_owned(), 68 => r#"{"type":"Result","typename":"core::result::Result<&str, ()>","variant":"Err","value":{"type":"Unit"}}"#.to_owned(), 70 => r#"{"type":"Result","typename":"core::result::Result<(), bool>","variant":"Ok","value":{"type":"Unit"}}"#.to_owned(), 72 => make_result("()", "bool", Err(()), "true"), 74 => make_result("()", "bool", Err(()), "false"), 76 => make_result("bool", "()", Err(()), "()"), 78 => make_result("bool", "()", Ok(()), "true"), 80 => make_result("bool", "()", Ok(()), "false"), 82 => make_result("bool", "bool", Ok(()), "false"), 84 => make_result("bool", "bool", Ok(()), "true"), 86 => make_result("bool", "bool", Err(()), "false"), 88 => make_result("bool", "bool", Err(()), "true"), 90 => make_result("i128", "i128", Ok(()), "\"22222222222222222222\""), 92 => make_result("i128", "i128", Err(()), "\"-22222222222222222222\""), 94 => make_result("()", "i128", Ok(()), "()"), 96 => make_result("()", "i128", Err(()), "\"-22222222222222222222\""), 98 => make_result("u128", "()", Ok(()), "\"22222222222222222222\""), 100 => make_result("u128", "()", Err(()), "()"), 102 => make_result("i128", "u128", Ok(()), "\"-22222222222222222222\""), 104 => make_result("i128", "u128", Err(()), "\"170141183460469231731687303715884105727\""), 106 => r#"{"type":"Result","typename":"core::result::Result, ()>","variant":"Ok","value":{"type":"DynRef","typename":"alloc::boxed::Box","addr":"","vtable":"","value":{"type":"Opaque"}}}"#.to_owned(), 108 => r#"{"type":"Result","typename":"core::result::Result, ()>","variant":"Err","value":{"type":"Unit"}}"#.to_owned(), 110 => r#"{"type":"Result","typename":"core::result::Result, alloc::boxed::Box>","variant":"Ok","value":{"type":"DynRef","typename":"alloc::boxed::Box","addr":"","vtable":"","value":{"type":"Struct","typename":"return_result::Big","fields":{"i":{"type":"Struct","typename":"return_result::Inner","fields":{"0":{"type":"Prim","typename":"i32","value":2222}}},"t":{"type":"Prim","typename":"i64","value":"-101"}}}}}"#.to_owned(), 112 => r#"{"type":"Result","typename":"core::result::Result, alloc::boxed::Box>","variant":"Err","value":{"type":"DynRef","typename":"alloc::boxed::Box","addr":"","vtable":"","value":{"type":"Struct","typename":"return_result::Small","fields":{"i":{"type":"Struct","typename":"return_result::Inner","fields":{"0":{"type":"Prim","typename":"i32","value":8888}}}}}}}"#.to_owned(), 114 => r#"{"type":"Result","typename":"core::result::Result, ()>","variant":"Ok","value":{"type":"DynRefCounted","typename":"alloc::rc::Rc","addr":"","strong":1,"weak":1,"vtable":"","value":{"type":"Struct","typename":"dyn return_result::Mass","fields":{}}}}"#.to_owned(), 116 => r#"{"type":"Result","typename":"core::result::Result, ()>","variant":"Err","value":{"type":"Unit"}}"#.to_owned(), 118 => r#"{"type":"Result","typename":"core::result::Result, alloc::rc::Rc>","variant":"Ok","value":{"type":"DynRefCounted","typename":"alloc::rc::Rc","addr":"","strong":1,"weak":1,"vtable":"","value":{"type":"Struct","typename":"return_result::Big","fields":{"i":{"type":"Struct","typename":"return_result::Inner","fields":{"0":{"type":"Prim","typename":"i32","value":2222}}},"t":{"type":"Prim","typename":"i64","value":"-101"}}}}}"#.to_owned(), 120 => r#"{"type":"Result","typename":"core::result::Result, alloc::rc::Rc>","variant":"Err","value":{"type":"DynRefCounted","typename":"alloc::rc::Rc","addr":"","strong":1,"weak":1,"vtable":"","value":{"type":"Struct","typename":"return_result::Small","fields":{"i":{"type":"Struct","typename":"return_result::Inner","fields":{"0":{"type":"Prim","typename":"i32","value":8888}}}}}}}"#.to_owned(), 122 => make_result("char", "()", Ok(()), "\"🔥\""), 124 => make_result("char", "()", Err(()), "()"), 126 => make_result("()", "char", Ok(()), "()"), 128 => make_result("()", "char", Err(()), "\"🔥\""), 130 => make_any_result("Bytes", "&[u8]", "()", Ok(()), "[1,2,3]"), 132 => make_any_result("Bytes", "&[u8]", "()", Err(()), "()"), 134 => make_any_result("Slice", "()", "&[char]", Ok(()), "()"), 136 => make_slice_result("Prim", "()", "&[char]", Err(()), &["🌊","🦦","🦀"]), _ => panic!("Unexpected i {i}"), }.as_str() ); println!("[{i}] {function_name}() -> {return_value}"); } else if i == 137 { assert!(matches!(return_value, RValue::Unit)); } else { panic!("{json}"); } } _ => (), } } Ok(()) } fn make_result(left: &str, right: &str, is_ok: Result<(), ()>, v: &str) -> String { make_any_result("Prim", left, right, is_ok, v) } fn make_any_result(ty: &str, left: &str, right: &str, is_ok: Result<(), ()>, v: &str) -> String { let is_ok = is_ok.is_ok(); format!( r#"{{"type":"Result","typename":"core::result::Result<{}, {}>","variant":"{}","value":{}}}"#, left, right, if is_ok { "Ok" } else { "Err" }, if v == "()" { r#"{"type":"Unit"}"#.to_owned() } else { format!( r#"{{"type":"{}","typename":"{}","value":{}}}"#, ty, if is_ok { left } else { right }, v ) } ) } fn make_slice_result( ty: &str, left: &str, right: &str, is_ok: Result<(), ()>, vals: &[&str], ) -> String { let is_ok = is_ok.is_ok(); format!( r#"{{"type":"Result","typename":"core::result::Result<{}, {}>","variant":"{}","value":{}}}"#, left, right, if is_ok { "Ok" } else { "Err" }, { let val_ty = if is_ok { left } else { right }; let vals: Vec<_> = vals .into_iter() .map(|v| { format!( r#"{{"type":"{}","typename":"{}","value":"{}"}}"#, ty, &val_ty[2..val_ty.len() - 1], v ) }) .collect(); format!( r#"{{"type":"Array","typename":"slice","data":[{}]}}"#, vals.join(",") ) } ) }