use crate::{
metadata::{
tables::{FieldRaw, TableDataOwned, TableId},
token::Token,
},
test::{create_test_assembly, get_testfile_mscorlib, TestAssembly},
Error, Result,
};
pub fn owned_field_validator_file_factory() -> Result<Vec<TestAssembly>> {
let mut assemblies = Vec::new();
let Some(clean_testfile) = get_testfile_mscorlib() else {
return Err(Error::Other(
"mscorlib.dll not available - test cannot run".to_string(),
));
};
assemblies.push(TestAssembly::new(&clean_testfile, true));
assemblies.push(create_assembly_with_null_character_field_name()?);
assemblies.push(create_assembly_with_literal_non_static_field()?);
assemblies.push(create_assembly_with_rtspecial_without_special()?);
assemblies.push(create_assembly_with_empty_field_name()?);
assemblies.push(create_assembly_with_non_private_backing_field()?);
Ok(assemblies)
}
pub fn create_assembly_with_null_character_field_name() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let name_index = assembly
.string_add("Field\0WithNull")
.map_err(|e| Error::Other(format!("Failed to add field name: {e}")))?;
let signature_bytes = vec![0x08]; let signature_index = assembly
.blob_add(&signature_bytes)
.map_err(|e| Error::Other(format!("Failed to add signature: {e}")))?;
let next_rid = assembly.original_table_row_count(TableId::Field) + 1;
let invalid_field = FieldRaw {
rid: next_rid,
token: Token::new(0x04000000 + next_rid),
offset: 0,
flags: 0x0002,
name: name_index.placeholder(),
signature: signature_index.placeholder(),
};
assembly
.table_row_add(TableId::Field, TableDataOwned::Field(invalid_field))
.map_err(|e| Error::Other(format!("Failed to add invalid field: {e}")))?;
Ok(())
})
}
pub fn create_assembly_with_literal_non_static_field() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let name_index = assembly
.string_add("InvalidLiteralField")
.map_err(|e| Error::Other(format!("Failed to add field name: {e}")))?;
let signature_bytes = vec![0x08]; let signature_index = assembly
.blob_add(&signature_bytes)
.map_err(|e| Error::Other(format!("Failed to add signature: {e}")))?;
let next_rid = assembly.original_table_row_count(TableId::Field) + 1;
let invalid_field = FieldRaw {
rid: next_rid,
token: Token::new(0x04000000 + next_rid),
offset: 0,
flags: 0x0040, name: name_index.placeholder(),
signature: signature_index.placeholder(),
};
assembly
.table_row_add(TableId::Field, TableDataOwned::Field(invalid_field))
.map_err(|e| Error::Other(format!("Failed to add invalid field: {e}")))?;
Ok(())
})
}
pub fn create_assembly_with_rtspecial_without_special() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let name_index = assembly
.string_add("RTSpecialField")
.map_err(|e| Error::Other(format!("Failed to add field name: {e}")))?;
let signature_bytes = vec![0x08]; let signature_index = assembly
.blob_add(&signature_bytes)
.map_err(|e| Error::Other(format!("Failed to add signature: {e}")))?;
let next_rid = assembly.original_table_row_count(TableId::Field) + 1;
let invalid_field = FieldRaw {
rid: next_rid,
token: Token::new(0x04000000 + next_rid),
offset: 0,
flags: 0x0402, name: name_index.placeholder(),
signature: signature_index.placeholder(),
};
assembly
.table_row_add(TableId::Field, TableDataOwned::Field(invalid_field))
.map_err(|e| Error::Other(format!("Failed to add invalid field: {e}")))?;
Ok(())
})
}
pub fn create_assembly_with_empty_field_name() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let name_index = assembly
.string_add("")
.map_err(|e| Error::Other(format!("Failed to add empty field name: {e}")))?;
let signature_bytes = vec![0x08]; let signature_index = assembly
.blob_add(&signature_bytes)
.map_err(|e| Error::Other(format!("Failed to add signature: {e}")))?;
let next_rid = assembly.original_table_row_count(TableId::Field) + 1;
let invalid_field = FieldRaw {
rid: next_rid,
token: Token::new(0x04000000 + next_rid),
offset: 0,
flags: 0x0002,
name: name_index.placeholder(),
signature: signature_index.placeholder(),
};
assembly
.table_row_add(TableId::Field, TableDataOwned::Field(invalid_field))
.map_err(|e| Error::Other(format!("Failed to add invalid field: {e}")))?;
Ok(())
})
}
pub fn create_assembly_with_non_private_backing_field() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let name_index = assembly
.string_add("<MyProperty>k__BackingField")
.map_err(|e| Error::Other(format!("Failed to add backing field name: {e}")))?;
let signature_bytes = vec![0x08]; let signature_index = assembly
.blob_add(&signature_bytes)
.map_err(|e| Error::Other(format!("Failed to add signature: {e}")))?;
let next_rid = assembly.original_table_row_count(TableId::Field) + 1;
let invalid_field = FieldRaw {
rid: next_rid,
token: Token::new(0x04000000 + next_rid),
offset: 0,
flags: 0x0007, name: name_index.placeholder(),
signature: signature_index.placeholder(),
};
assembly
.table_row_add(TableId::Field, TableDataOwned::Field(invalid_field))
.map_err(|e| Error::Other(format!("Failed to add invalid field: {e}")))?;
Ok(())
})
}