From cfcb36b159e3f65aff8cbdac6b537b40c22507c0 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 14 Jan 2021 16:47:29 +0100 Subject: [PATCH] =?UTF-8?q?Move=20test=20files=20into=20category=20subfold?= =?UTF-8?q?ers=20=F0=9F=9A=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + bench/src/bench.rs | 2 +- src/layout/spacing.rs | 2 +- tests/README.md | 5 ++ tests/ref/basics.png | Bin 5179 -> 0 bytes tests/ref/{example-coma.png => full/coma.png} | Bin tests/ref/func-page.png | Bin 8099 -> 0 bytes tests/ref/{ => lang}/arrays.png | Bin tests/ref/lang/basics.png | Bin 0 -> 5051 bytes tests/ref/{ => lang}/comments.png | Bin tests/ref/{ => lang}/dictionaries.png | Bin tests/ref/{ => lang}/empty.png | Bin tests/ref/{ => lang}/escaping.png | Bin tests/ref/{ => lang}/headings.png | Bin tests/ref/{func-font.png => library/font.png} | Bin tests/ref/{func-hv.png => library/hv.png} | Bin .../ref/{func-image.png => library/image.png} | Bin tests/ref/library/page.png | Bin 0 -> 8097 bytes .../pagebreak.png} | Bin tests/ref/{func-rgb.png => library/rgb.png} | Bin tests/typ/{example-coma.typ => full/coma.typ} | 2 - tests/typ/{ => lang}/arrays.typ | 0 tests/typ/{ => lang}/basics.typ | 8 ---- tests/typ/{ => lang}/comments.typ | 0 tests/typ/{ => lang}/dictionaries.typ | 0 tests/typ/{ => lang}/empty.typ | 0 tests/typ/{ => lang}/escaping.typ | 0 tests/typ/{ => lang}/headings.typ | 6 +-- tests/typ/{func-font.typ => library/font.typ} | 34 ++++++-------- tests/typ/{func-hv.typ => library/hv.typ} | 2 - .../typ/{func-image.typ => library/image.typ} | 17 +++---- tests/typ/{func-page.typ => library/page.typ} | 30 ++++-------- .../pagebreak.typ} | 2 - tests/typ/{func-rgb.typ => library/rgb.typ} | 2 - tests/typeset.rs | 43 ++++++++---------- 35 files changed, 60 insertions(+), 96 deletions(-) delete mode 100644 tests/ref/basics.png rename tests/ref/{example-coma.png => full/coma.png} (100%) delete mode 100644 tests/ref/func-page.png rename tests/ref/{ => lang}/arrays.png (100%) create mode 100644 tests/ref/lang/basics.png rename tests/ref/{ => lang}/comments.png (100%) rename tests/ref/{ => lang}/dictionaries.png (100%) rename tests/ref/{ => lang}/empty.png (100%) rename tests/ref/{ => lang}/escaping.png (100%) rename tests/ref/{ => lang}/headings.png (100%) rename tests/ref/{func-font.png => library/font.png} (100%) rename tests/ref/{func-hv.png => library/hv.png} (100%) rename tests/ref/{func-image.png => library/image.png} (100%) create mode 100644 tests/ref/library/page.png rename tests/ref/{func-pagebreak.png => library/pagebreak.png} (100%) rename tests/ref/{func-rgb.png => library/rgb.png} (100%) rename tests/typ/{example-coma.typ => full/coma.typ} (93%) rename tests/typ/{ => lang}/arrays.typ (100%) rename tests/typ/{ => lang}/basics.typ (68%) rename tests/typ/{ => lang}/comments.typ (100%) rename tests/typ/{ => lang}/dictionaries.typ (100%) rename tests/typ/{ => lang}/empty.typ (100%) rename tests/typ/{ => lang}/escaping.typ (100%) rename tests/typ/{ => lang}/headings.typ (73%) rename tests/typ/{func-font.typ => library/font.typ} (95%) rename tests/typ/{func-hv.typ => library/hv.typ} (91%) rename tests/typ/{func-image.typ => library/image.typ} (95%) rename tests/typ/{func-page.typ => library/page.typ} (94%) rename tests/typ/{func-pagebreak.typ => library/pagebreak.typ} (60%) rename tests/typ/{func-rgb.typ => library/rgb.typ} (93%) diff --git a/Cargo.toml b/Cargo.toml index 4492c84b1..dba398a5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] tiny-skia = "0.2" +walkdir = "2" [profile.dev] opt-level = 2 diff --git a/bench/src/bench.rs b/bench/src/bench.rs index b8093d531..58ecf9fd0 100644 --- a/bench/src/bench.rs +++ b/bench/src/bench.rs @@ -13,7 +13,7 @@ use typst::parse::parse; use typst::typeset; const FONT_DIR: &str = "../fonts"; -const COMA: &str = include_str!("../../tests/typ/example-coma.typ"); +const COMA: &str = include_str!("../../tests/typ/full/coma.typ"); fn benchmarks(c: &mut Criterion) { macro_rules! bench { diff --git a/src/layout/spacing.rs b/src/layout/spacing.rs index f0024fabd..1d6c7f9c2 100644 --- a/src/layout/spacing.rs +++ b/src/layout/spacing.rs @@ -3,7 +3,7 @@ use std::fmt::{self, Debug, Formatter}; use super::*; use crate::eval::Softness; -/// A spacing node. +/// A spacing node. #[derive(Copy, Clone, PartialEq)] pub struct NodeSpacing { /// The amount of spacing to insert. diff --git a/tests/README.md b/tests/README.md index fef134820..429207a5e 100644 --- a/tests/README.md +++ b/tests/README.md @@ -8,3 +8,8 @@ - `res`: Resource files used by tests. - `png`: PNG files produced by tests. - `pdf`: PDF files produced by tests. + +The test files are split into three categories: +- `full`: Tests of full documents. +- `lang`: Tests for specific language features. +- `library`: Tests for specific library functions. diff --git a/tests/ref/basics.png b/tests/ref/basics.png deleted file mode 100644 index fbe85320d17088ba76e7e460e3de64ac50583be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5179 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 diff --git a/tests/ref/example-coma.png b/tests/ref/full/coma.png similarity index 100% rename from tests/ref/example-coma.png rename to tests/ref/full/coma.png diff --git a/tests/ref/func-page.png b/tests/ref/func-page.png deleted file mode 100644 index fb1b7b398588cead7a78a3dbf9a942a8ccaa3562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8099 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 Pe0{gJM4T!$_agom4(>qa diff --git a/tests/ref/arrays.png b/tests/ref/lang/arrays.png similarity index 100% rename from tests/ref/arrays.png rename to tests/ref/lang/arrays.png diff --git a/tests/ref/lang/basics.png b/tests/ref/lang/basics.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3dd7a0c703bd63839f3e47357d7b8a72872115 GIT binary patch literal 5051 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 B1)cx^ literal 0 HcmV?d00001 diff --git a/tests/ref/comments.png b/tests/ref/lang/comments.png similarity index 100% rename from tests/ref/comments.png rename to tests/ref/lang/comments.png diff --git a/tests/ref/dictionaries.png b/tests/ref/lang/dictionaries.png similarity index 100% rename from tests/ref/dictionaries.png rename to tests/ref/lang/dictionaries.png diff --git a/tests/ref/empty.png b/tests/ref/lang/empty.png similarity index 100% rename from tests/ref/empty.png rename to tests/ref/lang/empty.png diff --git a/tests/ref/escaping.png b/tests/ref/lang/escaping.png similarity index 100% rename from tests/ref/escaping.png rename to tests/ref/lang/escaping.png diff --git a/tests/ref/headings.png b/tests/ref/lang/headings.png similarity index 100% rename from tests/ref/headings.png rename to tests/ref/lang/headings.png diff --git a/tests/ref/func-font.png b/tests/ref/library/font.png similarity index 100% rename from tests/ref/func-font.png rename to tests/ref/library/font.png diff --git a/tests/ref/func-hv.png b/tests/ref/library/hv.png similarity index 100% rename from tests/ref/func-hv.png rename to tests/ref/library/hv.png diff --git a/tests/ref/func-image.png b/tests/ref/library/image.png similarity index 100% rename from tests/ref/func-image.png rename to tests/ref/library/image.png diff --git a/tests/ref/library/page.png b/tests/ref/library/page.png new file mode 100644 index 0000000000000000000000000000000000000000..975574372d4bc2382d8ec54d163af0a9ddc5db3b GIT binary patch literal 8097 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 Q@!Pw-t@Ftmcp&k=0aeBvO8@`> literal 0 HcmV?d00001 diff --git a/tests/ref/func-pagebreak.png b/tests/ref/library/pagebreak.png similarity index 100% rename from tests/ref/func-pagebreak.png rename to tests/ref/library/pagebreak.png diff --git a/tests/ref/func-rgb.png b/tests/ref/library/rgb.png similarity index 100% rename from tests/ref/func-rgb.png rename to tests/ref/library/rgb.png diff --git a/tests/typ/example-coma.typ b/tests/typ/full/coma.typ similarity index 93% rename from tests/typ/example-coma.typ rename to tests/typ/full/coma.typ index 5374af1fa..b7863fce8 100644 --- a/tests/typ/example-coma.typ +++ b/tests/typ/full/coma.typ @@ -1,5 +1,3 @@ -// Test integration of syntax, library and layouting. - [page width: 450pt, height: 300pt, margins: 1cm] [box][ diff --git a/tests/typ/arrays.typ b/tests/typ/lang/arrays.typ similarity index 100% rename from tests/typ/arrays.typ rename to tests/typ/lang/arrays.typ diff --git a/tests/typ/basics.typ b/tests/typ/lang/basics.typ similarity index 68% rename from tests/typ/basics.typ rename to tests/typ/lang/basics.typ index b7630e7fe..9220e3765 100644 --- a/tests/typ/basics.typ +++ b/tests/typ/lang/basics.typ @@ -1,17 +1,9 @@ -// Test text, emph and strong. - Hello 🌏! _Emph_ and *strong*! ---- -// Test non-breaking space. - The non-breaking~space does not work. ---- -// Test backslash. - // Directly after word. Line\ Break diff --git a/tests/typ/comments.typ b/tests/typ/lang/comments.typ similarity index 100% rename from tests/typ/comments.typ rename to tests/typ/lang/comments.typ diff --git a/tests/typ/dictionaries.typ b/tests/typ/lang/dictionaries.typ similarity index 100% rename from tests/typ/dictionaries.typ rename to tests/typ/lang/dictionaries.typ diff --git a/tests/typ/empty.typ b/tests/typ/lang/empty.typ similarity index 100% rename from tests/typ/empty.typ rename to tests/typ/lang/empty.typ diff --git a/tests/typ/escaping.typ b/tests/typ/lang/escaping.typ similarity index 100% rename from tests/typ/escaping.typ rename to tests/typ/lang/escaping.typ diff --git a/tests/typ/headings.typ b/tests/typ/lang/headings.typ similarity index 73% rename from tests/typ/headings.typ rename to tests/typ/lang/headings.typ index 0f364a9bf..f62f6534a 100644 --- a/tests/typ/headings.typ +++ b/tests/typ/lang/headings.typ @@ -1,4 +1,4 @@ -// Number of hashtags. +// Test different numbers of hashtags. # One ### Three @@ -8,7 +8,7 @@ ####### Seven --- -// Heading vs. no heading. +// Test heading vs. no heading. /**/ # Heading {[## Heading]} @@ -24,7 +24,7 @@ Nr#1 #nope --- -// Heading continues over linebreak. +// Heading continuation over linebreak. # This { "works" diff --git a/tests/typ/func-font.typ b/tests/typ/library/font.typ similarity index 95% rename from tests/typ/func-font.typ rename to tests/typ/library/font.typ index 8199ecb43..beaddd4e6 100644 --- a/tests/typ/func-font.typ +++ b/tests/typ/library/font.typ @@ -19,8 +19,22 @@ // Set stretch (not available, matching closest). [font stretch: ultra-condensed][Condensed] +// Error: 1:7-1:12 unexpected argument +[font false] + +// Error: 3:14-3:18 expected font style, found font weight +// Error: 2:28-2:34 expected font weight, found string +// Error: 1:43-1:44 expected font family or array of font families, found integer +[font style: bold, weight: "thin", serif: 0] + +// Warning: 1:15-1:19 must be between 100 and 900 +[font weight: 2700] + +// Error: 1:7-1:27 unexpected argument +[font something: "invalid"] + --- -// Test font fallback. +// Test font fallback and class definitions. // Source Sans Pro + Segoe UI Emoji. Emoji: 🏀 @@ -40,21 +54,3 @@ Emoji: 🏀 [font sans-serif: "Noto Emoji"] [font sans-serif: ("Archivo", sans-serif)] New sans-serif. 🚀 - ---- -// Test error cases. -// Ref: false - -// Error: 1:7-1:12 unexpected argument -[font false] - -// Error: 3:14-3:18 expected font style, found font weight -// Error: 2:28-2:34 expected font weight, found string -// Error: 1:43-1:44 expected font family or array of font families, found integer -[font style: bold, weight: "thin", serif: 0] - -// Warning: 1:15-1:19 must be between 100 and 900 -[font weight: 2700] - -// Error: 1:7-1:27 unexpected argument -[font something: "invalid"] diff --git a/tests/typ/func-hv.typ b/tests/typ/library/hv.typ similarity index 91% rename from tests/typ/func-hv.typ rename to tests/typ/library/hv.typ index b32a645c7..36a6d242d 100644 --- a/tests/typ/func-hv.typ +++ b/tests/typ/library/hv.typ @@ -1,5 +1,3 @@ -// Test the `h` and `v` functions. - // Ends paragraphs. Tightly [v -5pt] packed diff --git a/tests/typ/func-image.typ b/tests/typ/library/image.typ similarity index 95% rename from tests/typ/func-image.typ rename to tests/typ/library/image.typ index 1f94a66ff..2e7b1eb52 100644 --- a/tests/typ/func-image.typ +++ b/tests/typ/library/image.typ @@ -7,6 +7,12 @@ // Load an RGB JPEG image. [image "res/tiger.jpg"] +// Error: 1:8-1:29 failed to load image +[image "path/does/not/exist"] + +// Error: 1:8-1:29 failed to load image +[image "typ/image-error.typ"] + --- // Test configuring the size and fitting behaviour of images. @@ -31,14 +37,3 @@ [align bottom, right][ [image "res/tiger.jpg", width: 60pt] ] - ---- -// Test error cases. -// -// Ref: false - -// Error: 1:8-1:29 failed to load image -[image "path/does/not/exist"] - -// Error: 1:8-1:29 failed to load image -[image "typ/image-error.typ"] diff --git a/tests/typ/func-page.typ b/tests/typ/library/page.typ similarity index 94% rename from tests/typ/func-page.typ rename to tests/typ/library/page.typ index 49671e140..9eeddc93c 100644 --- a/tests/typ/func-page.typ +++ b/tests/typ/library/page.typ @@ -21,8 +21,11 @@ // Ensure that specific margins override general margins. [page margins: 0pt, left: 20pt][Overriden] ---- -// Test flipping. +// Error: 1:7-1:18 unknown variable +[page nonexistant] + +// Error: 1:17-1:20 aligned axis +[page main-dir: ltr] // Flipped predefined paper. [page "a11", flip: true][Flipped A11] @@ -32,6 +35,11 @@ [page flip: true] Wide +// Test changing the layouting directions of pages. + +[page height: 50pt, main-dir: btt, cross-dir: rtl] +Right to left! + --- // Test a combination of pages with bodies and normal content. @@ -44,21 +52,3 @@ Fourth [page][] Sixth [page][Seventh and last] - ---- -// Test changing the layouting directions of pages. - -[page height: 50pt, main-dir: btt, cross-dir: rtl] - -Right to left! - ---- -// Test error cases. -// -// Ref: false - -// Error: 1:7-1:18 unknown variable -[page nonexistant] - -// Error: 1:17-1:20 aligned axis -[page main-dir: ltr] diff --git a/tests/typ/func-pagebreak.typ b/tests/typ/library/pagebreak.typ similarity index 60% rename from tests/typ/func-pagebreak.typ rename to tests/typ/library/pagebreak.typ index 603e11d41..2f539ce00 100644 --- a/tests/typ/func-pagebreak.typ +++ b/tests/typ/library/pagebreak.typ @@ -1,5 +1,3 @@ -// Test trailing pagebreak. - First of two [pagebreak] [page height: 40pt] diff --git a/tests/typ/func-rgb.typ b/tests/typ/library/rgb.typ similarity index 93% rename from tests/typ/func-rgb.typ rename to tests/typ/library/rgb.typ index d29c29409..66d63d0de 100644 --- a/tests/typ/func-rgb.typ +++ b/tests/typ/library/rgb.typ @@ -1,5 +1,3 @@ -// Test the `rgb` function. - // Check the output. [rgb 0.0, 0.3, 0.7] diff --git a/tests/typeset.rs b/tests/typeset.rs index f67649b0c..79a884ebf 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -12,6 +12,7 @@ use tiny_skia::{ Rect, SpreadMode, Transform, }; use ttf_parser::OutlineBuilder; +use walkdir::WalkDir; use typst::diag::{Diag, Feedback, Level, Pass}; use typst::env::{Env, ImageResource, ResourceLoader, SharedEnv}; @@ -37,15 +38,15 @@ fn main() { let filter = TestFilter::new(env::args().skip(1)); let mut filtered = Vec::new(); - for entry in fs::read_dir(TYP_DIR).unwrap() { - let src_path = entry.unwrap().path(); + for entry in WalkDir::new(TYP_DIR).into_iter() { + let entry = entry.unwrap(); + let src_path = entry.into_path(); if src_path.extension() != Some(OsStr::new("typ")) { continue; } - let name = src_path.file_stem().unwrap().to_string_lossy().to_string(); - if filter.matches(&name) { - filtered.push((name, src_path)); + if filter.matches(&src_path.to_string_lossy().to_string()) { + filtered.push(src_path); } } @@ -56,9 +57,6 @@ fn main() { println!("Running {} tests", len); } - fs::create_dir_all(PNG_DIR).unwrap(); - fs::create_dir_all(PDF_DIR).unwrap(); - let mut index = FsIndex::new(); index.search_dir(FONT_DIR); @@ -69,9 +67,8 @@ fn main() { })); let playground = Path::new("playground.typ"); - if playground.exists() { + if playground.exists() && filtered.is_empty() { test( - "playground", playground, Path::new("playground.png"), Path::new("playground.pdf"), @@ -81,18 +78,12 @@ fn main() { } let mut ok = true; - for (name, src_path) in filtered { - let png_path = Path::new(PNG_DIR).join(&name).with_extension("png"); - let pdf_path = Path::new(PDF_DIR).join(&name).with_extension("pdf"); - let ref_path = Path::new(REF_DIR).join(&name).with_extension("png"); - ok &= test( - &name, - &src_path, - &png_path, - &pdf_path, - Some(&ref_path), - &env, - ); + for src_path in filtered { + let relative = src_path.strip_prefix(TYP_DIR).unwrap(); + let png_path = Path::new(PNG_DIR).join(&relative).with_extension("png"); + let pdf_path = Path::new(PDF_DIR).join(&relative).with_extension("pdf"); + let ref_path = Path::new(REF_DIR).join(&relative).with_extension("png"); + ok &= test(&src_path, &png_path, &pdf_path, Some(&ref_path), &env); } if !ok { @@ -131,14 +122,14 @@ impl TestFilter { } fn test( - name: &str, src_path: &Path, png_path: &Path, pdf_path: &Path, ref_path: Option<&Path>, env: &SharedEnv, ) -> bool { - println!("Testing {}.", name); + let name = src_path.strip_prefix(TYP_DIR).unwrap_or(src_path); + println!("Testing {}", name.display()); let src = fs::read_to_string(src_path).unwrap(); @@ -154,9 +145,11 @@ fn test( let env = env.borrow(); if !frames.is_empty() { let pdf_data = pdf::export(&frames, &env); + fs::create_dir_all(&pdf_path.parent().unwrap()).unwrap(); fs::write(pdf_path, pdf_data).unwrap(); let canvas = draw(&frames, &env, 2.0); + fs::create_dir_all(&png_path.parent().unwrap()).unwrap(); canvas.pixmap.save_png(png_path).unwrap(); if let Some(ref_path) = ref_path { @@ -173,7 +166,7 @@ fn test( } if ok { - println!("\x1b[1ATesting {}. ✔", name); + println!("\x1b[1ATesting {} ✔", name.display()); } ok