use std::path::{Path, PathBuf}; #[test] fn canonical_examples_do_not_author_browser_javascript() { // req: examples/005 let root = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap(); let examples = root.join("examples"); let mut failures = Vec::new(); scan_examples(&examples, &mut |path, text| { if path.components().any(|part| part.as_os_str() == "tests") { return; } for (line_no, line) in text.lines().enumerate() { let trimmed = line.trim(); if trimmed.contains(" bool { matches!( path.extension().and_then(|ext| ext.to_str()), Some("rs" | "heml" | "html") ) } fn allowed_example_script(path: &Path, line: &str) -> bool { // req: examples/005 line.contains(r#""#) || (path.ends_with("examples/techdemo/templates/app_shell.heml") && line.contains(r#""#)) } fn contains_inline_event_handler(line: &str) -> bool { let bytes = line.as_bytes(); let mut i = 0; while i + 3 < bytes.len() { let boundary = bytes[i].is_ascii_whitespace() || bytes[i] == b'<'; if boundary && bytes[i + 1] == b'o' && bytes[i + 2] == b'n' && bytes[i + 3].is_ascii_lowercase() { let mut j = i + 4; while j < bytes.len() && bytes[j].is_ascii_lowercase() { j += 1; } while j < bytes.len() && bytes[j].is_ascii_whitespace() { j += 1; } if j < bytes.len() && bytes[j] == b'=' { return true; } } i += 1; } false }