From 73b25bdad0f0dda66f0a73c8b980e0ddb1a59553 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 14 Jan 2021 17:28:03 +0100 Subject: [PATCH] =?UTF-8?q?Move=20bracket=20function=20tests=20to=20integr?= =?UTF-8?q?ation=20=F0=9F=9A=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parse/tests.rs | 122 -------------------------------- tests/README.md | 14 +++- tests/ref/lang/bracket-call.png | Bin 0 -> 22962 bytes tests/ref/lang/comments.png | Bin 1332 -> 1148 bytes tests/typ/lang/bracket-call.typ | 86 ++++++++++++++++++++++ tests/typ/lang/comments.typ | 2 +- tests/typeset.rs | 36 +++++++--- 7 files changed, 126 insertions(+), 134 deletions(-) create mode 100644 tests/ref/lang/bracket-call.png create mode 100644 tests/typ/lang/bracket-call.typ diff --git a/src/parse/tests.rs b/src/parse/tests.rs index bb102476d..c87d43f74 100644 --- a/src/parse/tests.rs +++ b/src/parse/tests.rs @@ -261,128 +261,6 @@ fn test_parse_blocks() { S(4..5, "unexpected opening brace")]); } -#[test] -fn test_parse_bracket_funcs() { - // Basic. - t!("[function]" Call!("function")); - t!("[ v ]" Call!("v")); - - // Body and no body. - t!("[v][[f]]" Call!("v", Args![Template![Call!("f")]])); - t!("[v][v][v]" Call!("v", Args![Template![Text("v")]]), Call!("v")); - t!("[v] [f]" Call!("v"), Space, Call!("f")); - - // Spans. - t!("[v 1][📐]" - nodes: [S(0..11, Call!(S(1..2, "v"), S(3..4, Args![ - S(3..4, Int(1)), - S(5..11, Template![S(6..10, Text("📐"))]), - ])))], - spans: true); - - // No name and no closing bracket. - t!("[" - nodes: [Call!("")], - errors: [S(1..1, "expected function name"), - S(1..1, "expected closing bracket")]); - - // No name. - t!("[]" - nodes: [Call!("")], - errors: [S(1..1, "expected function name")]); - - // Bad name. - t!("[# 1]" - nodes: [Call!("", Args![Int(1)])], - errors: [S(1..2, "expected function name, found hex value")]); - - // String in header eats closing bracket. - t!(r#"[v "]"# - nodes: [Call!("v", Args![Str("]")])], - errors: [S(5..5, "expected quote"), - S(5..5, "expected closing bracket")]); - - // Raw in body eats closing bracket. - t!("[v][`a]`" - nodes: [Call!("v", Args![Template![Raw(None, &["a]"], true)]])], - errors: [S(8..8, "expected closing bracket")]); -} - -#[test] -fn test_parse_chaining() { - // Basic. - t!("[a | b]" Call!("a", Args![Template![Call!("b")]])); - t!("[a|b|c]" Call!("a", Args![Template![ - Call!("b", Args![Template![Call!("c")]]) - ]])); - - // With body and spans. - t!("[a|b][💕]" - nodes: [S(0..11, Call!(S(1..2, "a"), S(2..2, Args![ - S(3..11, Template![S(3..11, Call!(S(3..4, "b"), S(4..4, Args![ - S(5..11, Template![S(6..10, Text("💕"))]) - ])))]) - ])))], - spans: true); - - // No name in second subheader. - t!("[a 1|]" - nodes: [Call!("a", Args![Int(1), Template![Call!("")]])], - errors: [S(5..5, "expected function name")]); - - // No name in first subheader. - t!("[|a true]" - nodes: [Call!("", Args![Template![Call!("a", Args![Bool(true)])]])], - errors: [S(1..1, "expected function name")]); -} - -#[test] -fn test_parse_arguments() { - // Bracket functions. - t!("[v a]" Call!("v", Args![Id("a")])); - t!("[v 1,]" Call!("v", Args![Int(1)])); - t!("[v a:2]" Call!("v", Args!["a" => Int(2)])); - - // Parenthesized function with nested array literal. - t!(r#"{f(1, a: (2, 3), #004, b: "five")}"# Block!(Call!(@"f", Args![ - Int(1), - "a" => Array![Int(2), Int(3)], - Color(RgbaColor::new(0, 0, 0x44, 0xff)), - "b" => Str("five"), - ]))); - - // Bad expression. - t!("[v */]" - nodes: [Call!("v", Args![])], - errors: [S(3..5, "expected expression, found end of block comment")]); - - // Bad expression. - t!("[v a:1:]" - nodes: [Call!("v", Args!["a" => Int(1)])], - errors: [S(6..7, "expected expression, found colon")]); - - // Missing comma between arguments. - t!("[v 1 2]" - nodes: [Call!("v", Args![Int(1), Int(2)])], - errors: [S(4..4, "expected comma")]); - - // Name has to be identifier. - t!("[v 1:]" - nodes: [Call!("v", Args![])], - errors: [S(3..4, "expected identifier"), - S(5..5, "expected expression")]); - - // Name has to be identifier. - t!("[v 1:2]" - nodes: [Call!("v", Args![])], - errors: [S(3..4, "expected identifier")]); - - // Name has to be identifier. - t!("[v (x):1]" - nodes: [Call!("v", Args![])], - errors: [S(3..6, "expected identifier")]); -} - #[test] fn test_parse_expressions() { // Parentheses. diff --git a/tests/README.md b/tests/README.md index 429207a5e..91bf8f49e 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,10 +1,9 @@ # Tests +Directory structure: - `typ`: Input files. - `ref`: Reference images which the output is compared with to determine whether - a test passed or failed. To keep things small, please run - `oxipng -o max tests/ref/` when creating or updating reference - images (note that `` can be `*` to optimize all images). + a test passed or failed. - `res`: Resource files used by tests. - `png`: PNG files produced by tests. - `pdf`: PDF files produced by tests. @@ -13,3 +12,12 @@ 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. + +To keep things small, please optimize the reference images: +```bash +# One image +oxipng -o max tests/ref/image.png + +# All images +oxipng -r -o max tests/ref/* +``` diff --git a/tests/ref/lang/bracket-call.png b/tests/ref/lang/bracket-call.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ba46e317d32e270a09afdaee06ff21c764f3b4 GIT binary patch literal 22962 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 literal 0 HcmV?d00001 diff --git a/tests/ref/lang/comments.png b/tests/ref/lang/comments.png index e3e42d231772f3f0ca9722b56ed9a8676a6f86e9..df5e5b9cb6adc3958e350fdbcf248e59c423f152 100644 GIT binary patch literal 1148 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZ7jggz29~4q?17}Sr;B4q#jUq@E*35}5NUmQ zx$!RJy94hStPaRN;M*hH!8eD`gMEsF)dCi;0M7q*5@&CmNxQBxvy|hxo#l3#Z(l?zjK8*T->Q5i+H<#= zuBA-h+gk!1t(z{y8f_H_X`PT?5>xf}UQEm9h)I{0qt8q?xd84EZ5z41U#jU}$m#q5mZ3-eXV8^cOnU&Qy{`l9W;;Jk`wrH^T}R{fE+ zhtEX6R0~R0~9Lw^@@I0W1?Igl4q_eMUd;-v@&*MYZLp?VV<_C$y|)!AmRWlN~g zl#6cKtrWA2qp7#yopnj8yI{lHuN6Df*F3BiY4p1*;yB?wSNBkbrR96Y^Nill=E!J1>eyQeG5Bh9Ooi}LpT(R|OHd7Ys}=3MHj zbxRctSTtK2C+wT6*S)|E{|X2%l+kY(E9ZE{$B)JY@X*|XW^(?{;2ZL-;(TA^V=M1Y(=ZqhdzFPnC0Qk z!-vC_|J=$uH~m#S$K-jNj?4?#*UsQ5+H?8vcYy^_RaOV?yR{!~t5;;${X4q<#~a(z zc1;(S6xy0<$z8TPc2lf_oweim%LDAUcpYq4*1Y-h=GOY190wMNz35(aVVlM|fhn^J z!vg=`dMEns8K-8zvf$V|`wR;1Zx(Abh!grQdg1wXi^CI6-S14#ynkd*tFu+ zZlAvDWbKcIF(QW~roT+FuUqEKU-hjzMBb@mw&$+-cEMMrHl=gdy!jZlWB&JP^H*l| z-cREHvXjGsr#$m+?Xp#+Kg6VG|H|BqGY_|{cY|j50*ikl`xy-@XP$`Hxz_TX>?qxi+ zq`3i}Y%}8|SYyfx_GgF3<_f|)hqtKLK@bu*c0Y7dDr}Cxuk>UW*XFI;~R0;`IZZ$pS)=^JsZeK>2Q#iDe}*Laz4gS78Q>GMO$UeXFnxK9DXx6k)}}ds}TjZKOWonJP%a#)dxPn zSsXk>o@(VbO!X1<>~Mn?0yA)~PrPV{>ya8bV=WGT&_08K)MlV-kB|}b!)$2sNzd(q z1#{7p5}e?uZ!YknzI=+}KFZVYWrBi%nn;~s^n_69`mXvsVqVpkeUgl5zfxHE3j3Bq zQkln@*bV!z?j`9ls2#qK4~rVtk2ReAu0oK8wXk14t>~sMFJ21zDvn={g%xQD0w(VI zSjjeBgP*ODL>CN?({yd3e%0Eb%4}ku9J)6#dlli5f4@?~2{GfmS}OXXR2?0Ij7O1C zytK-Ge8^IqF~dJc_uR_|K(nW5_+*Y07B6Q9LT1c=n}H&uZ6KZTb_Nbg)-8`bDWgc9qVl@rFNRoRjfE1%!QRmm2J z;6g+yJ!-mg=#He}4-&CL?&Wc{0gD+o{rJ27kkx5s9)F{k)XP1H@OQO?wxn7wgYGrE zzuW8HQOOqDH_TJNETOw+2*>7 zosrN%jfB=4Zs1^eJ*q)-(h0H5;ZyHD^#xNLI>1!t9hYNd@!%4F!64;$88=E(q3`l6fEq`JnRlUjGaQ_vWVh@ z8mF#U>V-N~d%n!_x<-&Bw92o9{#pD;5O_+2TT$t+@zD!DNs%(OCnc;_j%`3odJF%3 ziJc3nLNYg2rbM+N2-n_+#77XMYLZ9Rz+WRVl-_IxODY+dK1WSrqY}|` ti&JYB?vuXP9JFx6^}k4cYn976I^brB*NrI(Px+QZZx28Bd-(A5e*yfxWm5nE diff --git a/tests/typ/lang/bracket-call.typ b/tests/typ/lang/bracket-call.typ new file mode 100644 index 000000000..642d6426a --- /dev/null +++ b/tests/typ/lang/bracket-call.typ @@ -0,0 +1,86 @@ +// Basic call, whitespace insignificant. +[f], [ f ], [ + f +] + +[f bold] + +[f 1,] + +[f a:2] + +[f 1, a: (3, 4), 2, b: "5"] + +--- +// Body and no body. +[f][[f]] + +// Lots of potential bodies. +[f][f][f] + +// Multi-paragraph body. +[box][ + First + + Second +] + +--- +// Chained. +[f | f] + +// Multi-chain. +[f|f|f] + +// With body. +[f | box][💕] + +// Error: 1:2-1:2 expected function name +[|f true] + +// Error: 1:6-1:6 expected function name +[f 1|] + +// With actual functions. +[box width: 1cm | image "res/rhino.png"] + +--- +// Error: 1:4-1:6 expected expression, found end of block comment +[f */] + +// Error: 1:7-1:8 expected expression, found colon +[f a:1:] + +// Error: 1:5-1:5 expected comma +[f 1 2] + +// Error: 2:4-2:5 expected identifier +// Error: 1:6-1:6 expected expression +[f 1:] + +// Error: 1:4-1:5 expected identifier +[f 1:2] + +// Error: 1:4-1:7 expected identifier +[f (x):1] + +--- +// Error: 2:2-2:3 a value of type string is not callable +#let x = "string"; +[x] + +// Error: 1:2-1:3 expected function name, found hex value +[# 1] + +// Error: 4:1-4:1 expected function name +// Error: 3:1-3:1 expected closing bracket +[ + +--- +// Error: 3:1-3:1 expected closing bracket +[f][`a]` + +--- +// Error: 3:1-3:1 expected quote +// Error: 2:1-2:1 expected closing bracket +[f "] diff --git a/tests/typ/lang/comments.typ b/tests/typ/lang/comments.typ index 56906d0ca..c5b04967b 100644 --- a/tests/typ/lang/comments.typ +++ b/tests/typ/lang/comments.typ @@ -8,7 +8,7 @@ C/* */D // Test in expressions. -[dump /*1*/ a: "b" // +[f /*1*/ a: "b" // , 1] // Error: 1:7-1:9 unexpected end of block comment diff --git a/tests/typeset.rs b/tests/typeset.rs index 79a884ebf..3eaca6edf 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -16,12 +16,13 @@ use walkdir::WalkDir; use typst::diag::{Diag, Feedback, Level, Pass}; use typst::env::{Env, ImageResource, ResourceLoader, SharedEnv}; -use typst::eval::{Args, EvalContext, State, Value, ValueFunc}; +use typst::eval::{Args, EvalContext, Scope, State, Value, ValueFunc}; use typst::export::pdf; use typst::font::FontLoader; use typst::geom::{Length, Point, Sides, Size, Spec}; use typst::layout::{Element, Expansion, Frame, Image}; use typst::parse::{LineMap, Scanner}; +use typst::pretty::{Pretty, Printer}; use typst::shaping::Shaped; use typst::syntax::{Location, Pos, SpanVec, Spanned, WithSpan}; use typst::typeset; @@ -183,13 +184,7 @@ fn test_part(i: usize, src: &str, env: &SharedEnv) -> (bool, Vec) { state.page.size = Size::new(Length::pt(120.0), Length::raw(f64::INFINITY)); state.page.expand = Spec::new(Expansion::Fill, Expansion::Fit); state.page.margins = Sides::uniform(Some(Length::pt(10.0).into())); - - pub fn dump(_: &mut EvalContext, args: &mut Args) -> Value { - let (array, dict) = args.drain(); - Value::Array(vec![Value::Array(array), Value::Dict(dict)]) - } - - Rc::make_mut(&mut state.scope).set("dump", ValueFunc::new("dump", dump)); + register_helpers(Rc::make_mut(&mut state.scope)); let Pass { output: mut frames, @@ -261,6 +256,31 @@ fn parse_metadata(src: &str, map: &LineMap) -> (bool, SpanVec) { (compare_ref, diags) } +fn register_helpers(scope: &mut Scope) { + pub fn f(_: &mut EvalContext, args: &mut Args) -> Value { + let (array, dict) = args.drain(); + let iter = array + .into_iter() + .map(|v| (None, v)) + .chain(dict.into_iter().map(|(k, v)| (Some(k), v))); + + let mut p = Printer::new(); + p.push_str("f("); + p.join(iter, ", ", |(key, value), p| { + if let Some(key) = key { + p.push_str(&key); + p.push_str(": "); + } + value.pretty(p); + }); + p.push_str(")"); + + Value::Str(p.finish()) + } + + scope.set("f", ValueFunc::new("f", f)); +} + fn print_diag(diag: &Spanned, map: &LineMap) { let start = map.location(diag.span.start).unwrap(); let end = map.location(diag.span.end).unwrap();