use crate::{
metadata::tables::{
eventmap::EventMapRaw,
types::{RowWritable, TableId, TableInfoRef},
},
utils::write_le_at_dyn,
Result,
};
impl RowWritable for EventMapRaw {
fn row_write(
&self,
data: &mut [u8],
offset: &mut usize,
_rid: u32,
sizes: &TableInfoRef,
) -> Result<()> {
write_le_at_dyn(data, offset, self.parent, sizes.is_large(TableId::TypeDef))?;
write_le_at_dyn(
data,
offset,
self.event_list,
sizes.is_large(TableId::Event),
)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use crate::metadata::tables::{
eventmap::EventMapRaw,
types::{RowReadable, RowWritable, TableId, TableInfo, TableRow},
};
use crate::metadata::token::Token;
#[test]
fn test_eventmap_row_size() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 100), (TableId::Event, 50)],
false,
false,
false,
));
let expected_size = 2 + 2; assert_eq!(<EventMapRaw as TableRow>::row_size(&sizes), expected_size);
let sizes_large = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 0x10000), (TableId::Event, 0x10000)],
false,
false,
false,
));
let expected_size_large = 4 + 4; assert_eq!(
<EventMapRaw as TableRow>::row_size(&sizes_large),
expected_size_large
);
}
#[test]
fn test_eventmap_row_write_small() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 100), (TableId::Event, 50)],
false,
false,
false,
));
let event_map = EventMapRaw {
rid: 1,
token: Token::new(0x12000001),
offset: 0,
parent: 0x0101,
event_list: 0x0202,
};
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
event_map
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x01, 0x01, 0x02, 0x02, ];
assert_eq!(buffer, expected);
assert_eq!(offset, expected.len());
}
#[test]
fn test_eventmap_row_write_large() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 0x10000), (TableId::Event, 0x10000)],
false,
false,
false,
));
let event_map = EventMapRaw {
rid: 1,
token: Token::new(0x12000001),
offset: 0,
parent: 0x01010101,
event_list: 0x02020202,
};
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
event_map
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, ];
assert_eq!(buffer, expected);
assert_eq!(offset, expected.len());
}
#[test]
fn test_eventmap_round_trip() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 100), (TableId::Event, 50)],
false,
false,
false,
));
let original = EventMapRaw {
rid: 42,
token: Token::new(0x1200002A),
offset: 0,
parent: 25, event_list: 10, };
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
original
.row_write(&mut buffer, &mut offset, 42, &sizes)
.unwrap();
let mut read_offset = 0;
let read_back = EventMapRaw::row_read(&buffer, &mut read_offset, 42, &sizes).unwrap();
assert_eq!(original.rid, read_back.rid);
assert_eq!(original.token, read_back.token);
assert_eq!(original.parent, read_back.parent);
assert_eq!(original.event_list, read_back.event_list);
}
#[test]
fn test_eventmap_different_ranges() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 100), (TableId::Event, 50)],
false,
false,
false,
));
let test_cases = vec![
(1, 1), (2, 5), (10, 15), (50, 30), (1, 0), ];
for (parent_index, event_start) in test_cases {
let event_map = EventMapRaw {
rid: 1,
token: Token::new(0x12000001),
offset: 0,
parent: parent_index,
event_list: event_start,
};
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
event_map
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let mut read_offset = 0;
let read_back = EventMapRaw::row_read(&buffer, &mut read_offset, 1, &sizes).unwrap();
assert_eq!(event_map.parent, read_back.parent);
assert_eq!(event_map.event_list, read_back.event_list);
}
}
#[test]
fn test_eventmap_edge_cases() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 100), (TableId::Event, 50)],
false,
false,
false,
));
let zero_map = EventMapRaw {
rid: 1,
token: Token::new(0x12000001),
offset: 0,
parent: 0,
event_list: 0,
};
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
zero_map
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x00, 0x00, 0x00, 0x00, ];
assert_eq!(buffer, expected);
let max_map = EventMapRaw {
rid: 1,
token: Token::new(0x12000001),
offset: 0,
parent: 0xFFFF,
event_list: 0xFFFF,
};
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
max_map
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
assert_eq!(buffer.len(), 4); }
#[test]
fn test_eventmap_sorted_order() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 100), (TableId::Event, 50)],
false,
false,
false,
));
let entries = [
(1, 1), (2, 5), (3, 10), (5, 15), ];
for (i, (parent, event_start)) in entries.iter().enumerate() {
let event_map = EventMapRaw {
rid: i as u32 + 1,
token: Token::new(0x12000001 + i as u32),
offset: 0,
parent: *parent,
event_list: *event_start,
};
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
event_map
.row_write(&mut buffer, &mut offset, i as u32 + 1, &sizes)
.unwrap();
let written_parent = u16::from_le_bytes([buffer[0], buffer[1]]);
assert_eq!(written_parent as u32, *parent);
let written_event_list = u16::from_le_bytes([buffer[2], buffer[3]]);
assert_eq!(written_event_list as u32, *event_start);
}
}
#[test]
fn test_eventmap_known_binary_format() {
let sizes = Arc::new(TableInfo::new_test(
&[(TableId::TypeDef, 1), (TableId::Event, 1)],
false,
false,
false,
));
let event_map = EventMapRaw {
rid: 1,
token: Token::new(0x12000001),
offset: 0,
parent: 0x0101,
event_list: 0x0202,
};
let mut buffer = vec![0u8; <EventMapRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
event_map
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x01, 0x01, 0x02, 0x02, ];
assert_eq!(buffer, expected);
}
}