mod util; use util::*; use anyhow::Result; use firedbg_rust_debugger::{ ArrayType, Breakpoint, BreakpointType, Bytes, Debugger, DebuggerParams, Event, EventStream, LineColumn, PValue, RValue, SourceFile, StringType, VariableCapture, }; use pretty_assertions::assert_eq; use sea_streamer::{Buffer, Consumer, Message, Producer}; use std::time::SystemTime; #[tokio::test] async fn main() -> Result<()> { let testcase = "prim"; let (producer, consumer) = setup(testcase).await?; rustc(&format!("testcases/{testcase}")); Debugger::run( DebuggerParams { binary: format!("testcases/{testcase}.o"), files: vec![ Default::default(), SourceFile { id: 1, path: format!("testcases/{testcase}.rs"), crate_name: testcase.into(), modified: SystemTime::UNIX_EPOCH, }, ], breakpoints: vec![ Default::default(), Breakpoint { id: 1, file_id: 1, loc: LineColumn { line: 62, column: None, }, loc_end: None, breakpoint_type: BreakpointType::Breakpoint, capture: VariableCapture::Locals, }, ], arguments: vec![], }, producer.clone(), ); producer.end().await?; let payload = consumer.next().await?.message().into_bytes(); let event = EventStream::read_from(Bytes::from(payload)); match event { Event::Breakpoint { locals, .. } => { assert_eq!(locals.len(), 29); for (i, (name, value)) in locals.iter().enumerate() { let json = serde_json::to_string(value).unwrap(); println!("{name} = {json}"); if let RValue::Prim(value) = value { match (i, value) { (0, PValue::bool(v)) => assert_eq!(v, &true), (1, PValue::bool(v)) => assert_eq!(v, &false), (2, PValue::char(v)) => assert_eq!(v, &'A'), (3, PValue::u8(v)) => assert_eq!(v, &1), (4, PValue::i8(v)) => assert_eq!(v, &-1), (5, PValue::u16(v)) => assert_eq!(v, &2), (6, PValue::i16(v)) => assert_eq!(v, &-2), (7, PValue::u32(v)) => assert_eq!(v, &3), (8, PValue::i32(v)) => assert_eq!(v, &-3), (9, PValue::u64(v)) => assert_eq!(v, &4), (10, PValue::i64(v)) => assert_eq!(v, &-4), (11, PValue::usize(v)) => assert_eq!(v, &5), (12, PValue::isize(v)) => assert_eq!(v, &-5), (13, PValue::u128(v)) => assert_eq!(v, &6), (14, PValue::i128(v)) => assert_eq!(v, &-6), (15, PValue::f32(v)) => assert_eq!(v, &3.14159274), (16, PValue::f64(v)) => assert_eq!(v, &3.14159265359), err => panic!("{err:?}"), } } else if i == 17 { assert!(matches!(value, RValue::Unit)); } else if i == 18 || i == 19 { match value { RValue::Bytes { typename, value } => { match i { 18 => assert_eq!(typename.as_str(), "[u8; 5]"), 19 => assert_eq!(typename.as_str(), "&[u8]"), _ => unreachable!(), } assert_eq!(value.as_slice(), &[1, 2, 3, 4, 5]); } err => panic!("{err:?}"), } } else if i == 20 { match value { RValue::Bytes { typename, value } => { assert_eq!(typename.as_str(), "Vec"); assert_eq!(value.as_slice(), &[5, 6, 7, 8, 9]); } err => panic!("{err:?}"), } } else if i == 21 { match value { RValue::String { typename: StringType::StrLit, value, } => { assert_eq!(value.as_str(), "hello world"); } err => panic!("{err:?}"), } } else if i == 22 { match value { RValue::String { typename: StringType::String, value, } => { assert_eq!(value.as_str(), "hello world!"); } err => panic!("{err:?}"), } } else if i == 23 { match value { RValue::Bytes { typename, value } => { assert_eq!(typename.as_str(), "Vec"); let val: Vec = Vec::new(); assert_eq!(value.as_slice(), &val); } err => panic!("{err:?}"), } } else if i == 24 { match value { RValue::Array { typename: ArrayType::Vec, data, } => { let val: Vec = Vec::new(); assert_eq!(data, &val); } err => panic!("{err:?}"), } } else if i == 25 { match value { RValue::Bytes { typename, value } => { assert_eq!(typename.as_str(), "&[u8]"); let val: Vec = Vec::new(); assert_eq!(value.as_slice(), &val); } err => panic!("{err:?}"), } } else if i == 26 { match value { RValue::Array { typename: ArrayType::Slice, data, } => { let val: Vec = Vec::new(); assert_eq!(data, &val); } err => panic!("{err:?}"), } } else if i == 27 { match value { RValue::String { typename: StringType::String, value, } => { assert_eq!(value.as_str(), ""); } err => panic!("{err:?}"), } } else if i == 28 { match value { RValue::String { typename: StringType::StrLit, value, } => { assert_eq!(value.as_str(), ""); } err => panic!("{err:?}"), } } } } other => panic!("Unexpected {other:?}"), } Ok(()) }