diff options
| author | Laurenz <laurmaedje@gmail.com> | 2024-02-28 11:06:54 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-28 10:06:54 +0000 |
| commit | e16d3f5a67a31154797b4d56cdc6ed142ee2a7cf (patch) | |
| tree | 31dcd2243c2b51bac62fe19e7e60efe5f6289281 /tests/src | |
| parent | 5036c5acebebe12cbf14338f5413514251d83d1e (diff) | |
Externalize assets (#3515)
Diffstat (limited to 'tests/src')
| -rw-r--r-- | tests/src/benches.rs | 5 | ||||
| -rw-r--r-- | tests/src/tests.rs | 39 |
2 files changed, 21 insertions, 23 deletions
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<Bytes> { 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<PathBuf> { } /// Read a file. -fn read(path: &Path) -> FileResult<Vec<u8>> { +fn read(path: &Path) -> FileResult<Cow<'static, [u8]>> { // 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) } } |
