(** Unit tests for package data reading *) let test_dir = ref "" let setup () = let dir = Filename.temp_dir "test-pkg-data-" "" in test_dir := dir; dir let teardown () = if !test_dir <> "" then begin ignore (Sys.command (Printf.sprintf "rm -rf %s" !test_dir)); test_dir := "" end let mkdir_p path = let rec create dir = if not (Sys.file_exists dir) then begin create (Filename.dirname dir); try Unix.mkdir dir 0o755 with Unix.Unix_error (Unix.EEXIST, _, _) -> () end in create path (** Test: list_packages returns packages from html/p directory *) let test_list_packages () = let base_dir = setup () in let html_dir = Filename.concat base_dir "html" in mkdir_p (Filename.concat html_dir "p/base/0.16.0"); mkdir_p (Filename.concat html_dir "p/base/0.15.0"); mkdir_p (Filename.concat html_dir "p/core/0.16.0"); let packages = Day10_web_data.Package_data.list_packages ~html_dir in assert (List.length packages = 3); assert (List.mem ("base", "0.16.0") packages); assert (List.mem ("base", "0.15.0") packages); assert (List.mem ("core", "0.16.0") packages); teardown (); Printf.printf "PASS: test_list_packages\n%!" (** Test: list_package_versions returns versions for a package *) let test_list_package_versions () = let base_dir = setup () in let html_dir = Filename.concat base_dir "html" in mkdir_p (Filename.concat html_dir "p/base/0.16.0"); mkdir_p (Filename.concat html_dir "p/base/0.15.0"); mkdir_p (Filename.concat html_dir "p/base/0.14.0"); let versions = Day10_web_data.Package_data.list_package_versions ~html_dir ~name:"base" in assert (List.length versions = 3); (* Should be sorted descending *) assert (List.hd versions = "0.16.0"); teardown (); Printf.printf "PASS: test_list_package_versions\n%!" (** Test: package_has_docs checks if docs exist *) let test_package_has_docs () = let base_dir = setup () in let html_dir = Filename.concat base_dir "html" in mkdir_p (Filename.concat html_dir "p/base/0.16.0"); assert (Day10_web_data.Package_data.package_has_docs ~html_dir ~name:"base" ~version:"0.16.0"); assert (not (Day10_web_data.Package_data.package_has_docs ~html_dir ~name:"base" ~version:"0.15.0")); teardown (); Printf.printf "PASS: test_package_has_docs\n%!" (** Test: list_package_names returns unique package names *) let test_list_package_names () = let base_dir = setup () in let html_dir = Filename.concat base_dir "html" in mkdir_p (Filename.concat html_dir "p/base/0.16.0"); mkdir_p (Filename.concat html_dir "p/base/0.15.0"); mkdir_p (Filename.concat html_dir "p/core/0.16.0"); mkdir_p (Filename.concat html_dir "p/async/0.16.0"); let names = Day10_web_data.Package_data.list_package_names ~html_dir in assert (List.length names = 3); assert (List.mem "base" names); assert (List.mem "core" names); assert (List.mem "async" names); teardown (); Printf.printf "PASS: test_list_package_names\n%!" let () = Printf.printf "Running Package_data tests...\n%!"; test_list_packages (); test_list_package_versions (); test_package_has_docs (); test_list_package_names (); Printf.printf "\nAll Package_data tests passed!\n%!"