#![allow(clippy::panic, clippy::unwrap_used, clippy::expect_used)]
use zerodds_types::dynamic::TypeKind;
use zerodds_xml_compose::{create_type_w_document, create_type_w_uri};
const DOCUMENT: &str = "<dds><types><module name=\"T\">\
<struct name=\"S\"><member name=\"a\" type=\"int32\" key=\"true\"/>\
<member name=\"b\" type=\"string\" stringMaxLength=\"8\"/></struct>\
</module></types></dds>";
fn temp_dir(tag: &str) -> std::path::PathBuf {
let dir = std::env::temp_dir().join(format!("xc_{tag}_{}", std::process::id()));
std::fs::create_dir_all(&dir).unwrap();
dir
}
#[test]
fn a_type_is_created_from_a_document() {
let ty = create_type_w_document(DOCUMENT, "T::S", &[]).unwrap();
assert_eq!(ty.kind(), TypeKind::Structure);
assert_eq!(ty.qualified_name(), "T::S");
assert_eq!(ty.member_count(), 2);
assert!(ty.member_by_name("a").unwrap().descriptor().unwrap().is_key);
assert_eq!(
ty.member_by_name("b")
.unwrap()
.dynamic_type()
.unwrap()
.descriptor()
.unwrap()
.bound,
[8]
);
}
#[test]
fn a_missing_type_and_a_bad_document_fail() {
assert!(create_type_w_document(DOCUMENT, "T::Nope", &[]).is_err());
assert!(create_type_w_document(DOCUMENT, "", &[]).is_err());
assert!(
create_type_w_document("<dds><types><widget name=\"x\"/></types></dds>", "x", &[]).is_err()
);
}
#[test]
fn the_include_paths_are_searched() {
let dir = temp_dir("includes");
std::fs::write(
dir.join("base.xml"),
"<dds><types><module name=\"B\">\
<struct name=\"Base\"><member name=\"x\" type=\"int32\"/></struct>\
</module></types></dds>",
)
.unwrap();
let document = "<dds><types><include file=\"base.xml\"/><module name=\"D\">\
<struct name=\"Derived\" baseType=\"B::Base\"><member name=\"y\" type=\"int32\"/></struct>\
</module></types></dds>";
assert!(create_type_w_document(document, "D::Derived", &[]).is_err());
let ty = create_type_w_document(document, "D::Derived", &[dir.to_str().unwrap()]).unwrap();
assert_eq!(ty.base_type().unwrap().qualified_name(), "B::Base");
std::fs::remove_dir_all(&dir).unwrap();
}
#[test]
fn a_type_is_created_from_a_file_url() {
let dir = temp_dir("uri");
std::fs::write(dir.join("types.xml"), DOCUMENT).unwrap();
let url = format!("file://{}", dir.join("types.xml").to_str().unwrap());
let ty = create_type_w_uri(&url, "T::S", &[]).unwrap();
assert_eq!(ty.qualified_name(), "T::S");
std::fs::write(
dir.join("main.xml"),
"<dds><types><include file=\"types.xml\"/><module name=\"M\">\
<struct name=\"U\" baseType=\"T::S\"><member name=\"c\" type=\"int32\"/></struct>\
</module></types></dds>",
)
.unwrap();
let url = format!("file://{}", dir.join("main.xml").to_str().unwrap());
let ty = create_type_w_uri(&url, "M::U", &[]).unwrap();
assert_eq!(ty.base_type().unwrap().qualified_name(), "T::S");
assert!(create_type_w_uri("http://example.org/types.xml", "T::S", &[]).is_err());
assert!(create_type_w_uri("file:///nonexistent/types.xml", "T::S", &[]).is_err());
std::fs::remove_dir_all(&dir).unwrap();
}