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 = "return_array";
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: "u8_10".into(),
args: vec![],
},
Expected::FnRet {
name: "u8_10".into(),
value: "[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a]".into(),
},
Expected::FnCall {
name: "u8_9".into(),
args: vec![],
},
Expected::FnRet {
name: "u8_9".into(),
value: "[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09]".into(),
},
Expected::FnCall {
name: "u8_8".into(),
args: vec![],
},
Expected::FnRet {
name: "u8_8".into(),
value: "[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]".into(),
},
Expected::FnCall {
name: "u8_6".into(),
args: vec![],
},
Expected::FnRet {
name: "u8_6".into(),
value: "[0x01, 0x02, 0x03, 0x04, 0x05, 0x06]".into(),
},
Expected::FnCall {
name: "u8_4".into(),
args: vec![],
},
Expected::FnRet {
name: "u8_4".into(),
value: "[0x01, 0x02, 0x03, 0x04]".into(),
},
Expected::FnCall {
name: "u8_2".into(),
args: vec![],
},
Expected::FnRet {
name: "u8_2".into(),
value: "[0x01, 0x02]".into(),
},
Expected::FnCall {
name: "u8_1".into(),
args: vec![],
},
Expected::FnRet {
name: "u8_1".into(),
value: "[0x01]".into(),
},
Expected::FnCall {
name: "u16_1".into(),
args: vec![],
},
Expected::FnRet {
name: "u16_1".into(),
value: "[1u16]".into(),
},
Expected::FnCall {
name: "u16_2".into(),
args: vec![],
},
Expected::FnRet {
name: "u16_2".into(),
value: "[1u16, 2u16]".into(),
},
Expected::FnCall {
name: "u16_4".into(),
args: vec![],
},
Expected::FnRet {
name: "u16_4".into(),
value: "[1u16, 2u16, 3u16, 4u16]".into(),
},
Expected::FnCall {
name: "u16_5".into(),
args: vec![],
},
Expected::FnRet {
name: "u16_5".into(),
value: "[1u16, 2u16, 3u16, 4u16, 5u16]".into(),
},
Expected::FnCall {
name: "u16_6".into(),
args: vec![],
},
Expected::FnRet {
name: "u16_6".into(),
value: "[1u16, 2u16, 3u16, 4u16, 5u16, 6u16]".into(),
},
Expected::FnCall {
name: "i16_1".into(),
args: vec![],
},
Expected::FnRet {
name: "i16_1".into(),
value: "[1i16]".into(),
},
Expected::FnCall {
name: "i16_2".into(),
args: vec![],
},
Expected::FnRet {
name: "i16_2".into(),
value: "[1i16, 2i16]".into(),
},
Expected::FnCall {
name: "i16_4".into(),
args: vec![],
},
Expected::FnRet {
name: "i16_4".into(),
value: "[1i16, 2i16, 3i16, 4i16]".into(),
},
Expected::FnCall {
name: "i16_5".into(),
args: vec![],
},
Expected::FnRet {
name: "i16_5".into(),
value: "[1i16, 2i16, 3i16, 4i16, 5i16]".into(),
},
Expected::FnCall {
name: "i16_6".into(),
args: vec![],
},
Expected::FnRet {
name: "i16_6".into(),
value: "[1i16, 2i16, 3i16, 4i16, 5i16, 6i16]".into(),
},
Expected::FnCall {
name: "u32_1".into(),
args: vec![],
},
Expected::FnRet {
name: "u32_1".into(),
value: "[1u32]".into(),
},
Expected::FnCall {
name: "u32_2".into(),
args: vec![],
},
Expected::FnRet {
name: "u32_2".into(),
value: "[1u32, 2u32]".into(),
},
Expected::FnCall {
name: "u32_3".into(),
args: vec![],
},
Expected::FnRet {
name: "u32_3".into(),
value: "[1u32, 2u32, 3u32]".into(),
},
Expected::FnCall {
name: "u32_4".into(),
args: vec![],
},
Expected::FnRet {
name: "u32_4".into(),
value: "[1u32, 2u32, 3u32, 4u32]".into(),
},
Expected::FnCall {
name: "i32_1".into(),
args: vec![],
},
Expected::FnRet {
name: "i32_1".into(),
value: "[1i32]".into(),
},
Expected::FnCall {
name: "i32_2".into(),
args: vec![],
},
Expected::FnRet {
name: "i32_2".into(),
value: "[1i32, 2i32]".into(),
},
Expected::FnCall {
name: "i32_3".into(),
args: vec![],
},
Expected::FnRet {
name: "i32_3".into(),
value: "[1i32, 2i32, 3i32]".into(),
},
Expected::FnCall {
name: "i32_4".into(),
args: vec![],
},
Expected::FnRet {
name: "i32_4".into(),
value: "[1i32, 2i32, 3i32, 4i32]".into(),
},
Expected::FnCall {
name: "u64_1".into(),
args: vec![],
},
Expected::FnRet {
name: "u64_1".into(),
value: "[1u64]".into(),
},
Expected::FnCall {
name: "u64_2".into(),
args: vec![],
},
Expected::FnRet {
name: "u64_2".into(),
value: "[1u64, 2u64]".into(),
},
Expected::FnCall {
name: "u64_3".into(),
args: vec![],
},
Expected::FnRet {
name: "u64_3".into(),
value: "[1u64, 2u64, 3u64]".into(),
},
Expected::FnCall {
name: "i64_1".into(),
args: vec![],
},
Expected::FnRet {
name: "i64_1".into(),
value: "[1i64]".into(),
},
Expected::FnCall {
name: "i64_2".into(),
args: vec![],
},
Expected::FnRet {
name: "i64_2".into(),
value: "[1i64, 2i64]".into(),
},
Expected::FnCall {
name: "i64_3".into(),
args: vec![],
},
Expected::FnRet {
name: "i64_3".into(),
value: "[1i64, 2i64, 3i64]".into(),
},
Expected::FnCall {
name: "u128_1".into(),
args: vec![],
},
Expected::FnRet {
name: "u128_1".into(),
value: "[1u128]".into(),
},
Expected::FnCall {
name: "u128_2".into(),
args: vec![],
},
Expected::FnRet {
name: "u128_2".into(),
value: "[1u128, 2u128]".into(),
},
Expected::FnCall {
name: "u128_3".into(),
args: vec![],
},
Expected::FnRet {
name: "u128_3".into(),
value: "[1u128, 2u128, 3u128]".into(),
},
Expected::FnCall {
name: "i128_1".into(),
args: vec![],
},
Expected::FnRet {
name: "i128_1".into(),
value: "[1i128]".into(),
},
Expected::FnCall {
name: "i128_2".into(),
args: vec![],
},
Expected::FnRet {
name: "i128_2".into(),
value: "[1i128, 2i128]".into(),
},
Expected::FnCall {
name: "i128_3".into(),
args: vec![],
},
Expected::FnRet {
name: "i128_3".into(),
value: "[1i128, 2i128, 3i128]".into(),
},
Expected::FnCall {
name: "f32_1".into(),
args: vec![],
},
Expected::FnRet {
name: "f32_1".into(),
value: "[1f32]".into(),
},
Expected::FnCall {
name: "f32_2".into(),
args: vec![],
},
Expected::FnRet {
name: "f32_2".into(),
value: "[1f32, 2f32]".into(),
},
Expected::FnCall {
name: "f32_3".into(),
args: vec![],
},
Expected::FnRet {
name: "f32_3".into(),
value: "[1f32, 2f32, 3f32]".into(),
},
Expected::FnCall {
name: "f64_1".into(),
args: vec![],
},
Expected::FnRet {
name: "f64_1".into(),
value: "[1f64]".into(),
},
Expected::FnCall {
name: "f64_2".into(),
args: vec![],
},
Expected::FnRet {
name: "f64_2".into(),
value: "[1f64, 2f64]".into(),
},
Expected::FnCall {
name: "f64_3".into(),
args: vec![],
},
Expected::FnRet {
name: "f64_3".into(),
value: "[1f64, 2f64, 3f64]".into(),
},
Expected::FnCall {
name: "usize_1".into(),
args: vec![],
},
Expected::FnRet {
name: "usize_1".into(),
value: "[1usize]".into(),
},
Expected::FnCall {
name: "usize_2".into(),
args: vec![],
},
Expected::FnRet {
name: "usize_2".into(),
value: "[1usize, 2usize]".into(),
},
Expected::FnCall {
name: "usize_3".into(),
args: vec![],
},
Expected::FnRet {
name: "usize_3".into(),
value: "[1usize, 2usize, 3usize]".into(),
},
Expected::FnCall {
name: "isize_1".into(),
args: vec![],
},
Expected::FnRet {
name: "isize_1".into(),
value: "[1isize]".into(),
},
Expected::FnCall {
name: "isize_2".into(),
args: vec![],
},
Expected::FnRet {
name: "isize_2".into(),
value: "[1isize, 2isize]".into(),
},
Expected::FnCall {
name: "isize_3".into(),
args: vec![],
},
Expected::FnRet {
name: "isize_3".into(),
value: "[1isize, 2isize, 3isize]".into(),
},
Expected::FnCall {
name: "str_1".into(),
args: vec![],
},
Expected::FnRet {
name: "str_1".into(),
value: r#"["1"]"#.into(),
},
Expected::FnCall {
name: "str_2".into(),
args: vec![],
},
Expected::FnRet {
name: "str_2".into(),
value: r#"["1", "2"]"#.into(),
},
Expected::FnCall {
name: "str_3".into(),
args: vec![],
},
Expected::FnRet {
name: "str_3".into(),
value: r#"["1", "2", "3"]"#.into(),
},
Expected::FnCall {
name: "wrapped_9".into(),
args: vec![],
},
Expected::FnRet {
name: "wrapped_9".into(),
value: "return_array::Wrapper<[u8; 9]>([0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01])"
.into(),
},
Expected::FnCall {
name: "wrapped_8".into(),
args: vec![],
},
Expected::FnRet {
name: "wrapped_8".into(),
value: "return_array::Wrapper<[u8; 8]>([0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01])"
.into(),
},
Expected::FnCall {
name: "multi_9".into(),
args: vec![],
},
Expected::FnRet {
name: "multi_9".into(),
value: "[[0x01, 0x02, 0x03], [0x04, 0x05, 0x06], [0x07, 0x08, 0x09]]".into(),
},
Expected::FnCall {
name: "multi_4x2".into(),
args: vec![],
},
Expected::FnRet {
name: "multi_4x2".into(),
value: "[[0x01, 0x02, 0x03, 0x04], [0x05, 0x06, 0x07, 0x08]]".into(),
},
Expected::FnCall {
name: "multi_2x4".into(),
args: vec![],
},
Expected::FnRet {
name: "multi_2x4".into(),
value: "[[0x01, 0x02], [0x03, 0x04], [0x05, 0x06], [0x07, 0x08]]".into(),
},
Expected::FnCall {
name: "multi_w_9".into(),
args: vec![],
},
Expected::FnRet {
name: "multi_w_9".into(),
value: "return_array::Wrapper<[[u8; 3]; 3]>([[0x09, 0x08, 0x07], [0x06, 0x05, 0x04], [0x03, 0x02, 0x01]])".into(),
},
Expected::FnCall {
name: "multi_w_4x2".into(),
args: vec![],
},
Expected::FnRet {
name: "multi_w_4x2".into(),
value: "return_array::Wrapper<[[u8; 4]; 2]>([[0x08, 0x07, 0x06, 0x05], [0x04, 0x03, 0x02, 0x01]])".into(),
},
Expected::FnCall {
name: "multi_w_2x4".into(),
args: vec![],
},
Expected::FnRet {
name: "multi_w_2x4".into(),
value: "return_array::Wrapper<[[u8; 2]; 4]>([[0x08, 0x07], [0x06, 0x05], [0x04, 0x03], [0x02, 0x01]])".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(())
}