use crate::{
metadata::tables::{
assemblyos::AssemblyOsRaw,
types::{RowWritable, TableInfoRef},
},
utils::write_le_at,
Result,
};
impl RowWritable for AssemblyOsRaw {
fn row_write(
&self,
data: &mut [u8],
offset: &mut usize,
_rid: u32,
_sizes: &TableInfoRef,
) -> Result<()> {
write_le_at(data, offset, self.os_platform_id)?;
write_le_at(data, offset, self.os_major_version)?;
write_le_at(data, offset, self.os_minor_version)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
metadata::tables::types::{RowReadable, TableInfo, TableRow},
metadata::token::Token,
};
#[test]
fn test_round_trip_serialization() {
let original_row = AssemblyOsRaw {
rid: 1,
token: Token::new(0x2200_0001),
offset: 0,
os_platform_id: 0x12345678,
os_major_version: 10,
os_minor_version: 5,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(&[], false, false, false));
let row_size = AssemblyOsRaw::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
original_row
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
let mut read_offset = 0;
let deserialized_row = AssemblyOsRaw::row_read(&buffer, &mut read_offset, 1, &table_info)
.expect("Deserialization should succeed");
assert_eq!(original_row.os_platform_id, deserialized_row.os_platform_id);
assert_eq!(
original_row.os_major_version,
deserialized_row.os_major_version
);
assert_eq!(
original_row.os_minor_version,
deserialized_row.os_minor_version
);
assert_eq!(offset, row_size, "Offset should match expected row size");
assert_eq!(
read_offset, row_size,
"Read offset should match expected row size"
);
}
#[test]
fn test_known_binary_format() {
let assembly_os = AssemblyOsRaw {
rid: 1,
token: Token::new(0x2200_0001),
offset: 0,
os_platform_id: 0x12345678,
os_major_version: 0xABCDEF01,
os_minor_version: 0x87654321,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(
&[], false,
false,
false,
));
let row_size = AssemblyOsRaw::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
assembly_os
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
assert_eq!(row_size, 12, "Row size should be 12 bytes");
assert_eq!(buffer[0], 0x78);
assert_eq!(buffer[1], 0x56);
assert_eq!(buffer[2], 0x34);
assert_eq!(buffer[3], 0x12);
assert_eq!(buffer[4], 0x01);
assert_eq!(buffer[5], 0xEF);
assert_eq!(buffer[6], 0xCD);
assert_eq!(buffer[7], 0xAB);
assert_eq!(buffer[8], 0x21);
assert_eq!(buffer[9], 0x43);
assert_eq!(buffer[10], 0x65);
assert_eq!(buffer[11], 0x87);
}
#[test]
fn test_zero_values() {
let assembly_os = AssemblyOsRaw {
rid: 1,
token: Token::new(0x2200_0001),
offset: 0,
os_platform_id: 0,
os_major_version: 0,
os_minor_version: 0,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(
&[], false,
false,
false,
));
let row_size = AssemblyOsRaw::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
assembly_os
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
assert_eq!(row_size, 12, "Row size should be 12 bytes");
for &byte in &buffer {
assert_eq!(byte, 0, "All bytes should be zero");
}
}
}