use pest_derive::Parser;
#[derive(Parser)]
#[grammar = "ns/defaults/parse/preamble.pest"]
#[allow(clippy::all)]
pub struct HtmlPreamble;
#[cfg(test)]
mod tests {
use super::*;
use pest::Parser;
#[test]
fn parse_simple_html() {
let html = r#"<!DOCTYPE html>
<html lang="en">
<body>Hello</body>
</html>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_with_pi() {
let html = r#"<?xml version="1.0"?>
<!DOCTYPE html>
<html>
<body>Hello</body>
</html>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_with_comment() {
let html = r#"<!-- This is a comment with <html> inside -->
<!DOCTYPE html>
<html>
<body>Hello</body>
</html>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_case_insensitive() {
let html = r#"<!DOCTYPE html>
<HTML lang="en">
<body>Hello</body>
</HTML>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_self_closing() {
let html = r#"<!DOCTYPE html>
<html lang="en"/>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_with_xmlns() {
let html = r#"<!DOCTYPE html>
<html xmlns:custom="http://example.com/ns" lang="en">
<body>Hello</body>
</html>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_boolean_attribute() {
let html = r#"<!DOCTYPE html>
<html lang="en" data-custom>
<body>Hello</body>
</html>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_empty_attribute_value() {
let html = r#"<!DOCTYPE html>
<html class=>
<body>Hello</body>
</html>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
#[test]
fn parse_unquoted_attribute() {
let html = r#"<!DOCTYPE html>
<html lang=en>
<body>Hello</body>
</html>"#;
let result = HtmlPreamble::parse(Rule::document, html);
assert!(result.is_ok());
}
}