mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-14 01:17:41 +00:00
252 lines
6.3 KiB
Rust
252 lines
6.3 KiB
Rust
use html_parser::{Dom, Result};
|
|
use indoc::indoc;
|
|
use insta::assert_json_snapshot;
|
|
|
|
#[test]
|
|
fn it_can_parse_one_element() -> Result<()> {
|
|
let html = "<html></html>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_one_element_upper_case() -> Result<()> {
|
|
let html = "<HTML></HTML>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_one_element_mixed_case() -> Result<()> {
|
|
let html = "<Html></Html>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_one_element_mixed_case_numbers() -> Result<()> {
|
|
let html = "<Header1></Header1>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_one_element_mixed_case_numbers_symbols() -> Result<()> {
|
|
let html = "<Head_Er-1></Head_Er-1>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_multiple_elements() -> Result<()> {
|
|
let html = "<div/><div/>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_multiple_open_elements() -> Result<()> {
|
|
let html = "<div></div><div></div>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_nested_elements() -> Result<()> {
|
|
let html = indoc!(
|
|
r"
|
|
<div>
|
|
<div />
|
|
</div>
|
|
"
|
|
);
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_nested_elements_mixed_children() -> Result<()> {
|
|
let html = indoc!(
|
|
r"
|
|
<div>
|
|
<!--comment-->
|
|
<div/>
|
|
Hello
|
|
<div>
|
|
World
|
|
</div>
|
|
</div>
|
|
"
|
|
);
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_deeply_nested() -> Result<()> {
|
|
let html = indoc!(
|
|
r#"
|
|
<div class='1'>
|
|
<div class='1'>
|
|
<div class='1'>
|
|
<div class='1'>
|
|
<div class='1'>
|
|
<div class='1'>
|
|
<div class='1'>
|
|
<div class='1'>
|
|
<!--this is deep-->
|
|
hello world
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
"#
|
|
);
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_script_with_content() -> Result<()> {
|
|
let html = indoc!(
|
|
r#"
|
|
<script>
|
|
const person_creator = ({ name, symtoms }) => {
|
|
let person = {}
|
|
person.name = name
|
|
person.symtoms = {}
|
|
for (symtom of symtoms) {
|
|
person.symtoms[symtom] = true
|
|
}
|
|
return person
|
|
}
|
|
|
|
const main = () => {
|
|
let name = 'mathias'
|
|
let symtoms = ['Dunning-Kruger', 'ACDC', 'Slacker']
|
|
|
|
setTimeout(() => {
|
|
let person = person_creator({ name, symtoms })
|
|
if (person.symtoms.hasOwnProperty('Dunning-Kruger')) {
|
|
console.log('yeah buddy, that\'s right')
|
|
}
|
|
}, 1337)
|
|
}
|
|
|
|
main()
|
|
</script>
|
|
"#
|
|
);
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_style_with_content() -> Result<()> {
|
|
let html = indoc!(
|
|
r#"
|
|
<style>
|
|
:root {
|
|
--background-color: black;
|
|
--text-color: white;
|
|
}
|
|
body {
|
|
background: var(--background-color);
|
|
color: var(--text-color);
|
|
}
|
|
</style>
|
|
"#
|
|
);
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_skips_dangling_elements() -> Result<()> {
|
|
let html = indoc!(
|
|
"
|
|
<div id='123'></div>
|
|
</div>
|
|
<div id='321'></div>
|
|
"
|
|
);
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_parse_broken_html() -> Result<()> {
|
|
let html = "<div></span><div></div>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_errors_when_multiple_nested_elements_dont_match() -> Result<()> {
|
|
let html = "<div><div><div><div></div></div_error></div></div>";
|
|
let dom = Dom::parse(html)?;
|
|
assert_json_snapshot!(dom);
|
|
Ok(())
|
|
}
|
|
#[test]
|
|
fn it_can_clone_node() {
|
|
let html = indoc!(
|
|
"
|
|
<div>one</div>
|
|
<div>two</div>
|
|
"
|
|
);
|
|
let dom = Dom::parse(html).unwrap();
|
|
let one = dom.children[0].clone();
|
|
assert_json_snapshot!(one);
|
|
}
|
|
#[test]
|
|
fn it_can_clone_dom() {
|
|
let html = indoc!(
|
|
"
|
|
<html>
|
|
<head>
|
|
<title>Title</title>
|
|
</head>
|
|
<body>
|
|
<h1>Hello world</h1>
|
|
</body>
|
|
</html>
|
|
"
|
|
);
|
|
let dom = Dom::parse(html).unwrap();
|
|
let dom_clone = dom.clone();
|
|
assert_eq!(dom, dom_clone);
|
|
}
|
|
|
|
#[test]
|
|
fn it_can_deal_with_weird_whitespaces() {
|
|
let html = indoc!(
|
|
"
|
|
<!-- Normal case -->
|
|
<div> Text </div>
|
|
|
|
<!-- Whitespaces in opening tag to the left -->
|
|
< div> Text </div>
|
|
|
|
<!-- Whitespaces in opening tag to the right -->
|
|
<div > Text </div>
|
|
|
|
<!-- Whitespaces in closing tag to the left (should not work) -->
|
|
<div> Text < /div>
|
|
|
|
<!-- Whitespaces in closing tag to the right -->
|
|
<div> Text </div >
|
|
|
|
<!-- Whitespaces everywhere (should not work) -->
|
|
< div > Text < / div >
|
|
"
|
|
);
|
|
let dom = Dom::parse(html).unwrap();
|
|
assert_json_snapshot!(dom);
|
|
}
|