use crate::{
metadata::tables::{
standalonesig::StandAloneSigRaw,
types::{RowWritable, TableInfoRef},
},
utils::write_le_at_dyn,
Result,
};
impl RowWritable for StandAloneSigRaw {
fn row_write(
&self,
data: &mut [u8],
offset: &mut usize,
_rid: u32,
sizes: &TableInfoRef,
) -> Result<()> {
write_le_at_dyn(data, offset, self.signature, sizes.is_large_blob())?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use crate::metadata::tables::{
standalonesig::StandAloneSigRaw,
types::{RowReadable, RowWritable, TableInfo, TableRow},
};
use crate::metadata::token::Token;
#[test]
fn test_standalonesig_row_size() {
let sizes = Arc::new(TableInfo::new_test(&[], false, false, false));
let expected_size = 2; assert_eq!(
<StandAloneSigRaw as TableRow>::row_size(&sizes),
expected_size
);
let sizes_large = Arc::new(TableInfo::new_test(&[], true, true, true));
let expected_size_large = 4; assert_eq!(
<StandAloneSigRaw as TableRow>::row_size(&sizes_large),
expected_size_large
);
}
#[test]
fn test_standalonesig_row_write_small() {
let sizes = Arc::new(TableInfo::new_test(&[], false, false, false));
let standalone_sig = StandAloneSigRaw {
rid: 1,
token: Token::new(0x11000001),
offset: 0,
signature: 0x0101,
};
let mut buffer = vec![0u8; <StandAloneSigRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
standalone_sig
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x01, 0x01, ];
assert_eq!(buffer, expected);
assert_eq!(offset, expected.len());
}
#[test]
fn test_standalonesig_row_write_large() {
let sizes = Arc::new(TableInfo::new_test(&[], true, true, true));
let standalone_sig = StandAloneSigRaw {
rid: 1,
token: Token::new(0x11000001),
offset: 0,
signature: 0x01010101,
};
let mut buffer = vec![0u8; <StandAloneSigRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
standalone_sig
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x01, 0x01, 0x01, 0x01, ];
assert_eq!(buffer, expected);
assert_eq!(offset, expected.len());
}
#[test]
fn test_standalonesig_round_trip() {
let sizes = Arc::new(TableInfo::new_test(&[], false, false, false));
let original = StandAloneSigRaw {
rid: 42,
token: Token::new(0x1100002A),
offset: 0,
signature: 256, };
let mut buffer = vec![0u8; <StandAloneSigRaw 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 = StandAloneSigRaw::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.signature, read_back.signature);
}
#[test]
fn test_standalonesig_different_signatures() {
let sizes = Arc::new(TableInfo::new_test(&[], false, false, false));
let test_cases = vec![
1, 100, 200, 300, 400, 500, 1000, 65535, ];
for signature_index in test_cases {
let standalone_sig = StandAloneSigRaw {
rid: 1,
token: Token::new(0x11000001),
offset: 0,
signature: signature_index,
};
let mut buffer = vec![0u8; <StandAloneSigRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
standalone_sig
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let mut read_offset = 0;
let read_back =
StandAloneSigRaw::row_read(&buffer, &mut read_offset, 1, &sizes).unwrap();
assert_eq!(standalone_sig.signature, read_back.signature);
}
}
#[test]
fn test_standalonesig_edge_cases() {
let sizes = Arc::new(TableInfo::new_test(&[], false, false, false));
let zero_sig = StandAloneSigRaw {
rid: 1,
token: Token::new(0x11000001),
offset: 0,
signature: 0,
};
let mut buffer = vec![0u8; <StandAloneSigRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
zero_sig
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x00, 0x00, ];
assert_eq!(buffer, expected);
let max_sig = StandAloneSigRaw {
rid: 1,
token: Token::new(0x11000001),
offset: 0,
signature: 0xFFFF,
};
let mut buffer = vec![0u8; <StandAloneSigRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
max_sig
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
assert_eq!(buffer.len(), 2); }
#[test]
fn test_standalonesig_signature_types() {
let sizes = Arc::new(TableInfo::new_test(&[], false, false, false));
let signature_scenarios = vec![
(1, "Method pointer signature"),
(50, "Local variable signature"),
(100, "Field signature"),
(150, "Generic method signature"),
(200, "Function pointer signature"),
(250, "Property signature"),
(300, "Pinvoke signature"),
(400, "Complex generic signature"),
];
for (sig_index, _description) in signature_scenarios {
let standalone_sig = StandAloneSigRaw {
rid: sig_index,
token: Token::new(0x11000000 + sig_index),
offset: 0,
signature: sig_index,
};
let mut buffer = vec![0u8; <StandAloneSigRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
standalone_sig
.row_write(&mut buffer, &mut offset, sig_index, &sizes)
.unwrap();
let mut read_offset = 0;
let read_back =
StandAloneSigRaw::row_read(&buffer, &mut read_offset, sig_index, &sizes).unwrap();
assert_eq!(standalone_sig.signature, read_back.signature);
}
}
#[test]
fn test_standalonesig_blob_heap_sizes() {
let configurations = vec![
(false, 2), (true, 4), ];
for (large_blob, expected_size) in configurations {
let sizes = Arc::new(TableInfo::new_test(&[], false, large_blob, false));
let standalone_sig = StandAloneSigRaw {
rid: 1,
token: Token::new(0x11000001),
offset: 0,
signature: 0x12345678,
};
assert_eq!(
<StandAloneSigRaw as TableRow>::row_size(&sizes) as usize,
expected_size
);
let mut buffer = vec![0u8; expected_size];
let mut offset = 0;
standalone_sig
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
assert_eq!(buffer.len(), expected_size);
assert_eq!(offset, expected_size);
}
}
#[test]
fn test_standalonesig_known_binary_format() {
let sizes = Arc::new(TableInfo::new_test(&[], false, false, false));
let standalone_sig = StandAloneSigRaw {
rid: 1,
token: Token::new(0x11000001),
offset: 0,
signature: 0x0101,
};
let mut buffer = vec![0u8; <StandAloneSigRaw as TableRow>::row_size(&sizes) as usize];
let mut offset = 0;
standalone_sig
.row_write(&mut buffer, &mut offset, 1, &sizes)
.unwrap();
let expected = vec![
0x01, 0x01, ];
assert_eq!(buffer, expected);
}
}