From 9bd8b7ddac046f581dc750e148147901d08cb0f4 Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Sun, 27 Jun 2021 18:06:39 +0200 Subject: Code review, new stack test --- tests/ref/layout/stack.png | Bin 264 -> 325 bytes tests/typ/layout/stack.typ | 9 ++++++++ tests/typeset.rs | 56 ++++++++++++++++++++++++--------------------- 3 files changed, 39 insertions(+), 26 deletions(-) (limited to 'tests') diff --git a/tests/ref/layout/stack.png b/tests/ref/layout/stack.png index 684905f7..2f190c4d 100644 Binary files a/tests/ref/layout/stack.png and b/tests/ref/layout/stack.png differ diff --git a/tests/typ/layout/stack.typ b/tests/typ/layout/stack.typ index 006a1412..50ed1eb1 100644 --- a/tests/typ/layout/stack.typ +++ b/tests/typ/layout/stack.typ @@ -7,3 +7,12 @@ rect(3cm, forest), rect(1cm, conifer), ) + +--- + +#let rect(width, color) = rect(width: 1cm, height: 0.4cm, fill: color) +// This stack overflows. +#box(height: 0.5cm, stack( + rect(3cm, forest), + rect(1cm, conifer), +)) diff --git a/tests/typeset.rs b/tests/typeset.rs index 9e0c9596..740d9a03 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -15,14 +15,14 @@ use walkdir::WalkDir; use typst::cache::Cache; use typst::color; -use typst::diag::{Diag, DiagSet, Level}; -use typst::eval::{EvalContext, FuncArgs, FuncValue, Scope, Value}; -use typst::exec::State; +use typst::diag::{Diag, DiagSet, Level, Pass}; +use typst::eval::{eval, EvalContext, FuncArgs, FuncValue, Scope, Value}; +use typst::exec::{exec, State}; use typst::geom::{self, Length, Point, Sides, Size}; use typst::image::ImageId; -use typst::layout::{Element, Fill, Frame, Shape, Text}; +use typst::layout::{layout, Element, Fill, Frame, Shape, Text}; use typst::loading::FsLoader; -use typst::parse::{LineMap, Scanner}; +use typst::parse::{parse, LineMap, Scanner}; use typst::syntax::{Location, Pos}; const TYP_DIR: &str = "./typ"; @@ -224,12 +224,22 @@ fn test_part( state.page.size = Size::new(Length::pt(120.0), Length::inf()); state.page.margins = Sides::splat(Some(Length::pt(10.0).into())); - let mut pass = - typst::typeset(loader, cache, Some(src_path), &src, &scope, state.clone()); + let parsed = parse(src); + let evaluated = eval( + loader, + cache, + Some(src_path), + Rc::new(parsed.output), + &scope, + ); + let executed = exec(&evaluated.output.template, state.clone()); + let layouted = layout(loader, cache, &executed.output); - if !compare_ref { - pass.output.clear(); - } + let mut diags = parsed.diags; + diags.extend(evaluated.diags); + diags.extend(executed.diags); + + let mut pass = Pass::new(layouted, diags); let mut ok = true; @@ -274,35 +284,25 @@ fn test_part( cache.layout.turnaround(); - let mut cached_result = - typst::typeset(loader, cache, Some(src_path), &src, &scope, state.clone()); - - if !compare_ref { - cached_result.output.clear(); - } + let cached_result = layout(loader, cache, &executed.output); - let misses: Vec<_> = cache + let misses = cache .layout .frames .iter() .flat_map(|(_, e)| e) .filter(|e| e.level == level && !e.hit() && e.age() == 2) - .collect(); + .count(); - if !misses.is_empty() { + if misses > 0 { ok = false; - let mut miss_count = 0; - for miss in misses { - dbg!(miss.frames.iter().map(|f| f.constraints).collect::>()); - miss_count += 1; - } println!( " Recompilation had {} cache misses on level {} (Subtest {}) ❌", - miss_count, level, i + misses, level, i ); } - if cached_result != pass { + if cached_result != pass.output { ok = false; println!( " Recompilation of subtest {} differs from clean pass ❌", @@ -314,6 +314,10 @@ fn test_part( cache.layout = reference_cache; cache.layout.turnaround(); + if !compare_ref { + pass.output.clear(); + } + (ok, compare_ref, pass.output) } -- cgit v1.2.3