use skyscraper::{
html,
xpath::{
self,
grammar::data_model::{AnyAtomicType, XpathItem},
},
};
#[test]
fn map_constructor_basic_lookup() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath =
xpath::parse(r#"let $m := map { "x": 1, "y": 2 } return $m("x")"#).unwrap();
let items = xpath.apply(&document).unwrap();
assert_eq!(items.len(), 1, "should return 1 item: {items:?}");
assert_eq!(
items[0],
XpathItem::AnyAtomicType(AnyAtomicType::Integer(1))
);
}
#[test]
fn map_constructor_lookup_second_key() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath =
xpath::parse(r#"let $m := map { "x": 1, "y": 2 } return $m("y")"#).unwrap();
let items = xpath.apply(&document).unwrap();
assert_eq!(items.len(), 1, "should return 1 item: {items:?}");
assert_eq!(
items[0],
XpathItem::AnyAtomicType(AnyAtomicType::Integer(2))
);
}
#[test]
fn map_constructor_missing_key() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath =
xpath::parse(r#"let $m := map { "x": 1 } return $m("z")"#).unwrap();
let items = xpath.apply(&document).unwrap();
assert_eq!(items.len(), 0, "missing key should return empty: {items:?}");
}
#[test]
fn map_constructor_empty() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath =
xpath::parse(r#"let $m := map {} return $m("x")"#).unwrap();
let items = xpath.apply(&document).unwrap();
assert_eq!(items.len(), 0, "empty map lookup should return empty: {items:?}");
}
#[test]
fn map_constructor_integer_keys() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath =
xpath::parse(r#"let $m := map { 1: "one", 2: "two" } return $m(1)"#).unwrap();
let items = xpath.apply(&document).unwrap();
assert_eq!(items.len(), 1, "should return 1 item: {items:?}");
assert_eq!(
items[0],
XpathItem::AnyAtomicType(AnyAtomicType::String("one".to_string()))
);
}
#[test]
fn map_constructor_string_values() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath = xpath::parse(
r#"let $m := map { "greeting": "hello world" } return $m("greeting")"#,
)
.unwrap();
let items = xpath.apply(&document).unwrap();
assert_eq!(items.len(), 1, "should return 1 item: {items:?}");
assert_eq!(
items[0],
XpathItem::AnyAtomicType(AnyAtomicType::String("hello world".to_string()))
);
}
#[test]
fn map_constructor_duplicate_key_errors() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath =
xpath::parse(r#"let $m := map { "x": 1, "x": 2 } return $m("x")"#).unwrap();
let result = xpath.apply(&document);
assert!(result.is_err(), "duplicate key should produce an error: {result:?}");
}
#[test]
fn map_constructor_as_variable() {
let text = r#"<html><body></body></html>"#;
let document = html::parse(text).unwrap();
let xpath = xpath::parse(r#"let $m := map { "a": 1 } return $m("a")"#).unwrap();
let items = xpath.apply(&document).unwrap();
assert_eq!(items.len(), 1);
assert_eq!(
items[0],
XpathItem::AnyAtomicType(AnyAtomicType::Integer(1))
);
}