From e16d3f5a67a31154797b4d56cdc6ed142ee2a7cf Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 28 Feb 2024 11:06:54 +0100 Subject: Externalize assets (#3515) --- tests/src/benches.rs | 5 ++--- tests/src/tests.rs | 39 +++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 23 deletions(-) (limited to 'tests/src') diff --git a/tests/src/benches.rs b/tests/src/benches.rs index 8a521419..1bcdb528 100644 --- a/tests/src/benches.rs +++ b/tests/src/benches.rs @@ -10,7 +10,6 @@ use typst::{Library, World}; use unscanny::Scanner; const TEXT: &str = include_str!("../typ/compiler/bench.typ"); -const FONT: &[u8] = include_bytes!("../../assets/fonts/LinLibertine_R.ttf"); main!( bench_decode, @@ -87,9 +86,9 @@ struct BenchWorld { impl BenchWorld { fn new() -> Self { - let font = Font::new(FONT.into(), 0).unwrap(); + let data = typst_assets::fonts().next().unwrap(); + let font = Font::new(Bytes::from_static(data), 0).unwrap(); let book = FontBook::from_fonts([&font]); - Self { library: Prehashed::new(Library::default()), book: Prehashed::new(book), diff --git a/tests/src/tests.rs b/tests/src/tests.rs index 05b53a73..2be5bc18 100644 --- a/tests/src/tests.rs +++ b/tests/src/tests.rs @@ -15,6 +15,7 @@ mod metadata; use self::metadata::*; +use std::borrow::Cow; use std::collections::{HashMap, HashSet}; use std::ffi::OsStr; use std::fmt::Write as _; @@ -47,8 +48,6 @@ const REF_DIR: &str = "ref"; const PNG_DIR: &str = "png"; const PDF_DIR: &str = "pdf"; const SVG_DIR: &str = "svg"; -const FONT_DIR: &str = "../assets/fonts"; -const ASSET_DIR: &str = "../assets"; /// Arguments that modify test behaviour. /// @@ -269,17 +268,10 @@ struct FileSlot { impl TestWorld { fn new(print: PrintConfig) -> Self { - // Search for fonts. - let mut fonts = vec![]; - for entry in WalkDir::new(FONT_DIR) - .sort_by_file_name() - .into_iter() - .filter_map(|e| e.ok()) - .filter(|entry| entry.file_type().is_file()) - { - let data = fs::read(entry.path()).unwrap(); - fonts.extend(Font::iter(data.into())); - } + let fonts: Vec<_> = typst_assets::fonts() + .chain(typst_dev_assets::fonts()) + .flat_map(|data| Font::iter(Bytes::from_static(data))) + .collect(); Self { print, @@ -310,7 +302,7 @@ impl World for TestWorld { slot.source .get_or_init(|| { let buf = read(&system_path(id)?)?; - let text = String::from_utf8(buf)?; + let text = String::from_utf8(buf.into_owned())?; Ok(Source::new(id, text)) }) .clone() @@ -320,7 +312,12 @@ impl World for TestWorld { fn file(&self, id: FileId) -> FileResult { self.slot(id, |slot| { slot.buffer - .get_or_init(|| read(&system_path(id)?).map(Bytes::from)) + .get_or_init(|| { + read(&system_path(id)?).map(|cow| match cow { + Cow::Owned(buf) => buf.into(), + Cow::Borrowed(buf) => Bytes::from_static(buf), + }) + }) .clone() }) } @@ -379,19 +376,21 @@ fn system_path(id: FileId) -> FileResult { } /// Read a file. -fn read(path: &Path) -> FileResult> { +fn read(path: &Path) -> FileResult> { // Basically symlinks `assets/files` to `tests/files` so that the assets // are within the test project root. - let mut resolved = path.to_path_buf(); - if path.starts_with("files/") { - resolved = Path::new(ASSET_DIR).join(path); + let resolved = path.to_path_buf(); + if let Ok(suffix) = path.strip_prefix("assets/") { + return typst_dev_assets::get(&suffix.to_string_lossy()) + .map(Cow::Borrowed) + .ok_or_else(|| FileError::NotFound(path.into())); } let f = |e| FileError::from_io(e, path); if fs::metadata(&resolved).map_err(f)?.is_dir() { Err(FileError::IsDirectory) } else { - fs::read(&resolved).map_err(f) + fs::read(&resolved).map(Cow::Owned).map_err(f) } } -- cgit v1.2.3