From 6b6cdae7ce95681d6a1194be70b375494166a8c6 Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Sun, 27 Jun 2021 12:28:40 +0200 Subject: Testing for incremental Also, constraint bugfixes. --- tests/typeset.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/typeset.rs b/tests/typeset.rs index c5f31e61..9e0c9596 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -224,10 +224,8 @@ 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())); - // Clear cache between tests (for now). - cache.layout.clear(); - - let mut pass = typst::typeset(loader, cache, Some(src_path), &src, &scope, state); + let mut pass = + typst::typeset(loader, cache, Some(src_path), &src, &scope, state.clone()); if !compare_ref { pass.output.clear(); @@ -266,6 +264,56 @@ fn test_part( } } + let reference_cache = cache.layout.clone(); + for level in 0 .. reference_cache.levels() { + cache.layout = reference_cache.clone(); + cache.layout.retain(|x| x == level); + if cache.layout.frames.is_empty() { + continue; + } + + 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 misses: Vec<_> = cache + .layout + .frames + .iter() + .flat_map(|(_, e)| e) + .filter(|e| e.level == level && !e.hit() && e.age() == 2) + .collect(); + + if !misses.is_empty() { + 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 + ); + } + + if cached_result != pass { + ok = false; + println!( + " Recompilation of subtest {} differs from clean pass ❌", + i + ); + } + } + + cache.layout = reference_cache; + cache.layout.turnaround(); + (ok, compare_ref, pass.output) } -- cgit v1.2.3 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 From 6f518c172805b6ac067a692eb8971c7ec1e50608 Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 27 Jun 2021 18:30:25 +0200 Subject: Adjust comments Co-authored-by: Laurenz Update tests/typ/layout/stack.typ Co-authored-by: Laurenz --- tests/typ/layout/stack.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/typ/layout/stack.typ b/tests/typ/layout/stack.typ index 50ed1eb1..89e587c7 100644 --- a/tests/typ/layout/stack.typ +++ b/tests/typ/layout/stack.typ @@ -9,9 +9,9 @@ ) --- +// Test overflowing stack. #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), -- cgit v1.2.3 From e9960b89424ab67e633076ccc9f8c420316b076a Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Sun, 27 Jun 2021 18:57:08 +0200 Subject: Code review: Reverse temperature --- tests/typeset.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'tests') diff --git a/tests/typeset.rs b/tests/typeset.rs index 740d9a03..31da3ce0 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -15,7 +15,7 @@ use walkdir::WalkDir; use typst::cache::Cache; use typst::color; -use typst::diag::{Diag, DiagSet, Level, Pass}; +use typst::diag::{Diag, DiagSet, Level}; use typst::eval::{eval, EvalContext, FuncArgs, FuncValue, Scope, Value}; use typst::exec::{exec, State}; use typst::geom::{self, Length, Point, Sides, Size}; @@ -233,14 +233,12 @@ fn test_part( &scope, ); let executed = exec(&evaluated.output.template, state.clone()); - let layouted = layout(loader, cache, &executed.output); + let mut layouted = layout(loader, cache, &executed.output); let mut diags = parsed.diags; diags.extend(evaluated.diags); diags.extend(executed.diags); - let mut pass = Pass::new(layouted, diags); - let mut ok = true; for panic in &*panics.borrow() { @@ -255,11 +253,11 @@ fn test_part( ok = false; } - if pass.diags != ref_diags { + if diags != ref_diags { println!(" Subtest {} does not match expected diagnostics. ❌", i); ok = false; - for diag in &pass.diags { + for diag in &diags { if !ref_diags.contains(diag) { print!(" Not annotated | "); print_diag(diag, &map, lines); @@ -267,7 +265,7 @@ fn test_part( } for diag in &ref_diags { - if !pass.diags.contains(diag) { + if !diags.contains(diag) { print!(" Not emitted | "); print_diag(diag, &map, lines); } @@ -302,7 +300,7 @@ fn test_part( ); } - if cached_result != pass.output { + if cached_result != layouted { ok = false; println!( " Recompilation of subtest {} differs from clean pass ❌", @@ -315,10 +313,10 @@ fn test_part( cache.layout.turnaround(); if !compare_ref { - pass.output.clear(); + layouted.clear(); } - (ok, compare_ref, pass.output) + (ok, compare_ref, layouted) } fn parse_metadata(src: &str, map: &LineMap) -> (Option, DiagSet) { -- cgit v1.2.3