use skyscraper::html;
#[test]
fn doctype_in_head_mode_is_ignored() {
let text = "<!DOCTYPE html><html><head><!DOCTYPE html></head><body></body></html>";
let document = html::parse(text).unwrap();
let output = document.to_string();
assert_eq!(
output.matches("<!DOCTYPE").count(),
1,
"Only one DOCTYPE should survive; got: {output:?}"
);
assert!(
output.contains("<head></head>"),
"Should contain <head></head>: {output:?}"
);
assert!(
output.contains("<body></body>"),
"Should contain <body></body>: {output:?}"
);
}
#[test]
fn html_start_tag_in_head_merges_attributes() {
let text = r#"<html><head><html lang="en"></head><body></body></html>"#;
let document = html::parse(text).unwrap();
let output = document.to_string();
assert_eq!(
output.matches("<html").count(),
1,
"Only one <html> should exist; got: {output:?}"
);
assert!(
output.contains(r#"lang="en""#),
"Should contain lang attribute: {output:?}"
);
}
#[test]
fn duplicate_html_start_tag_in_head_no_new_attrs() {
let text = "<html><head><html></head><body></body></html>";
let document = html::parse(text).unwrap();
let output = document.to_string();
assert_eq!(
output.matches("<html").count(),
1,
"Only one <html> should exist; got: {output:?}"
);
assert!(
output.contains("<head></head>"),
"Should contain <head>: {output:?}"
);
}
#[test]
fn duplicate_head_start_tag_in_head_is_ignored() {
let text = "<html><head><head></head><body></body></html>";
let document = html::parse(text).unwrap();
let output = document.to_string();
assert_eq!(
output.matches("<head").count(),
1,
"Only one <head> should exist; got: {output:?}"
);
assert!(
output.contains("<body></body>"),
"Should contain <body></body>: {output:?}"
);
}
#[test]
fn duplicate_head_with_attributes_is_ignored() {
let text = r#"<html><head><head class="extra"></head><body></body></html>"#;
let document = html::parse(text).unwrap();
let output = document.to_string();
assert_eq!(
output.matches("<head").count(),
1,
"Only one <head> should exist; got: {output:?}"
);
assert!(
!output.contains("extra"),
"Duplicate <head> attributes should not appear: {output:?}"
);
}
#[test]
fn template_in_head_is_inserted() {
let text = "<html><head><template><p>hello</p></template></head><body></body></html>";
let document = html::parse(text).unwrap();
let output = document.to_string();
assert!(
output.contains("<template>"),
"Should contain <template>: {output:?}"
);
assert!(
output.contains("</template>"),
"Should contain </template>: {output:?}"
);
assert!(
output.contains("<head><template>"),
"Template should be a child of <head>: {output:?}"
);
}
#[test]
fn empty_template_in_head() {
let text = "<html><head><template></template></head><body></body></html>";
let document = html::parse(text).unwrap();
let output = document.to_string();
assert!(
output.contains("<template></template>"),
"Should contain empty template: {output:?}"
);
}
#[test]
fn template_in_head_preserves_attributes() {
let text = r#"<html><head><template id="tmpl"><div>content</div></template></head><body></body></html>"#;
let document = html::parse(text).unwrap();
let output = document.to_string();
assert!(
output.contains(r#"id="tmpl""#),
"Template should preserve id attribute: {output:?}"
);
}
#[test]
fn multiple_templates_in_head() {
let text = "<html><head><template>A</template><template>B</template></head><body></body></html>";
let document = html::parse(text).unwrap();
let output = document.to_string();
assert_eq!(
output.matches("<template>").count(),
2,
"Should have two templates: {output:?}"
);
}