extern crate alloc;
use alloc::string::String;
use alloc::vec::Vec;
pub const COMMON_XSD: &str = include_str!("../schemas/dds-xml_common.xsd");
pub const QOS_NONAMESPACE_XSD: &str =
include_str!("../schemas/dds-xml_qos_definitions_nonamespace.xsd");
pub const QOS_NAMESPACED_XSD: &str = include_str!("../schemas/dds-xml_qos_definitions.xsd");
pub const TYPES_NONAMESPACE_XSD: &str =
include_str!("../schemas/dds-xml_types_definitions_nonamespace.xsd");
pub const TYPES_NAMESPACED_XSD: &str = include_str!("../schemas/dds-xml_types_definitions.xsd");
pub const DOMAINS_NONAMESPACE_XSD: &str =
include_str!("../schemas/dds-xml_domains_definitions_nonamespace.xsd");
pub const DOMAINS_NAMESPACED_XSD: &str = include_str!("../schemas/dds-xml_domains_definitions.xsd");
pub const DOMAIN_PARTICIPANTS_NONAMESPACE_XSD: &str =
include_str!("../schemas/dds-xml_domain_participants_definitions_nonamespace.xsd");
pub const DOMAIN_PARTICIPANTS_NAMESPACED_XSD: &str =
include_str!("../schemas/dds-xml_domain_participants_definitions.xsd");
pub const APPLICATIONS_NONAMESPACE_XSD: &str =
include_str!("../schemas/dds-xml_applications_definitions_nonamespace.xsd");
pub const APPLICATIONS_NAMESPACED_XSD: &str =
include_str!("../schemas/dds-xml_applications_definitions.xsd");
pub const DATA_SAMPLES_NONAMESPACE_XSD: &str =
include_str!("../schemas/dds-xml_data_samples_definitions_nonamespace.xsd");
pub const DATA_SAMPLES_NAMESPACED_XSD: &str =
include_str!("../schemas/dds-xml_data_samples_definitions.xsd");
pub const DDS_SYSTEM_NONAMESPACE_XSD: &str =
include_str!("../schemas/dds-xml_dds_system_definitions_nonamespace.xsd");
pub const DDS_SYSTEM_NAMESPACED_XSD: &str =
include_str!("../schemas/dds-xml_dds_system_definitions.xsd");
pub const ALL_SCHEMAS: &[(&str, &str, &str, &str)] = &[
(
"QoS",
QOS_NONAMESPACE_XSD,
QOS_NAMESPACED_XSD,
"qos_library",
),
(
"Types",
TYPES_NONAMESPACE_XSD,
TYPES_NAMESPACED_XSD,
"types",
),
(
"Domains",
DOMAINS_NONAMESPACE_XSD,
DOMAINS_NAMESPACED_XSD,
"domain_library",
),
(
"DomainParticipants",
DOMAIN_PARTICIPANTS_NONAMESPACE_XSD,
DOMAIN_PARTICIPANTS_NAMESPACED_XSD,
"domain_participant_library",
),
(
"Applications",
APPLICATIONS_NONAMESPACE_XSD,
APPLICATIONS_NAMESPACED_XSD,
"application_library",
),
(
"DataSamples",
DATA_SAMPLES_NONAMESPACE_XSD,
DATA_SAMPLES_NAMESPACED_XSD,
"data",
),
(
"DDSSystem",
DDS_SYSTEM_NONAMESPACE_XSD,
DDS_SYSTEM_NAMESPACED_XSD,
"dds",
),
];
#[must_use]
pub fn embedded_block_names() -> Vec<String> {
ALL_SCHEMAS
.iter()
.map(|(name, _, _, _)| String::from(*name))
.collect()
}
#[cfg(test)]
#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
mod tests {
use super::*;
#[test]
fn common_xsd_starts_with_xml_declaration() {
assert!(COMMON_XSD.starts_with("<?xml"));
assert!(COMMON_XSD.contains("xs:schema"));
}
#[test]
fn nonamespace_xsds_omit_target_namespace() {
for (name, nons, _ns, _root) in ALL_SCHEMAS {
let doc = roxmltree::Document::parse(nons)
.unwrap_or_else(|e| panic!("Block `{name}` chameleon-XSD parse: {e}"));
assert!(
doc.root_element().attribute("targetNamespace").is_none(),
"Block `{name}` chameleon-XSD <xs:schema> hat targetNamespace-Attribut"
);
}
}
#[test]
fn namespaced_xsds_include_target_namespace() {
for (name, _nons, ns, _root) in ALL_SCHEMAS {
let doc = roxmltree::Document::parse(ns)
.unwrap_or_else(|e| panic!("Block `{name}` namespaced-XSD parse: {e}"));
assert_eq!(
doc.root_element().attribute("targetNamespace"),
Some("http://www.omg.org/spec/DDS-XML"),
"Block `{name}` namespaced-XSD <xs:schema> ohne korrekten targetNamespace"
);
}
}
#[test]
fn namespaced_xsds_define_top_level_element() {
for (name, _nons, ns, root) in ALL_SCHEMAS {
let needle = alloc::format!("name=\"{root}\"");
assert!(
ns.contains(&needle),
"Block `{name}` namespaced-XSD definiert kein xs:element {root}"
);
}
}
#[test]
fn all_schemas_includes_six_building_blocks_plus_system() {
assert_eq!(ALL_SCHEMAS.len(), 7);
let names = embedded_block_names();
for required in [
"QoS",
"Types",
"Domains",
"DomainParticipants",
"Applications",
"DataSamples",
"DDSSystem",
] {
assert!(names.iter().any(|n| n == required), "fehlt: {required}");
}
}
#[test]
fn nonamespace_xsds_can_be_loaded_by_xsd_loader() {
for (name, nons, _ns, _root) in ALL_SCHEMAS {
let _ = roxmltree::Document::parse(nons)
.unwrap_or_else(|e| panic!("Block `{name}` chameleon-XSD parsefehler: {e}"));
}
}
#[test]
fn namespaced_xsds_can_be_loaded_by_xsd_loader() {
for (name, _nons, ns, _root) in ALL_SCHEMAS {
let _ = roxmltree::Document::parse(ns)
.unwrap_or_else(|e| panic!("Block `{name}` namespaced-XSD parsefehler: {e}"));
}
}
}