diff options
Diffstat (limited to 'tests/layouting.rs')
| -rw-r--r-- | tests/layouting.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/tests/layouting.rs b/tests/layouting.rs new file mode 100644 index 00000000..b748748f --- /dev/null +++ b/tests/layouting.rs @@ -0,0 +1,82 @@ +use std::fs::{self, File}; +use std::io::{Write, Read, BufWriter}; +use std::process::Command; + +use typst::Typesetter; +use typst::toddle::query::FileSystemFontProvider; +use typst::export::pdf::PdfExporter; +use typst::doc::LayoutAction; + +const CACHE_DIR: &str = "test-cache"; + + +#[test] +fn layouting() { + fs::create_dir_all(format!("{}/serialized", CACHE_DIR)).unwrap(); + fs::create_dir_all(format!("{}/rendered", CACHE_DIR)).unwrap(); + fs::create_dir_all(format!("{}/pdf", CACHE_DIR)).unwrap(); + + for entry in fs::read_dir("tests/layouts/").unwrap() { + let path = entry.unwrap().path(); + + let mut file = File::open(&path).unwrap(); + let mut src = String::new(); + file.read_to_string(&mut src).unwrap(); + + let name = path + .file_stem().unwrap() + .to_str().unwrap(); + + test(name, &src); + } +} + +/// Create a _PDF_ with a name from the source code. +fn test(name: &str, src: &str) { + let mut typesetter = Typesetter::new(); + let provider = FileSystemFontProvider::from_listing("fonts/fonts.toml").unwrap(); + typesetter.add_font_provider(provider.clone()); + + // Layout into box layout. + let tree = typesetter.parse(src).unwrap(); + let layout = typesetter.layout(&tree).unwrap(); + + // Write the serialed layout file. + let path = format!("{}/serialized/{}.box", CACHE_DIR, name); + let mut file = File::create(path).unwrap(); + + // Find all used fonts and their filenames. + let mut map = Vec::new(); + let mut loader = typesetter.loader().borrow_mut(); + for action in &layout.actions { + if let LayoutAction::SetFont(index, _) = action { + if map.iter().find(|(i, _)| i == index).is_none() { + let (_, provider_index) = loader.get_provider_and_index(*index); + let filename = provider.get_path(provider_index).to_str().unwrap(); + map.push((*index, filename)); + } + } + } + drop(loader); + + // Write the font mapping into the serialization file. + writeln!(file, "{}", map.len()).unwrap(); + for (index, path) in map { + writeln!(file, "{} {}", index, path).unwrap(); + } + layout.serialize(&mut file).unwrap(); + + // Render the layout into a PNG. + Command::new("python") + .arg("tests/render.py") + .arg(name) + .spawn() + .expect("failed to run python-based renderer"); + + // Write the PDF file. + let path = format!("{}/pdf/{}.pdf", CACHE_DIR, name); + let file = BufWriter::new(File::create(path).unwrap()); + let document = layout.into_doc(); + let exporter = PdfExporter::new(); + exporter.export(&document, typesetter.loader(), file).unwrap(); +} |
