(* Quick analysis: find failing test files and print their content *) let tests_dir = "validator/tests" type expected_outcome = Valid | Invalid | HasWarning | Unknown let parse_outcome filename = (* Check .html *) if String.length filename > 13 && String.sub filename (String.length filename - 13) 13 = "-isvalid.html" then Valid else if String.length filename > 13 && String.sub filename (String.length filename - 13) 13 = "-novalid.html" then Invalid else if String.length filename > 13 && String.sub filename (String.length filename - 13) 13 = "-haswarn.html" then HasWarning (* Check .xhtml *) else if String.length filename > 14 && String.sub filename (String.length filename - 14) 14 = "-isvalid.xhtml" then Valid else if String.length filename > 14 && String.sub filename (String.length filename - 14) 14 = "-novalid.xhtml" then Invalid else if String.length filename > 14 && String.sub filename (String.length filename - 14) 14 = "-haswarn.xhtml" then HasWarning else Unknown let rec find_files dir = let entries = Sys.readdir dir |> Array.to_list in List.concat_map (fun entry -> let path = Filename.concat dir entry in if Sys.is_directory path then find_files path else if parse_outcome (Filename.basename path) <> Unknown then [path] else [] ) entries let () = let mode = if Array.length Sys.argv > 1 then Sys.argv.(1) else "novalid" in let files = find_files tests_dir in let count = ref 0 in List.iter (fun path -> let outcome = parse_outcome (Filename.basename path) in let ic = open_in path in let content = really_input_string ic (in_channel_length ic) in close_in ic; let reader = Bytesrw.Bytes.Reader.of_string content in let result = Html5_checker.check ~collect_parse_errors:true reader in let errors = Html5_checker.errors result in let warnings = Html5_checker.warnings result in let should_print = match mode with | "isvalid" -> outcome = Valid && (errors <> [] || warnings <> []) && !count < 60 | _ -> outcome = Invalid && errors = [] && !count < 60 in if should_print then begin Printf.printf "\n=== %s ===\n" path; if mode = "isvalid" then begin if errors <> [] then begin Printf.printf "ERRORS:\n"; List.iter (fun e -> Printf.printf " %s\n" e.Html5_checker.Message.message) errors end; if warnings <> [] then begin Printf.printf "WARNINGS:\n"; List.iter (fun w -> Printf.printf " %s\n" w.Html5_checker.Message.message) warnings end end; print_endline content; incr count end ) files