use arrow_schema::DataType::{Binary, Int64, Utf8};
use xml_arrow::{NamespaceBinding, XmlBatchBuilder, XmlField, XmlSchema};
#[test]
fn rejects_invalid_schema() {
for field in [
XmlField::new("value", "/value", Utf8, true),
XmlField::new("value", "value", Binary, true),
XmlField::new("", "value", Utf8, true),
] {
assert!(XmlSchema::new(vec![field]).is_err());
}
assert!(XmlSchema::new(vec![
XmlField::new("id", "@id", Int64, false),
XmlField::new("id", "other", Utf8, true),
])
.is_err());
}
#[test]
fn rejects_invalid_batch_size_and_projection() {
let schema = XmlSchema::new(vec![XmlField::new("value", ".", Utf8, true)]).unwrap();
assert!(XmlBatchBuilder::new(schema.clone(), 0).is_err());
assert!(XmlBatchBuilder::new_projected(schema.clone(), 1, &[1]).is_err());
assert!(XmlBatchBuilder::new_projected(schema, 1, &[0, 0]).is_err());
}
#[test]
fn rejects_invalid_nested_mappings_and_namespace_bindings() {
for field in [
XmlField::list(
"values",
"@values",
true,
XmlField::new("item", "v", Utf8, false),
),
XmlField::structure(
"record",
".",
false,
vec![
XmlField::new("id", "@id", Int64, false),
XmlField::new("id", "id", Int64, true),
],
),
XmlField::new("value", "unknown:value", Utf8, true),
XmlField::new(
"values",
".",
arrow_schema::DataType::List(std::sync::Arc::new(arrow_schema::Field::new(
"item", Utf8, true,
))),
true,
),
] {
assert!(XmlSchema::new(vec![field]).is_err());
}
for bindings in [
vec![
NamespaceBinding {
prefix: "p",
uri: "urn:a",
},
NamespaceBinding {
prefix: "p",
uri: "urn:b",
},
],
vec![NamespaceBinding {
prefix: "xml",
uri: "urn:wrong",
}],
vec![NamespaceBinding {
prefix: "p",
uri: "",
}],
] {
assert!(XmlSchema::with_namespaces(vec![], &bindings).is_err());
}
}
#[test]
fn reader_options_validate_paths_limits_and_projection_without_input() {
use xml_arrow::ReaderOptions;
let schema = XmlSchema::new(vec![XmlField::new(
"id",
"@id",
arrow_schema::DataType::Int64,
false,
)])
.unwrap();
assert!(ReaderOptions::default()
.validate(&schema, "/root/row")
.is_ok());
assert!(ReaderOptions::default()
.validate(&schema, "root/row")
.is_err());
for options in [
ReaderOptions {
projection: Some(vec![0, 0]),
..Default::default()
},
ReaderOptions {
projection: Some(vec![1]),
..Default::default()
},
ReaderOptions {
max_record_bytes: 0,
..Default::default()
},
] {
assert!(options.validate(&schema, "/root/row").is_err());
}
}