use std::path::PathBuf; use kurbo::BezPath; use libtest_mimic::{Arguments, Failed, Trial}; use linesweeper::topology::Topology; use linesweeper_util::outline_to_bezpath; use skrifa::{FontRef, MetadataProvider}; fn main() { let args = Arguments::from_args(); let tests = glyph_tests(); libtest_mimic::run(&args, tests).exit(); } fn glyph_tests() -> Vec { let ws = std::env::var("CARGO_MANIFEST_DIR").unwrap(); let paths = glob::glob(&format!("{ws}/tests/fonts/**/*.ttf")).unwrap(); paths .into_iter() .flat_map(|p| { let p = p.unwrap(); let name = p.strip_prefix(&ws).unwrap().display().to_string(); font_glyph_tests(name, p) }) .collect() } fn font_glyph_tests(name: String, path: PathBuf) -> Vec { let data = std::fs::read(&path).unwrap(); let font_ref = FontRef::new(&data).unwrap(); let names = font_ref.glyph_names(); font_ref .outline_glyphs() .iter() .zip(font_ref.outline_glyphs().iter().skip(1)) .map(|((id1, outline1), (_id2, outline2))| { let glyph_name = names.get(id1).unwrap(); let path1 = outline_to_bezpath(outline1); let path2 = outline_to_bezpath(outline2); Trial::test(format!("{name}-{glyph_name}"), || { test_outline(path1, path2) }) }) .collect() } fn test_outline(path1: BezPath, path2: BezPath) -> Result<(), Failed> { if path1.is_empty() || path2.is_empty() { return Ok(()); } let top = Topology::from_paths_binary(&path1, &path2, 1e-3).unwrap(); let _out_paths = top.compute_positions(); Ok(()) }