use crate::endian::Endian;
use crate::format::line;
use crate::model::LineEntry;
use super::ENDIANS;
#[test]
fn line_table_handles_mixed_delta_and_same_address_rows() {
let base = 0x1000;
let lines = vec![
LineEntry {
address: base,
file: 1.into(),
line: 10,
},
LineEntry {
address: base + 0x10,
file: 1.into(),
line: 11,
},
LineEntry {
address: base + 0x100,
file: 1.into(),
line: 1000,
},
LineEntry {
address: base + 0x120,
file: 1.into(),
line: 900,
},
LineEntry {
address: base + 0x120,
file: 2.into(),
line: 2000,
},
LineEntry {
address: base + 0x121,
file: 2.into(),
line: 2001,
},
LineEntry {
address: base + 0x122,
file: 2.into(),
line: 2002,
},
LineEntry {
address: base + 0x123,
file: 2.into(),
line: 2003,
},
];
for endian in ENDIANS {
let bytes = line::encode(&lines, endian, base).unwrap();
assert_eq!(line::decode(&bytes, endian, base).unwrap(), lines);
assert_eq!(line::lookup(&bytes, endian, base, base - 1).unwrap(), None);
assert_eq!(
line::lookup(&bytes, endian, base, base + 0x11).unwrap(),
lines.get(1).copied()
);
assert_eq!(
line::lookup(&bytes, endian, base, base + 0x200).unwrap(),
lines.last().copied()
);
}
let little = line::encode(&lines, Endian::Little, base).unwrap();
assert_eq!(line::decode(&little, Endian::Big, base).unwrap(), lines);
}
#[test]
fn line_table_reports_truncation_and_encode_errors() {
let base = 0x1000;
let lines = [
LineEntry {
address: base,
file: 1.into(),
line: 10,
},
LineEntry {
address: base + 0x10,
file: 1.into(),
line: 11,
},
];
for endian in ENDIANS {
let bytes = line::encode(&lines, endian, base).unwrap();
for length in 0..bytes.len() {
assert!(line::decode(bytes.split_at(length).0, endian, base).is_err());
}
assert!(line::encode(&[], endian, base).is_err());
assert!(line::encode(&lines, endian, base + 1).is_err());
assert!(line::encode(&[lines[1], lines[0]], endian, base).is_err());
let malformed_programs: [&[u8]; 5] = [
&[1],
&[1, 10],
&[1, 10, 20],
&[1, 10, 20, 1],
&[1, 10, 20, 1, 5, 2],
];
for bytes in malformed_programs {
assert!(line::decode(bytes, endian, base).is_err());
}
}
}