mod util;
use util::*;
use anyhow::Result;
use firedbg_rust_debugger::{
Breakpoint, BreakpointType, Bytes, Debugger, DebuggerParams, Event, EventStream, LineColumn,
RValue, SourceFile, 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 = "object";
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: 50,
column: None,
},
loc_end: None,
breakpoint_type: BreakpointType::Breakpoint,
capture: VariableCapture::Only(vec!["man".to_owned(), "auto".to_owned()]),
},
],
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(), 2);
for (i, (name, value)) in locals.iter().enumerate() {
match i {
0 => {
assert_eq!(name.as_str(), "man");
let json = serde_json::to_string(value).unwrap();
println!("{name} = {json}");
assert_eq!(
json,
r#"{"type":"Struct","typename":"object::Car","fields":{"brand":{"type":"String","typename":"&str","value":"Ford"},"engine":{"type":"Struct","typename":"object::Engine","fields":{"config":{"type":"Union","typeinfo":{"name":"object::EngineConfig","variants":["Inline","Vshape"]},"variant":"Inline","fields":{"i":{"type":"Prim","typename":"i32","value":4}}},"pistons":{"type":"Array","typename":"vec","data":[{"type":"Struct","typename":"object::Piston","fields":{"0":{"type":"Prim","typename":"u8","value":1}}},{"type":"Struct","typename":"object::Piston","fields":{"0":{"type":"Prim","typename":"u8","value":2}}},{"type":"Struct","typename":"object::Piston","fields":{"0":{"type":"Prim","typename":"u8","value":3}}},{"type":"Struct","typename":"object::Piston","fields":{"0":{"type":"Prim","typename":"u8","value":4}}}]}}},"gearbox":{"type":"Enum","typename":"object::Gearbox","variant":"Manual"}}}"#
);
}
1 => {
assert_eq!(name.as_str(), "auto");
if let RValue::Ref {
typename, value, ..
} = value
{
assert_eq!(typename.to_string().as_str(), "Box");
let json = serde_json::to_string(value).unwrap();
println!("{name} = {json}");
assert_eq!(
json,
r#"{"type":"Struct","typename":"object::Car","fields":{"brand":{"type":"String","typename":"&str","value":"Mazda"},"engine":{"type":"Struct","typename":"object::Engine","fields":{"config":{"type":"Union","typeinfo":{"name":"object::EngineConfig","variants":["Inline","Vshape"]},"variant":"Vshape","fields":{"0":{"type":"Prim","typename":"i16","value":3},"1":{"type":"Prim","typename":"i16","value":3}}},"pistons":{"type":"Array","typename":"vec","data":[]}}},"gearbox":{"type":"Enum","typename":"object::Gearbox","variant":"Automatic"}}}"#
);
} else {
panic!("{value:?}");
}
}
_ => unreachable!(),
}
}
}
other => panic!("Unexpected {other:?}"),
}
Ok(())
}