use std::fs;
use tagparser::{parse_tags, parse_tags_with_attr, extract_tag_content, extract_attribute_values};
fn load_test_html() -> String {
fs::read_to_string("tests/test_data/rust_page.html")
.expect("Failed to read test HTML file")
}
#[test]
fn test_parse_heading_tags() {
let html = load_test_html();
let h1_tags = parse_tags(html.clone(), "h1".to_string());
assert_eq!(h1_tags.len(), 1);
assert!(h1_tags[0].contains("Rust Programming Language"));
let h2_tags = parse_tags(html.clone(), "h2".to_string());
assert_eq!(h2_tags.len(), 5);
assert!(h2_tags.iter().any(|tag| tag.contains("About Rust")));
assert!(h2_tags.iter().any(|tag| tag.contains("Rust Features")));
assert!(h2_tags.iter().any(|tag| tag.contains("Code Examples")));
assert!(h2_tags.iter().any(|tag| tag.contains("Learning Resources")));
assert!(h2_tags.iter().any(|tag| tag.contains("Subscribe to Updates")));
}
#[test]
fn test_parse_link_tags() {
let html = load_test_html();
let a_tags = parse_tags(html.clone(), "a".to_string());
assert!(a_tags.len() > 10);
let links_with_class = parse_tags_with_attr(html.clone(), "a".to_string(), "class", None);
assert!(links_with_class.len() > 5);
let nav_links = parse_tags_with_attr(html.clone(), "a".to_string(), "class", Some("nav-link"));
assert!(nav_links.iter().any(|link| link.contains("About Rust")));
assert!(nav_links.iter().any(|link| link.contains("Features")));
let external_links = parse_tags_with_attr(html.clone(), "a".to_string(), "target", Some("_blank"));
assert!(external_links.iter().any(|link| link.contains("Official Website")));
assert!(external_links.iter().any(|link| link.contains("Twitter")));
assert!(external_links.iter().any(|link| link.contains("GitHub")));
}
#[test]
fn test_extract_tag_content() {
let html = load_test_html();
let h1_content = extract_tag_content(html.clone(), "h1".to_string());
assert_eq!(h1_content.len(), 1);
assert_eq!(h1_content[0], "Rust Programming Language");
let h2_content = extract_tag_content(html.clone(), "h2".to_string());
assert!(h2_content.len() >= 5);
assert!(h2_content.iter().any(|content| content == "About Rust"));
assert!(h2_content.iter().any(|content| content == "Rust Features"));
assert!(h2_content.iter().any(|content| content == "Code Examples"));
let p_content = extract_tag_content(html.clone(), "p".to_string());
assert!(!p_content.is_empty());
assert!(p_content.iter().any(|content| content.contains("systems programming language")));
}
#[test]
fn test_extract_attribute_values() {
let html = load_test_html();
let hrefs = extract_attribute_values(html.clone(), "a".to_string(), "href");
assert!(hrefs.len() > 5);
assert!(hrefs.iter().any(|href| href == "https://www.rust-lang.org"));
assert!(hrefs.iter().any(|href| href == "https://doc.rust-lang.org/book/"));
assert!(hrefs.iter().any(|href| href == "https://github.com/rust-lang/rustlings"));
let classes = extract_attribute_values(html.clone(), "a".to_string(), "class");
assert!(classes.contains(&"nav-link".to_string()));
let h1_ids = extract_attribute_values(html.clone(), "h1".to_string(), "id");
assert!(h1_ids.contains(&"main-title".to_string()));
let section_ids = extract_attribute_values(html.clone(), "section".to_string(), "id");
assert!(section_ids.contains(&"about".to_string()));
assert!(section_ids.contains(&"features".to_string()));
assert!(section_ids.contains(&"examples".to_string()));
}
#[test]
fn test_form_elements() {
let html = load_test_html();
let input_types = extract_attribute_values(html.clone(), "input".to_string(), "type");
println!("input_types: {:?}", input_types);
let option_values = extract_attribute_values(html.clone(), "option".to_string(), "value");
println!("option_values: {:?}", option_values);
assert_eq!(option_values.len(), 3);
assert!(option_values.contains(&"beginner".to_string()));
assert!(option_values.contains(&"intermediate".to_string()));
assert!(option_values.contains(&"advanced".to_string()));
}
#[test]
fn test_self_closing_tags() {
let html = load_test_html();
let meta_names = extract_attribute_values(html.clone(), "meta".to_string(), "name");
println!("meta_names: {:?}", meta_names);
let input_types = extract_attribute_values(html.clone(), "input".to_string(), "type");
println!("input_types: {:?}", input_types);
}