summaryrefslogtreecommitdiff
path: root/tests/src/tests.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2024-02-28 11:06:54 +0100
committerGitHub <noreply@github.com>2024-02-28 10:06:54 +0000
commite16d3f5a67a31154797b4d56cdc6ed142ee2a7cf (patch)
tree31dcd2243c2b51bac62fe19e7e60efe5f6289281 /tests/src/tests.rs
parent5036c5acebebe12cbf14338f5413514251d83d1e (diff)
Externalize assets (#3515)
Diffstat (limited to 'tests/src/tests.rs')
-rw-r--r--tests/src/tests.rs39
1 files changed, 19 insertions, 20 deletions
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)
}
}