use crate::{
metadata::tables::{
CodedIndex, CodedIndexType, InterfaceImplBuilder, NestedClassBuilder, TableId,
TypeAttributes, TypeDefBuilder,
},
test::{create_test_assembly_with_error, get_testfile_mscorlib, TestAssembly},
Error, Result,
};
pub fn owned_dependency_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_empty_name_base_type()?);
assemblies.push(create_assembly_with_empty_name_interface()?);
assemblies.push(create_assembly_with_empty_name_nested_type()?);
Ok(assemblies)
}
pub fn create_assembly_with_empty_name_base_type() -> Result<TestAssembly> {
create_test_assembly_with_error(
get_testfile_mscorlib,
"broken base type dependency",
|assembly| {
let empty_base = TypeDefBuilder::new()
.name("") .namespace("Test.Dependency")
.flags(TypeAttributes::CLASS)
.build(assembly)?;
TypeDefBuilder::new()
.name("DerivedType")
.namespace("Test.Dependency")
.flags(TypeAttributes::CLASS | TypeAttributes::PUBLIC)
.extends(CodedIndex::new(
TableId::TypeDef,
empty_base
.token()
.expect("TypeDef token should be resolved")
.row(),
CodedIndexType::TypeDefOrRef,
))
.build(assembly)?;
Ok(())
},
)
}
pub fn create_assembly_with_empty_name_nested_type() -> Result<TestAssembly> {
create_test_assembly_with_error(
get_testfile_mscorlib,
"broken nested type dependency",
|assembly| {
let enclosing_type = TypeDefBuilder::new()
.name("EnclosingType")
.namespace("Test.Dependency")
.flags(TypeAttributes::CLASS | TypeAttributes::PUBLIC)
.build(assembly)?;
let empty_nested = TypeDefBuilder::new()
.name("") .namespace("Test.Dependency")
.flags(TypeAttributes::NESTED_PUBLIC | TypeAttributes::CLASS)
.build(assembly)?;
NestedClassBuilder::new()
.nested_class(empty_nested.placeholder())
.enclosing_class(enclosing_type.placeholder())
.build(assembly)?;
Ok(())
},
)
}
pub fn create_assembly_with_empty_name_interface() -> Result<TestAssembly> {
create_test_assembly_with_error(
get_testfile_mscorlib,
"broken interface dependency",
|assembly| {
let empty_interface = TypeDefBuilder::new()
.name("") .namespace("Test.Dependency")
.flags(TypeAttributes::INTERFACE | TypeAttributes::ABSTRACT)
.build(assembly)?;
let implementing_class = TypeDefBuilder::new()
.name("ImplementingClass")
.namespace("Test.Dependency")
.flags(TypeAttributes::CLASS | TypeAttributes::PUBLIC)
.build(assembly)?;
InterfaceImplBuilder::new()
.class(
implementing_class
.token()
.expect("TypeDef token should be resolved")
.row(),
)
.interface(CodedIndex::new(
TableId::TypeDef,
empty_interface
.token()
.expect("TypeDef token should be resolved")
.row(),
CodedIndexType::TypeDefOrRef,
))
.build(assembly)?;
Ok(())
},
)
}