mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Move incremental test into separate function
This commit is contained in:
parent
88d3be2581
commit
56cbf96fe2
@ -50,6 +50,15 @@ pub struct LayoutNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl LayoutNode {
|
impl LayoutNode {
|
||||||
|
/// Create a new instance from any node that satisifies the required bounds.
|
||||||
|
#[cfg(not(feature = "layout-cache"))]
|
||||||
|
pub fn new<T>(node: T) -> Self
|
||||||
|
where
|
||||||
|
T: Layout + Debug + Clone + Eq + PartialEq + 'static,
|
||||||
|
{
|
||||||
|
Self { node: Box::new(node) }
|
||||||
|
}
|
||||||
|
|
||||||
/// Create a new instance from any node that satisifies the required bounds.
|
/// Create a new instance from any node that satisifies the required bounds.
|
||||||
#[cfg(feature = "layout-cache")]
|
#[cfg(feature = "layout-cache")]
|
||||||
pub fn new<T>(node: T) -> Self
|
pub fn new<T>(node: T) -> Self
|
||||||
@ -65,15 +74,6 @@ impl LayoutNode {
|
|||||||
|
|
||||||
Self { node: Box::new(node), hash }
|
Self { node: Box::new(node), hash }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new instance from any node that satisifies the required bounds.
|
|
||||||
#[cfg(not(feature = "layout-cache"))]
|
|
||||||
pub fn new<T>(node: T) -> Self
|
|
||||||
where
|
|
||||||
T: Layout + Debug + Clone + Eq + PartialEq + 'static,
|
|
||||||
{
|
|
||||||
Self { node: Box::new(node) }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Layout for LayoutNode {
|
impl Layout for LayoutNode {
|
||||||
@ -82,20 +82,17 @@ impl Layout for LayoutNode {
|
|||||||
ctx: &mut LayoutContext,
|
ctx: &mut LayoutContext,
|
||||||
regions: &Regions,
|
regions: &Regions,
|
||||||
) -> Vec<Constrained<Rc<Frame>>> {
|
) -> Vec<Constrained<Rc<Frame>>> {
|
||||||
#[cfg(feature = "layout-cache")]
|
|
||||||
{
|
|
||||||
ctx.level += 1;
|
|
||||||
let frames = ctx.layouts.get(self.hash, regions.clone()).unwrap_or_else(|| {
|
|
||||||
let frames = self.node.layout(ctx, regions);
|
|
||||||
ctx.layouts.insert(self.hash, frames.clone(), ctx.level - 1);
|
|
||||||
frames
|
|
||||||
});
|
|
||||||
ctx.level -= 1;
|
|
||||||
frames
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(feature = "layout-cache"))]
|
#[cfg(not(feature = "layout-cache"))]
|
||||||
self.node.layout(ctx, regions)
|
return self.node.layout(ctx, regions);
|
||||||
|
|
||||||
|
#[cfg(feature = "layout-cache")]
|
||||||
|
ctx.layouts.get(self.hash, regions.clone()).unwrap_or_else(|| {
|
||||||
|
ctx.level += 1;
|
||||||
|
let frames = self.node.layout(ctx, regions);
|
||||||
|
ctx.level -= 1;
|
||||||
|
ctx.layouts.insert(self.hash, frames.clone(), ctx.level);
|
||||||
|
frames
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ use typst::eval::{eval, Scope, Value};
|
|||||||
use typst::exec::{exec, State};
|
use typst::exec::{exec, State};
|
||||||
use typst::geom::{self, Length, PathElement, Point, Sides, Size};
|
use typst::geom::{self, Length, PathElement, Point, Sides, Size};
|
||||||
use typst::image::ImageId;
|
use typst::image::ImageId;
|
||||||
use typst::layout::{layout, Element, Frame, Geometry, Paint, Text};
|
use typst::layout::{layout, Element, Frame, Geometry, LayoutTree, Paint, Text};
|
||||||
use typst::loading::{FileId, FsLoader};
|
use typst::loading::{FileId, FsLoader};
|
||||||
use typst::parse::{parse, LineMap, Scanner};
|
use typst::parse::{parse, LineMap, Scanner};
|
||||||
use typst::syntax::{Location, Pos};
|
use typst::syntax::{Location, Pos};
|
||||||
@ -256,6 +256,7 @@ fn test_part(
|
|||||||
diags.extend(tree.diags);
|
diags.extend(tree.diags);
|
||||||
|
|
||||||
let mut ok = true;
|
let mut ok = true;
|
||||||
|
|
||||||
for panic in panics.borrow().iter() {
|
for panic in panics.borrow().iter() {
|
||||||
let line = map.location(panic.pos).unwrap().line;
|
let line = map.location(panic.pos).unwrap().line;
|
||||||
println!(" Assertion failed in line {} ❌", lines + line);
|
println!(" Assertion failed in line {} ❌", lines + line);
|
||||||
@ -290,44 +291,7 @@ fn test_part(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "layout-cache")]
|
#[cfg(feature = "layout-cache")]
|
||||||
{
|
(ok &= test_incremental(ctx, i, &tree.output, &frames));
|
||||||
let reference = ctx.layouts.clone();
|
|
||||||
for level in 0 .. reference.levels() {
|
|
||||||
ctx.layouts = reference.clone();
|
|
||||||
ctx.layouts.retain(|x| x == level);
|
|
||||||
if ctx.layouts.is_empty() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.layouts.turnaround();
|
|
||||||
|
|
||||||
let cached = layout(ctx, &tree.output);
|
|
||||||
let misses = ctx
|
|
||||||
.layouts
|
|
||||||
.entries()
|
|
||||||
.filter(|e| e.level() == level && !e.hit() && e.age() == 2)
|
|
||||||
.count();
|
|
||||||
|
|
||||||
if misses > 0 {
|
|
||||||
ok = false;
|
|
||||||
println!(
|
|
||||||
" Recompilation had {} cache misses on level {} (Subtest {}) ❌",
|
|
||||||
misses, level, i
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if cached != frames {
|
|
||||||
ok = false;
|
|
||||||
println!(
|
|
||||||
" Recompilation of subtest {} differs from clean pass ❌",
|
|
||||||
i
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.layouts = reference;
|
|
||||||
ctx.layouts.turnaround();
|
|
||||||
}
|
|
||||||
|
|
||||||
if !compare_ref {
|
if !compare_ref {
|
||||||
frames.clear();
|
frames.clear();
|
||||||
@ -336,6 +300,52 @@ fn test_part(
|
|||||||
(ok, compare_ref, frames)
|
(ok, compare_ref, frames)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "layout-cache")]
|
||||||
|
fn test_incremental(
|
||||||
|
ctx: &mut Context,
|
||||||
|
i: usize,
|
||||||
|
tree: &LayoutTree,
|
||||||
|
frames: &[Rc<Frame>],
|
||||||
|
) -> bool {
|
||||||
|
let mut ok = true;
|
||||||
|
|
||||||
|
let reference = ctx.layouts.clone();
|
||||||
|
for level in 0 .. reference.levels() {
|
||||||
|
ctx.layouts = reference.clone();
|
||||||
|
ctx.layouts.retain(|x| x == level);
|
||||||
|
if ctx.layouts.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.layouts.turnaround();
|
||||||
|
|
||||||
|
let cached = layout(ctx, tree);
|
||||||
|
let misses = ctx
|
||||||
|
.layouts
|
||||||
|
.entries()
|
||||||
|
.filter(|e| e.level() == level && !e.hit() && e.age() == 2)
|
||||||
|
.count();
|
||||||
|
|
||||||
|
if misses > 0 {
|
||||||
|
println!(
|
||||||
|
" Subtest {} relayout had {} cache misses on level {} ❌",
|
||||||
|
i, misses, level
|
||||||
|
);
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if cached != frames {
|
||||||
|
println!(" Subtest {} relayout differs from clean pass ❌", i);
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.layouts = reference;
|
||||||
|
ctx.layouts.turnaround();
|
||||||
|
|
||||||
|
ok
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_metadata(src: &str, map: &LineMap) -> (Option<bool>, DiagSet) {
|
fn parse_metadata(src: &str, map: &LineMap) -> (Option<bool>, DiagSet) {
|
||||||
let mut diags = DiagSet::new();
|
let mut diags = DiagSet::new();
|
||||||
let mut compare_ref = None;
|
let mut compare_ref = None;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user