use crate::{
metadata::tables::{
propertyptr::PropertyPtrRaw,
types::{RowWritable, TableId, TableInfoRef},
},
utils::write_le_at_dyn,
Result,
};
impl RowWritable for PropertyPtrRaw {
fn row_write(
&self,
data: &mut [u8],
offset: &mut usize,
_rid: u32,
sizes: &TableInfoRef,
) -> Result<()> {
write_le_at_dyn(
data,
offset,
self.property,
sizes.is_large(TableId::Property),
)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
metadata::tables::types::{RowReadable, TableInfo, TableRow},
metadata::token::Token,
};
#[test]
fn test_round_trip_serialization_short() {
let original_row = PropertyPtrRaw {
rid: 1,
token: Token::new(0x1600_0001),
offset: 0,
property: 42,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(
&[(TableId::Property, 1)],
false,
false,
false,
));
let row_size = <PropertyPtrRaw as TableRow>::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 = PropertyPtrRaw::row_read(&buffer, &mut read_offset, 1, &table_info)
.expect("Deserialization should succeed");
assert_eq!(original_row.property, deserialized_row.property);
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_round_trip_serialization_long() {
let original_row = PropertyPtrRaw {
rid: 2,
token: Token::new(0x1600_0002),
offset: 0,
property: 0x1ABCD,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(
&[(TableId::Property, u16::MAX as u32 + 3)],
false,
false,
false,
));
let row_size = <PropertyPtrRaw as TableRow>::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, 2, &table_info)
.expect("Serialization should succeed");
let mut read_offset = 0;
let deserialized_row = PropertyPtrRaw::row_read(&buffer, &mut read_offset, 2, &table_info)
.expect("Deserialization should succeed");
assert_eq!(original_row.property, deserialized_row.property);
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_short() {
let property_ptr = PropertyPtrRaw {
rid: 1,
token: Token::new(0x1600_0001),
offset: 0,
property: 42,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(
&[(TableId::Property, 1)], false,
false,
false,
));
let row_size = <PropertyPtrRaw as TableRow>::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
property_ptr
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
assert_eq!(row_size, 2, "Row size should be 2 bytes for small indices");
assert_eq!(
buffer[0], 42,
"First byte should be property index (low byte)"
);
assert_eq!(
buffer[1], 0,
"Second byte should be property index (high byte)"
);
}
#[test]
fn test_known_binary_format_long() {
let property_ptr = PropertyPtrRaw {
rid: 1,
token: Token::new(0x1600_0001),
offset: 0,
property: 0x1ABCD,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(
&[(TableId::Property, u16::MAX as u32 + 3)], false,
false,
false,
));
let row_size = <PropertyPtrRaw as TableRow>::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
property_ptr
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
assert_eq!(row_size, 4, "Row size should be 4 bytes for large indices");
assert_eq!(
buffer[0], 0xCD,
"First byte should be property index (byte 0)"
);
assert_eq!(
buffer[1], 0xAB,
"Second byte should be property index (byte 1)"
);
assert_eq!(
buffer[2], 0x01,
"Third byte should be property index (byte 2)"
);
assert_eq!(
buffer[3], 0x00,
"Fourth byte should be property index (byte 3)"
);
}
}