From 6fcef9973be4253e5b377251dd9d1921f9738fc1 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 31 Jan 2021 22:43:11 +0100 Subject: [PATCH] =?UTF-8?q?Refresh=20tests=20=F0=9F=94=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/eval/mod.rs | 50 +++++-- src/eval/ops.rs | 6 + src/parse/parser.rs | 2 +- tests/lang/ref/{arrays.png => array.png} | Bin tests/lang/ref/block-invalid.png | Bin 0 -> 507 bytes tests/lang/ref/block-value.png | Bin 0 -> 1367 bytes tests/lang/ref/blocks.png | Bin 515 -> 0 bytes tests/lang/ref/bracket-call.png | Bin 22558 -> 0 bytes tests/lang/ref/call-args.png | Bin 0 -> 3713 bytes tests/lang/ref/call-bracket.png | Bin 0 -> 1897 bytes tests/lang/ref/call-chain.png | Bin 0 -> 10171 bytes tests/lang/ref/call-invalid.png | Bin 0 -> 1905 bytes tests/lang/ref/comment.png | Bin 0 -> 1215 bytes tests/lang/ref/comments.png | Bin 1148 -> 0 bytes tests/lang/ref/dict.png | Bin 0 -> 1836 bytes tests/lang/ref/dictionaries.png | Bin 1769 -> 0 bytes tests/lang/ref/emph-strong.png | Bin 4117 -> 0 bytes tests/lang/ref/emph.png | Bin 0 -> 3112 bytes tests/lang/ref/escape.png | Bin 0 -> 4241 bytes tests/lang/ref/escaping.png | Bin 4148 -> 0 bytes tests/lang/ref/expr-binary.png | Bin 0 -> 756 bytes tests/lang/ref/for-invalid.png | Bin 0 -> 1484 bytes tests/lang/ref/for-loop.png | Bin 0 -> 1389 bytes tests/lang/ref/for-value.png | Bin 0 -> 1702 bytes tests/lang/ref/heading.png | Bin 0 -> 4285 bytes tests/lang/ref/headings.png | Bin 7415 -> 0 bytes tests/lang/ref/if-branch.png | Bin 0 -> 2040 bytes tests/lang/ref/if-invalid.png | Bin 0 -> 1343 bytes tests/lang/ref/if.png | Bin 3840 -> 0 bytes tests/lang/ref/let-invalid.png | Bin 0 -> 364 bytes tests/lang/ref/let-terminated.png | Bin 0 -> 1459 bytes tests/lang/ref/let.png | Bin 3542 -> 0 bytes tests/lang/ref/linebreak.png | Bin 0 -> 3668 bytes tests/lang/ref/linebreaks.png | Bin 4161 -> 0 bytes tests/lang/ref/raw.png | Bin 4459 -> 6338 bytes tests/lang/ref/repr.png | Bin 0 -> 8440 bytes tests/lang/ref/spacing.png | Bin 0 -> 3858 bytes tests/lang/ref/strong.png | Bin 0 -> 2810 bytes tests/lang/ref/text.png | Bin 731 -> 1892 bytes tests/lang/ref/values.png | Bin 8143 -> 0 bytes tests/lang/typ/{arrays.typ => array.typ} | 8 +- tests/lang/typ/block-invalid.typ | 37 +++++ tests/lang/typ/block-scoping.typ | 35 +++++ tests/lang/typ/block-value.typ | 38 +++++ tests/lang/typ/blocks.typ | 17 --- tests/lang/typ/bracket-call.typ | 107 -------------- tests/lang/typ/call-args.typ | 34 +++++ tests/lang/typ/call-bracket.typ | 18 +++ tests/lang/typ/call-chain.typ | 31 ++++ tests/lang/typ/call-invalid.typ | 36 +++++ tests/lang/typ/call-paren.typ | 11 ++ tests/lang/typ/{comments.typ => comment.typ} | 8 +- tests/lang/typ/{dictionaries.typ => dict.typ} | 8 +- tests/lang/typ/emph-strong.typ | 11 -- tests/lang/typ/emph.typ | 14 ++ tests/lang/typ/{escaping.typ => escape.typ} | 9 +- tests/lang/typ/expr-assoc.typ | 18 +++ tests/lang/typ/expr-binary.typ | 132 ++++++++++++++++++ tests/lang/typ/expr-invalid.typ | 59 ++++++++ tests/lang/typ/expr-prec.typ | 30 ++++ tests/lang/typ/expr-unary.typ | 23 +++ tests/lang/typ/expressions.typ | 120 ---------------- tests/lang/typ/for-invalid.typ | 35 +++++ tests/lang/typ/for-loop.typ | 44 ++++++ tests/lang/typ/for-pattern.typ | 30 ++++ tests/lang/typ/for-value.typ | 20 +++ tests/lang/typ/{headings.typ => heading.typ} | 55 ++++---- tests/lang/typ/if-branch.typ | 45 ++++++ tests/lang/typ/if-invalid.typ | 28 ++++ tests/lang/typ/if-value.typ | 21 +++ tests/lang/typ/if.typ | 64 --------- tests/lang/typ/let-invalid.typ | 20 +++ tests/lang/typ/let-terminated.typ | 28 ++++ tests/lang/typ/let-value.typ | 11 ++ tests/lang/typ/let.typ | 66 --------- .../typ/{linebreaks.typ => linebreak.typ} | 16 ++- tests/lang/typ/nbsp.typ | 3 + tests/lang/typ/raw.typ | 13 +- tests/lang/typ/{values.typ => repr.typ} | 9 +- tests/lang/typ/spacing.typ | 27 ++++ tests/lang/typ/strong.typ | 14 ++ tests/lang/typ/text.typ | 7 + tests/typeset.rs | 52 +++++-- 83 files changed, 1012 insertions(+), 458 deletions(-) rename tests/lang/ref/{arrays.png => array.png} (100%) create mode 100644 tests/lang/ref/block-invalid.png create mode 100644 tests/lang/ref/block-value.png delete mode 100644 tests/lang/ref/blocks.png delete mode 100644 tests/lang/ref/bracket-call.png create mode 100644 tests/lang/ref/call-args.png create mode 100644 tests/lang/ref/call-bracket.png create mode 100644 tests/lang/ref/call-chain.png create mode 100644 tests/lang/ref/call-invalid.png create mode 100644 tests/lang/ref/comment.png delete mode 100644 tests/lang/ref/comments.png create mode 100644 tests/lang/ref/dict.png delete mode 100644 tests/lang/ref/dictionaries.png delete mode 100644 tests/lang/ref/emph-strong.png create mode 100644 tests/lang/ref/emph.png create mode 100644 tests/lang/ref/escape.png delete mode 100644 tests/lang/ref/escaping.png create mode 100644 tests/lang/ref/expr-binary.png create mode 100644 tests/lang/ref/for-invalid.png create mode 100644 tests/lang/ref/for-loop.png create mode 100644 tests/lang/ref/for-value.png create mode 100644 tests/lang/ref/heading.png delete mode 100644 tests/lang/ref/headings.png create mode 100644 tests/lang/ref/if-branch.png create mode 100644 tests/lang/ref/if-invalid.png delete mode 100644 tests/lang/ref/if.png create mode 100644 tests/lang/ref/let-invalid.png create mode 100644 tests/lang/ref/let-terminated.png delete mode 100644 tests/lang/ref/let.png create mode 100644 tests/lang/ref/linebreak.png delete mode 100644 tests/lang/ref/linebreaks.png create mode 100644 tests/lang/ref/repr.png create mode 100644 tests/lang/ref/spacing.png create mode 100644 tests/lang/ref/strong.png delete mode 100644 tests/lang/ref/values.png rename tests/lang/typ/{arrays.typ => array.typ} (85%) create mode 100644 tests/lang/typ/block-invalid.typ create mode 100644 tests/lang/typ/block-scoping.typ create mode 100644 tests/lang/typ/block-value.typ delete mode 100644 tests/lang/typ/blocks.typ delete mode 100644 tests/lang/typ/bracket-call.typ create mode 100644 tests/lang/typ/call-args.typ create mode 100644 tests/lang/typ/call-bracket.typ create mode 100644 tests/lang/typ/call-chain.typ create mode 100644 tests/lang/typ/call-invalid.typ create mode 100644 tests/lang/typ/call-paren.typ rename tests/lang/typ/{comments.typ => comment.typ} (65%) rename tests/lang/typ/{dictionaries.typ => dict.typ} (67%) delete mode 100644 tests/lang/typ/emph-strong.typ create mode 100644 tests/lang/typ/emph.typ rename tests/lang/typ/{escaping.typ => escape.typ} (76%) create mode 100644 tests/lang/typ/expr-assoc.typ create mode 100644 tests/lang/typ/expr-binary.typ create mode 100644 tests/lang/typ/expr-invalid.typ create mode 100644 tests/lang/typ/expr-prec.typ create mode 100644 tests/lang/typ/expr-unary.typ delete mode 100644 tests/lang/typ/expressions.typ create mode 100644 tests/lang/typ/for-invalid.typ create mode 100644 tests/lang/typ/for-loop.typ create mode 100644 tests/lang/typ/for-pattern.typ create mode 100644 tests/lang/typ/for-value.typ rename tests/lang/typ/{headings.typ => heading.typ} (56%) create mode 100644 tests/lang/typ/if-branch.typ create mode 100644 tests/lang/typ/if-invalid.typ create mode 100644 tests/lang/typ/if-value.typ delete mode 100644 tests/lang/typ/if.typ create mode 100644 tests/lang/typ/let-invalid.typ create mode 100644 tests/lang/typ/let-terminated.typ create mode 100644 tests/lang/typ/let-value.typ delete mode 100644 tests/lang/typ/let.typ rename tests/lang/typ/{linebreaks.typ => linebreak.typ} (75%) rename tests/lang/typ/{values.typ => repr.typ} (95%) create mode 100644 tests/lang/typ/spacing.typ create mode 100644 tests/lang/typ/strong.typ diff --git a/src/eval/mod.rs b/src/eval/mod.rs index a43219e75..1a2116704 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -317,17 +317,11 @@ impl Spanned<&ExprBinary> { return Value::Error; } - let lhty = lhs.type_name(); - let rhty = rhs.type_name(); + let (l, r) = (lhs.type_name(), rhs.type_name()); + let out = op(lhs, rhs); if out == Value::Error { - ctx.diag(error!( - self.span, - "cannot apply '{}' to {} and {}", - self.v.op.v.as_str(), - lhty, - rhty, - )); + self.error(ctx, l, r); } out @@ -358,13 +352,41 @@ impl Spanned<&ExprBinary> { } }; - if let Ok(mut slot) = slot.try_borrow_mut() { - *slot = op(std::mem::take(&mut slot), rhs); - return Value::None; + let (constant, err, value) = if let Ok(mut inner) = slot.try_borrow_mut() { + let lhs = std::mem::take(&mut *inner); + let types = (lhs.type_name(), rhs.type_name()); + + *inner = op(lhs, rhs); + if *inner == Value::Error { + (false, Some(types), Value::Error) + } else { + (false, None, Value::None) + } + } else { + (true, None, Value::Error) + }; + + if constant { + ctx.diag(error!(span, "cannot assign to a constant")); } - ctx.diag(error!(span, "cannot assign to a constant")); - Value::Error + if let Some((l, r)) = err { + self.error(ctx, l, r); + } + + value + } + + fn error(&self, ctx: &mut EvalContext, l: &str, r: &str) { + let op = self.v.op.v.as_str(); + let message = match self.v.op.v { + BinOp::Add => format!("cannot add {} and {}", l, r), + BinOp::Sub => format!("cannot subtract {1} from {0}", l, r), + BinOp::Mul => format!("cannot multiply {} with {}", l, r), + BinOp::Div => format!("cannot divide {} by {}", l, r), + _ => format!("cannot apply '{}' to {} and {}", op, l, r), + }; + ctx.diag(error!(self.span, "{}", message)); } } diff --git a/src/eval/ops.rs b/src/eval/ops.rs index 56d6687b4..c52a62ca7 100644 --- a/src/eval/ops.rs +++ b/src/eval/ops.rs @@ -44,10 +44,16 @@ pub fn add(lhs: Value, rhs: Value) -> Value { (Linear(a), Length(b)) => Linear(a + b), (Linear(a), Relative(b)) => Linear(a + b), (Linear(a), Linear(b)) => Linear(a + b), + (Str(a), Str(b)) => Str(a + &b), (Array(a), Array(b)) => Array(concat(a, b)), (Dict(a), Dict(b)) => Dict(concat(a, b)), + + // TODO: Add string and template. (Template(a), Template(b)) => Template(concat(a, b)), + (Template(a), None) => Template(a), + (None, Template(b)) => Template(b), + _ => Error, } } diff --git a/src/parse/parser.rs b/src/parse/parser.rs index 2ca8eb102..b77677727 100644 --- a/src/parse/parser.rs +++ b/src/parse/parser.rs @@ -205,7 +205,7 @@ impl<'s> Parser<'s> { pub fn expect(&mut self, t: Token) -> bool { let eaten = self.eat_if(t); if !eaten { - self.expected(t.name()); + self.expected_at(t.name(), self.last_end); } eaten } diff --git a/tests/lang/ref/arrays.png b/tests/lang/ref/array.png similarity index 100% rename from tests/lang/ref/arrays.png rename to tests/lang/ref/array.png diff --git a/tests/lang/ref/block-invalid.png b/tests/lang/ref/block-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..56471574ba50561c10ec0deff6a94e113214a7fd GIT binary patch literal 507 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZ7jggz29~4q?12J@JY5_^DsH{K<2$k0L7?qn znS%@q`vZl-38f5tN{v9Op=GMUV+KxTM$Y?ko2pMYTIOt9^}BX`K^0fqe!VjtAi%dQ zp^<@!L!kj5@xLn|ZMTbi#F<6P9;VMd_`wr@nF64y^ENlxoLsOx#__qp58f4a3q z+5Oi0=CXRrjJf;vFm6%0vL`NwukVA6l+*vD7dOx8w=I#9N_@Xr<*x3h9e%QJW?j1a zRN{UhOJ@AJwCB5z2fE!;#~YsYT@Efl@MTf{`6v2D&knv`2#QrtS3j3^P6g4F(2QIZqeIkcwMx?>@|3Z6m?@ zU^8RRgggPW2Hq2F8yL%(H#6QmaJL~Z!R!M^&jZ18-JWXB2p~C!W)haE8nw|#&_HMiH{+KmIkj>}qjlXLv_(`KX87Dc~>%}d=) zC$s%kZkh1#ddYdicgKylTrSafTE&slSZVoT#Yt_cOQ|12Zum@F$W|cv{qdY^hKwNB z8|@{=CvW~ub2|9*e$W3C`O;OJRPcuQp>Rcwu0=V@VvVIf977JeO!$>j0-rdTjUt(ve;+-mu{5h zdATXA+u(uK<=E@@rn9gWSP2tCN##t>?SGnC6#r?1%254f|A9x;~6-`F^>FV@a%j z`!AXFCikuG1}P5vbb6*Q*6X?5e?lr(;jhH)cSq-yY(Eg7QnvVm4wEyli2jaAYYLUq zpD>?ft8mOJzfj-paA{5cdgIT(wwoz?o{M!Z%5j_YWtrhh+sF%(Rq+JOk35!1q2lJk zwpNF%uDkDEwkpk&!%5+=bIX;w`d{KK@r*m~D*upfFx&WPYr5cz0?A`iY26QsOPsg= zaj5rcnZED+?|thZcs!f#u<7JswuKGKmPcxz^tEkR9k;pA{jTrBusa5yo0f>RrR%dd zZv(1rtqs|6bg?#2h;v)>G-^s%;-)RS8rxXT zxjV;v_N0TGIhLHi@U1p*;vT)~*I|8gjJMRbz7BjZ9C0jv;!<_b`wS~&J-g?ma5@{A zNN#$!qP)kw4_5{Sr2%uNe9v>WLH1U*-3DvFMt$B=y=dJma2Tn?=Wn-rBlzQ5SZdKsyb~B1urR&t*#`834Ly=3%_txk-%}X0@ zZ%fXOo;%^GyX%cDveDvgv0rD!inmSv68Y*;_Su!zdA#Q=pWmsub}ze6CdpoN-d67U zx3|UgaHwpyneZh&(>g7{hiAR>oSn|@mljoU=T}CBAKuKN!ppEg`R0RG9!Vb0*^DPH zz4H4d$s)erYxmRDB@(@JJ&kTOKFRrGHS1RF=6O1t_zR~{4oGI{`egB+k;i1a?EbB5 Qc7jSwPgg&ebxsLQ06#BGZ~y=R literal 0 HcmV?d00001 diff --git a/tests/lang/ref/blocks.png b/tests/lang/ref/blocks.png deleted file mode 100644 index 8dd7f9404800d9344d506d45b673559d9f9f898f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZ7jggz29~4q?12KOJY5_^DsH{K?OS@tL8R^B zYlT7vJ|Xr84OSj9TlkFlv=mDPWKv{$T0A;h)^{K3W8K^^ulW7%yu`0EX`hV6jg^34 zk$Uh32cX#k_=uKz*At89E>iYMyC}FMH+He|pIT{zj+Wyb(OxI}G|x^Hymq_&ULB8( zS2F_>he88Z;?QnEm8l!w+k54-+~hmFbfc+>levdh8Bgy9?@4;wTJH&~cuqe4HK6-K z^`4Rtr8QVB3Cnu6((PyOPAfiVY1DK*{ft)2 z%eWV|2eWb53v|#P@r5y$uRd11vYBJjwu@)hd^Ou2*1n;>WU-J}Riu{sz*LMME zUze+Ww@&4jgSVe9EDJiiCUy_w6{VclcXo!XxFh_{Sz1={SH%0=ebMv9zV-!Py4OD` z~VbjJl6@+CPx}q$mBk&#Tg7Bi4RdM;3#1K%d}>iQR9qeQ&1E$ Nc)I$ztaD0e0sz*Oxz_*y diff --git a/tests/lang/ref/bracket-call.png b/tests/lang/ref/bracket-call.png deleted file mode 100644 index fe7f24346e676122d93202ffc7a3659bf0d36774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22558 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 literal 0 HcmV?d00001 diff --git a/tests/lang/ref/call-bracket.png b/tests/lang/ref/call-bracket.png new file mode 100644 index 0000000000000000000000000000000000000000..2f020629ddbf91f0467f97fc717e5feececfeff4 GIT binary patch literal 1897 zcmai#`8S)19>!m)^-}81)Ka&*wh8qj)8|Vp7C74+{>KO7G?TEu0-%yFraFu%9AT>z7cHT z8ag%tgmw<&UZZfJEMEQJBD{NkN%73d=D4+UJ!T3&Dh#(gi8?KB_gDc5|0aJqv~uRJ z;QvRMVkM^jOS1jw=HR;X;_jFw5DG^AQ;D2IDU*okyxtdAv}CLc%^n`|)Mn(I3{X+1 zH~aB$r9|f(okW~aYR?2>KZsu+a_U}~yX<5haU{%_1#ZXh@*b8qxqwL@(H`EKR$^43 z;I4`Sw47ie#`{D(XGK{~#fyKCY=h}jR&wT_{eAR?qwXF3fbn0!hSwI~zq?e18cy$4 zca}kf7AqzzRT!1Uh@lFjeK<(m|88O04V|Hv<&6^u6I*(tqXquR%~wj0at6?72z}a> zP#?YD_T;<<|3l!}e%Y+?lh8&8p`u#x=UHDLnQR&r-*1|=cM*uc;-)!glO06eSr;Um z`*}_=p`H~ikmPF`a79CBxX89!doaR7I#+_p#u_VAkNx2>XWzkqdOP#X85lUQ>U6?o z0v20Af+^w;VqxAEoL|Gz<5T=hxa`P7(`zDZbL6ag`&1?_%x33a{^n5 zzP82*o}5mI23*)`U3rJQ?}Yj6Z$od%xOzzk8%&X=>VW+D<;dBiUHVBC%2K*WWSNbm z-Yolf_A0*&mc?YA1vUF>jZ@#-aI#yD1jGoI-VC?6CU#k){1YV!39l`*@|NV*$F@h` zrAC~l+GNNqR)bLUT0`W2aw2!-Dli^pyAk02ipOu0#~l)PNAJsc6Z*XYssmJx@GNV| z{|(5xnXoTcF{vYB;Qo-*b7Y96$n6gf^HgBI;UUF}zVr}X5EtE!$kXYA!)V_p?U0Wd zJ^DC`%YUzMAJ{1HDxkMS-jv{1QIY<5Vfs~4&;ZM*O`nn$U3XVFZnZk!1dZf#9@PvV zoNpl(4?+rqDE;J++GRe7`{{V=@^X`i;?_^Jq&0zf!)i8(Q@jqO~8}n)#G+HlY}n`0Vam5POl>L zN8A4OFp0Fsj*J+KOSSd$1m-Y}irE#ep9jmv1#GoB%%C z8w|dHCh;3vA4#x)9186rXD6(}9O9xR$(i0Z0LOwziW5P~7|ChK*jfa% zE_dwM+alPD95t3~>h$etHCOk0%;CIK*GdDGrF%-Gq77_$s64~)ZKW6Ew_~-(ShT`k z+$D$ju>x6>x~s!MsWjVjAl(G1Z5P)uzb3*n-DSDI_$R2ALj$T!h)T6hV7yR~HR6`Q zzFzf{Cse5j)gJxX7MHd`N|3RuN<5EMNH2y0sW*-E3Pz1^{#-8~vlkm#W0eME5+aM1 z4b2Bj>RJO9PX{0b`m2$1%0g4qr$I-h4y4GhhwHTi>Wp(mc&~talU#O&@R!MB<9unU ztVVXkj`_RP5Ch84m(r~lh5B<2+b;{v^1RWK@hU(;to*tjMfUkEA5?FO`N949zooh` fPZ;|qF=GGd;#5-N!wmBFe>c?LhDfNh3Sj&NtTA4m literal 0 HcmV?d00001 diff --git a/tests/lang/ref/call-chain.png b/tests/lang/ref/call-chain.png new file mode 100644 index 0000000000000000000000000000000000000000..5c90dbd806899c8d682e276908f5ae19bf03d944 GIT binary patch literal 10171 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 literal 0 HcmV?d00001 diff --git a/tests/lang/ref/comment.png b/tests/lang/ref/comment.png new file mode 100644 index 0000000000000000000000000000000000000000..79f438b2fcf1b1008c18376c89011d86031290d2 GIT binary patch literal 1215 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 literal 0 HcmV?d00001 diff --git a/tests/lang/ref/dictionaries.png b/tests/lang/ref/dictionaries.png deleted file mode 100644 index aa40549e6cbddb34f877d45ed5c947c4c5004917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1769 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 O3xF}RF|9LkkNpp|$i#&J literal 0 HcmV?d00001 diff --git a/tests/lang/ref/escape.png b/tests/lang/ref/escape.png new file mode 100644 index 0000000000000000000000000000000000000000..aafe09eb2e2f54cb0e3cd3fb08f10886f57826b4 GIT binary patch literal 4241 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 diff --git a/tests/lang/ref/expr-binary.png b/tests/lang/ref/expr-binary.png new file mode 100644 index 0000000000000000000000000000000000000000..6c94ef9b0510f08dd28cc4ec5c77ad07bca114b6 GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZ!#IEh15eQQc?=9pyFFbTLn>~)y>YR3wu4CP z!~M)J4!k??F5$(2mklKi))M6p-hx;L?;3&<{psz-OQ$hBU9T22Pp{(jE}&XfKO6mTn+2vQ{(aA(70;A7>%QBJd#`yfJ=T9E zcXiUVm#Y;#qV{dyAU|L5)kia_*;|?ecRA{FN_l=RzZRq#HCNI7>mA40%#C%oIZkiv zlbtW{=*RXIuM;O!-8jB^?k%g72~!l9Raf1f;k-Bbo)puC(%9=)Uw$i)SkL=b*optF zfxzeKc@vh{8ocI;ymeS_{;Llx6E4YIJuspCwam6o0nMldkxLj)F&|>OvxMjO);zW? z4u^ehMS2hDs9Jb(&eFW6zw*&k{ic8gZ+E@pc+BkdWy`J$8C;h=yuMgDy{Xydq`mal z>W)`YVjT5b@79$0N64q2{mS@I>T^G=m@Ru!U*&oZ@qp z|L)E0jb=8R`t-@0z*)%S3=v>mQ za#C<{U#YC3dw*B%eon6q{|o=$T+9Eion=n?+y%9kpLZ>Pd!zYEK=^uDnfP;sGaVW} zuVH!n^wPEHuNU(EST9_eY@NB%wEdUC^~dc$RMz~y=V*1+{?Zn{m!cf2(vQE`_cbij z^|n^ilBMhxJzvAmFIm|rbG&`V->Rw=z6;*51T)QAbDbmm>kWruZ-vY|x5OVuM|wq0 zx0>!b$*c46`>E?#`%it%3e?H`XRdqjf20xKr1NmI03@l&Jb(L#>Fu;Rg@3+i6@Zen Mr>mdKI;Vst0FdupkpKVy literal 0 HcmV?d00001 diff --git a/tests/lang/ref/for-invalid.png b/tests/lang/ref/for-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..fa65f49573239ec28669e8a089cbd69b12b4a69b GIT binary patch literal 1484 zcma)+c~FuG7{)(XbiW7{Mya(t5VR@G)LGUNWk9@39YQ?N@>r=fEpao=$u#OiH^VE; zT0ElCbal-R32QxT3|k{xNZl-;OYvCCL<==#ZFc|Mop$D#XMTUZ^S<7eY{vlhNo07(=G?B<-Zj2dTAWo9>B8KQj9u} z5~1FpxW*~QB`~{m5So5#Hb!KBw^-Qbv25J!PTfUJ3GE40MGzMnO08sRpQU|p?dCV# zpr6YLj35p{`2Pq=aNCMrf7YYsSHD`;!8yef-eHdb9;*22`Y8pa} z4X6~^KwjqV{P;@|;#5&7%ia>NJgU2nDk{EWnHMi#YL4})C-snQ6`c)r5lb87lV!U4 z$F=gBtlK#c!>q!WI~K9fpYS@8t+<&rx8&oDEe+42)1F>*sD1*QkB9p1L@!kP0%XZY zRdUj9QOw%o^aT2OjStyqEUbUYdc9Y@1@-Vj2dLJ?cy3%$Zc|OPj#J5B^y2~cASw9r zCpHvg6h!2?N#@(g^m92LIYvD3<1|p-$${!p^meeFj!+~XLX2oJh?0i+E=7+8SmIMtSP%b)Vy!x~k zs<_ck=sJR;8TM;V8Hz-42=NY(+bNnErZlbW+b7uLwl&#H7&tA^8a3^d%^Va9jHKTPiDDxKyM`1vuKc3h20wh;+7cX(?%eQ8-rQm{}v-m6BB z9?KZD`cMFrkQbhAqRX_^r`zp-spp*o6NMu>g&KW4kgXIjHl>Pe*`41)*AroPE}J@W zJ+{kSyrSC{WC#t*_1~`fJFF0u546bD7{$rlx8^r>E3q7ciJvN8huC1^1YNBovP+a( zS1I_Kw&5)t1D3ZO<(7moO^iysO03ubfA62Q1pF9WnNya$bZa)(w{;?&HB8`)N1g9~ z?0wF+0rxuIWJE5TC2`xD$T?U?!HD literal 0 HcmV?d00001 diff --git a/tests/lang/ref/for-loop.png b/tests/lang/ref/for-loop.png new file mode 100644 index 0000000000000000000000000000000000000000..2f13985ad4d276b45ce42351a5d085ec76205792 GIT binary patch literal 1389 zcmai!{Xf$Q0LQJ^Sijq2Xj^<&O$a7-ML$<4XUBBMFU+>rF_4y0l$wXJYin6vc001fkN1Ph~KwzIg z3;aAlp2yH`0FXaGzE^4_$ux9LTykyRxUb z2)72yoD!cSo-tm2$V22u1Y-+zOAcVUN|PkTV$}8g$49RWxXoXFX&soApr@Fx;F!W{ zg08NQm6X(Fa(%ZzvMZvh^7IwQ=3f84OWJbEeQkq>Xm>BgsX9hc+_q@kA(2RZaS4G= zDJF9lyp%)+{fh4x5kf zdiYw6q6np~YTZt;95~TWgV+(Hr6g#-O=TsU`)S+tNLn}xBQ&-;WrgPi|J}LZ31w0Frs6c>z|IX3J*FyDgaYU(b+E+x&*PInc}r^}v&?|{7L6MFYC)|k%JtB2@Wz4y)UxgI6v4HNzGaFTnwQjn+^H}RX;lEZQk;{Xo9}FIgOG*91$vBY|%L()ncPD+>`O%hTS26!m{Mr)QxVgVlZ#C z57t8UBW6MB`$Py?weLh+Y@o*0jz4KgJ^u;WMwmU0aVxXM!M!WcqU0JXc&a`vGSu3| z|BkZ+bTuoTepEgaB>{i>VQDU*8R-&b=E$BRA+pN8d$lzkp=$!7nS`p+Tntqbln*8mLXK&T*coOR5Zcvgsmyjq-fVyI&dML0DCW6h{vk%XKa7ex;g+ zOr7#!4Vj=Cyvk)d$cMjG1%`sDafg@9(`9TomZ6WzKNXQ0V=vLlY!zk2Mh(-GU`s<) zQ-hs_k^03C2OEm;c%ZmxBx;7^{*L^?a#HMh5c+b9kMr=i)NGq{P8kE3BR5y|BeIE4vXRbs-J+H3}b;tnp%LMZPUf}gF9VIxp K;>xj<_`d=3#*hI3 literal 0 HcmV?d00001 diff --git a/tests/lang/ref/for-value.png b/tests/lang/ref/for-value.png new file mode 100644 index 0000000000000000000000000000000000000000..fa323edcd1677a9c5d422a3257d1711a5cd764f2 GIT binary patch literal 1702 zcma)-YgEz+8pi(|5YQCC3#Mxd$f%Q-jHvaJfCvH&nQ2ZrY7UmEC5eWTiFw0FvqYRR zFC});bhgpT%9YX_8MCm9VpFWQknmb+Rty7`v+L|R^L2L5`JMMX-=1@RAD*`~BAj7m z;bZ{-fE9~Liv$1=WG(l=*ABo_#c2Ql%4N|)_8cEunw-pN^0zaassarHgaS(%lnv!W z{fobXE?M%{G7enQh_q9T!Y=*esKxm42TPNw%Q>~ae@D-U+TvVQT;cuduBdr1!qd}W?Och;+6PC zZ#d-6syOEnx^jpM5C5oOcT3tw{5#DaYH;-qy^Y)gyDTl~9=<`o0=zPk7Jv+Q)^l0w_uHfHjq3b|La%V8*d z8`;|x%jS-Ea)Y)*wdeaf5fj@`C!+Xyrk4l}&S;U{s_GAgAC2#wa)Yp<=?BLIx%}2W2!%8g-N>;-Q|!|8J{nL z22^h=%n|XgV>r&N_gtY>EJO-E1b3{4KI)L5%hPplI_<3(;xaO=rocv$)o_V>022_( zr0xezDTrU83bGwI1C)_5^Hx?mP;=-EMcfyXc?_1S^#Y=e|J2RMur&liS&N|c;&>-X znp#G!Nxb5vWp&QG#rKGjbvVhb?lZHx+Zh2`JXEo=X%E1qujBWB+_5a9l z8=m`8{BZT1#}(FKM3{7MoHD?tYYBnhWnbiewg>_SYXMc!=z_e)WYVqM`ay-G1V;E*&CHH9G zBbM*NZ3B-Y)0{d4uz_LDU>0uo;)V^0(I0|ElWpxNmvTz@*2j885o1Gd5vAH)T`C$4 z?V9yrm*kz|@u98cP)t0>fa+G-W+p+DZZo-XG)Y~$)v!@Zqcw@`1(qBmN_1;Y@JRjk zBU&GYh~ygh79GCxO334^M49{D@wWcTWn^UK^UHUOkANMoN)HBZwH%l(%Z)N7#Z-Us z5_`R$cFz&6gqp?_U-v4H7e2|tfyZXaZgvxsmr>4z#*)$u7fIFu@>Y?)}#knG!11kY+H5@#P zti99B#OR26sX?_}Z@VzqeM4%?WT}O(n1ubg=5~w`b5lhV#;>r@o(dG%_RT& zB(=u+@L{V%hZx3zR~ zSGQoh1%EpqH}K9N^3klrI9~Wf9!k%%!)lcI)`fa|pj#5>CCm?iyk&eVa7~s)$$eiL>!1KL_uq^RT?%NA^#|3tGXB>ppx3|LqCcO+SCf zM*XBla-M8XT~O|;;~f^&;;-?N>6n0KF@R9dg?W;wr&Ak+hH8mxod#EKTDo))Cet{3 znx5wjouWhzmv8zF{t&i5r31a5zB95L4f YGms(+N26DI{&+wvdN{3}`fbsF0Dm3v)Bpeg literal 0 HcmV?d00001 diff --git a/tests/lang/ref/heading.png b/tests/lang/ref/heading.png new file mode 100644 index 0000000000000000000000000000000000000000..f72806ec9e939921ba0e15f56654afde4762a635 GIT binary patch literal 4285 zcma)=c{tST-^ahU`ZCf?w#hz*Buli2It^y5$#M`=wx+_*K4KI@wlAH7V@V{t2xVy^ zWFIrdNDhS=*@v|a-j z?kHXqs1IV{QE*7^2hCi5!db4;^#qNUR)B0wc@QH9HKQTq|DMOzh0lM-Y4QENGFt_7 zIPmiu@Da4rs0AxzquV(y-5t&Hy?G0lK02Hemob!c$bTv54rqT7jr3NrT&}8t9zRPE z>SM+xJ(Cw98_#mRIA^@17(ti;XPVvXd;UNTb8dJfasl5e4!=SrY%)V$^oBqja&Gr6F(8clpR>ud5+GeZlt$zl_~ zGpmq=a0!4E={=-^H5uaw@CX|g$^1dZKLm9(JVvh1Fy2kjokzD%=vhgt2Fkph}Vee3G> zF&%sl69C|hZs~Nv)zb!c9umLAY2dw;uK*P5e)dLrOUOCHiH&k4VI{T1`<-YelRB8UU92t+UYx)q;R6 zVXWtC+2^2I1kHMr2^u=F_^jW~CE)P(bTzn?nkZ)c1P#p3Wa?~pUF?ysVJnKU1@m1A z0|m13_n)}dw#(lKLTWjIYoq`@Pmdf;FaS487$BNK#heD*y}4#hkmLDMG|DjN3c^Z+ z*7lUmESxx0uuvO!wSw&#Fw+AECSF{E4wkW*(o?4#1Ni-rvtK9Bx0K=gw87T09XcK081 zl{EzG4v7sArv%!#8Hch?VB$3DVmI4@Nih_Iqt<12Lqyn9o-dQ&0uP2B)5Xi!+V=Fz z7wtq?2bC*j@*O_^ltKQh=zq)RK^TT(p)ie z0~M_;diDnS~oq<$Ijz%$vu43Rpt=A5VV`UA*oQ@U^+W4pDo^@U?;re1b&*#c;!iJ z0F8|1_yjqYmMap1p4lvl#!#%)h{ zsbU8QC#s$|O&>>5#_XI|Sn$NG3vSyIv<#)%2c2io_nlZd*2A>PMg+FWyX@4V7)#v_TaNjBO#1O9sR+?Y|vtV>+lD{GE z$Myq_>;LyVxMx{AQkhymTSU1$1nWY zb>s9-)FnpL(yJQx9<=GFO4p@KufFqf8m+@2`uB$W5;6Oe6&qp~ z3&A1>t>AM+BW=KhbcuuKUFWCqEBj$&e<$uB*_2Qp`>-e!wfKO8G3YmJry?XA6B0?e zJ53b?y#3!#UCY(zDYS8FIvvzLI8qne22XYZCR{n-T9BoJ&a~F~>^y0nUmwA;I~)yV zxPZH?&x&=z1S9QKn|=8s-x5;3ewZw+&XFw$AU+XFO}UlcPD`Y8PHkVh;Xm%bXN*O< z!>HG3UJ&P+;OH@KQ;Y5Am7Hosa%#YzF+IDJ*#XMVy0cy4KSu|*t)V^T_TS3fxqup6 z)KUxA{mb(%o_9PAh^Sg28&2Sd5CMxlV{lb}zsHm_P(8BJv#eKPO9r7%X-L$pUiSqH z=uL{5tnWv;JKxWrou<89mLa^gsfdWfW_-5UcHnu4*g_2mlxjmenBYwTKpZFMV!anN zAg=S5rPFlKFKtsVw?Z1DyJH{Vm8K6uLl4q4EgQJ!$(cOweFa?>kvz0dJL{=$7ZMFY z+(-XA6r?<^=&WBtmZ~UI`K{c;ZA{fk>x!g53||6zIzyKr^DM4}azJV=Vgd#*TpAu6 z0t6Z(Xdk})R)OxV%(A0L<{UBxHeZmSG^`deQp5F$m_WxK54pz%g^|@RqHCSSJv1Fh z6jz74!s98OKZ9?O9ORC}v$z-eA|0E2>SFft2WgfMdMjEr8q6+4B)_UP<8^q3OfRZA z!)x}*kmJbLb!9}7`vd;{6_a^s!N?-ZMk}oob-_D>)jHiD;13@ z+;V0EaIg5_ zhY#{aRZGa?DA06K^%fdYX*YVpQsgNavaQ~_jtF%lXG7`*r=fE5kaLv5uzVoUZadn; zh+*WSfcfRs{oNaYRjvdzPJgD;I&V4XYKnb|J$dv}K=S>?LDpN;Hw8aQzKZCzTQF>Kmq7G-yWro%+H{!b@yFDSaFMWE| zMU$G+q8cUuu6=4GFPUu|h5mA>T$79;ZYcBKn`%Arn?Wi4(W-8AvPm9bKQjh5X=%+J zE7nB|J}aqPqPFHakJFQ`ufOm1aNb$`L;^u4V23x7s~2=(%!M=3n`aynpb)WQ|z#?AZ%HPkn zaOPpQ1m>@?^q0G{8^=!Nss!^loBDXPH9_tEcZVnS$V}%r3U|MeeY^&ufi7pG5!PHK^T*IDy!o~|{$P(?xWUrpowYj~Y09>$ z+-1ul<5D#BgL%?^e(y?6YLSZ{bkFP$FXcSl{wKa)N;4V9@cQx&6V>aWK? zdQ)fuQGLS!5w9mhXN0}-m?Y<#C&^K;GjrqnmVe7_feruWdV9s@ZqGM}eHp<}h6OxC z?-YWcW!miR&ufbT1l;^Oy<)Y|1aFWEd~u<6m4l%{Jrm2UZ6{q!I9<-+jVZ0Vb@7eI=OMOPf9!eit&E(lkQy4dMSbrGGXQkef=C*%g!nCS~ z?y{olLQj$Mf_=}I!eXuUGHzzyHFNW#q!=Ww5QU^W_-6>E^jqH+Nkqc0bn$*xfm5i; zsK|DWk=b&bXZDqsZMra8M>k=~&;vAfG)b(*D0VKTktD}9A1cJhel#ElQOb|t^6BqV zWgdT`QjX;{TOw(adgd0Oj%Y;~=|2^(*jO3O;{$HbocvM4#G%l8PpqkTLW6jj^-7*M zGXgf%nO$nj!a~8UJ?5gOW{+haO7B}c9MvXW<&H%z7;;K!F26j=L5zeno#Zu^&-yNG z+46{pJLsOb>JIW)4qm!1AJxrVA{e#ua@X)AU`aybXw=f2mk8@59)J|C-bUuJV$|}b9#(HFT z13?z-u~NtKb?93iQ-4Q@SByQ%)Nax`TATzQM2F8g-!yi%3My$5V!;?L61I6c{H}ec zMzg{_p*y)+PMno3?Xv9cP6c}3b$rcDZ1j5MQ?rKb5eR!i*nhkq7nX-~}-`e5U7Zj1PpkyWg}+IJ>9_q!1% u(Ercv3-jrp|9|=!kI(-XlgfFhyIdYBO*ob=zVh#X2~$H0gG%hxsQ&_3UtCcD literal 0 HcmV?d00001 diff --git a/tests/lang/ref/headings.png b/tests/lang/ref/headings.png deleted file mode 100644 index b1ad336668b723e40219f7d3b50e1ef88969b818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7415 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 UQ~kccKYlc|)O2r_s@UTH3!J85NdN!< diff --git a/tests/lang/ref/if-branch.png b/tests/lang/ref/if-branch.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb852968a73acc8d9fac33a4e60dba23a497cb8 GIT binary patch literal 2040 zcmah~X*k>Y8jYgBdx)KgT9Q^V>0Q1}J0ITX_df6Q{63s>-uIjY3v&!VuLLg$1mee<8e4)u z99-;j1lR*mlH%3^2*mRiYiwv0I=MAN^($%+;hs<9=mn|%1eW2{;naB?e0m)`DXuL3 zO8f~Jh=B;Vhv~y_4FqqE%93;K9}gb6de_@`j-h~t$jb#5^1{4vs23JeU=a}%Bo=~~ z;erB&z*kz90I>V&S;D-&zRwNOI;34HK;Qs@TdlZ=0-<3(LOPC$rzT|jPr_2`p06De_0o5dOX(9=-@HCg?N!@0Eb^=;O9ysks0GK)fG z00He>fyK~f%HiPY{Mxp?#%>F(L<9PRb`ve@yS4Yc4yqxnwmkR`kCDF#Nu4IrcWEn6 zUIOq)!t%$(4yXI5c}_l$!6+-5ok5r_$AgX>1sPUv=&07mYL(rn_T^d3Rc!RZNGx6H z%vV8vVS&*E`7bZ>!imwm$lSPZ((<1l4`C^Xj}mfJ9Sv>9tTYOTC%uk+KCfwW&a54l9q z+s`~#U&($53K7n5@L0FY=gH@gG;LigGY^>aA26TnaqYb&%2S--yhApl^{sNrNITk} zl`NZ5`=Y1W=*_P|?G8ck6ulV?NQew-Jtp z8zqU~LS+rmNur6bBCno2IeQmpHa&S71aQ~m(Bojam1U87wur${>EG*L6HO8TJ{O;4 zqcli^-VFz1m=N@tG;GSkzAJUsPSzQLuty}FU`lIf-CpSqhi|G~nKjnwJ?K!fLyhk) z8dnv$ZH7R?*I+1!CQ1w z#)yLA_cWP65@$@ra~F9jv#ps30B@|INxc$fu~S5{H9gfjE}WR&|P4 zKTRr-#TFqCkNB8{y;l?|OKYu#WMTRtulf58Y+=vrX%%I-(?$Z}QV!jq2#ql;d{_WUul z|^s{n?r=%T0U{ zZh20AOn7|=m%rgk4|hJC%$>fmSOXp{XnWJe%HNU&-qJN!vUeT?|R3t_W&q>ROIuGWptqqLO5i|jA;(;(H z^@lmvy%l-8@}_~mHtn~P&b=+s$6A<|rBZl3CTT%C-*_2%opd9uJE~bMmb?|XSKPEW zC*^G7b9kBZ&q7@aTcw+uQlGS)Sn!^(c}jLt$L4kkf;4?SU~aLhPM{B)9RCtfD9e-@ zno_y%KCl{o?&*tlWEe&-NqHwmX)+3SarrJlHLNlFF_68O|GQbsrzlTR&F%r?C9yolrCn>_UKk}5T?=RCR~i)(nvUG@+sD^6LtNl%?~bHVc|>i;GgMC@SWhs#N98xkIl+bG zL%E`T6Z{%joR_UFk5+><%VvyB*YhLnA$_7huR2AWPxl@bbcbM`gk>KBp!d3`u=*UO zE9#1-{`zS55jN?H4m_dE5Vh8jhwtYrbc~v)Qut|dUF6bkz??LcS@WYii8$EYa?smy vDJt(}XQfXq?^iR06%G4e(8>!(pFiPTiXHDOxZiu>OQd7b=EjvMr`SIM_2rLN literal 0 HcmV?d00001 diff --git a/tests/lang/ref/if-invalid.png b/tests/lang/ref/if-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..319fbdbdf0b5a34313992db647cc8345d4c35431 GIT binary patch literal 1343 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZFLMA11}A-^uM7;VY@RNTAr-gY-g#TN*g%5i z!CMBa1F|#tT-g2Ci`bVmPv`SsU&6eOc_*`10H;>s`}PYy=O*vGVLn~r_U?M8A0J%$ zRTZUO8y0DFfl!QuU1W;_iz0_3hm$~)0P)O2VFDtqfgtpBb;b=HVof;YuUzo5N2Ncu z>e;LU2LU@KwIR^Hn^Bpc-wf^407Ov=X;L{t9JEkw@%N`W4 zIaI9dQn4)S`+HdoIe0ZF`p_FCP$1NY*MeQ3Cp6(Pqx$^d{ z;m-}jVu^&A%P z*f%}4=jWaht4D83PI2sS+kWDb=eqE<`qS>UZNL0-%N=H?tiaF=;hAv^3*tP4zHu>J zzQmN_Imw+NL)p2~@bDeR70xR~TX-2h<+QJCTg|Ye+Tn%ao+dF!N1R-qqxA#W!Jvz{wEviJABBZCbrUq_HHm{6zjO7JngM zrI!Yi<|L*ZQT)#At!b#c|0yrmp{mgSnRBjrFW>F(!Qxnu>ZhfqCwVR@Pv|LlGNYfZ z<#XRf(UzjCEXusb`L_0-f>?}X8s{;4vi{L_YM97fv(lox zusous^>H`{TYg%an4a^3;{{cReV?<%nfrNE`+QkyS<_`O?b=yx!DXu)OK&S)ncBRR z;c?HplAh-reLX*4Eam9gK2N2Z*Xh+gPdUTMe9SwqT>T`;WZT!-V|?0V{eEQ@p6^W# zYVEsjAAIiCD0TIWzu+YHTe9C&f?H!{_hs-^GpyKseM@P}9sOGeudTA4E&o|QSJ;!S z`>FV(g>z1%uy;Rwk@ED+*CQE?K5q}6`Bf_ycgJ=9hyBjK)c)tZN_SOw`H8(R6r&zk?8 z21$zPz>v1!D=wlAsd+xI$LUdoZ3oe-6tGf#PqG5Jzs2!#TchNV~g~V@uI=Y47TURj;lq)-+zYay(I@?f47fJ<+dAN}ldb&1mTCp6yXo z#C<*YxkpiT{15q@mFv=Sd#RSx~rZ-N$EHIwd_&C#4-!m{ZssATkX^>bP0l+XkK DkJLiJ literal 0 HcmV?d00001 diff --git a/tests/lang/ref/if.png b/tests/lang/ref/if.png deleted file mode 100644 index b763034f288b0818f23c22f4a836031948fc30b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3840 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 JFwo8s{|0?PsU-ja diff --git a/tests/lang/ref/let-invalid.png b/tests/lang/ref/let-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..19d4d545dc9d32cf399f8b0926114b92ae148f04 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZ7jXayhNi$b6M+K8o-U3d6}R5rImmg)K&0WJ zdDrYKfp?bNJQ8?`S4L5}q=h4k&q>tL<;CxR+10-)I8UkyPEzr_)c!Tav4Me+iG@Qz z!2uiN;d+kKn#2g&Q}A8AGhE#bw~VDzET$Bl>j{vT|8B;!?h+1D7@1n) zl|6tKzAw&c!)G1iA$!4VMSE1-GmdwxxGDIo@>Ji2eE!c*og~(G+N^EJ;mDQSx`tyK zbIZkDJ=fN7m>v7AawYJZ=LU6$iqQA9w@%OfEZy??@rNn3mTy#WddZywgt^PZ~l4C_xYal{PBIx`Ft;jko=AGk@^4t z7zGC4LID5*UDq?<`T&}=FJ1uv9ai0nFp9-bv?Ap=r`Jn z>17aiZMO@Dbhm1uU>&Vnu;uEpyW)6-Z13;AEV#t#lR2U7VQ+vVPd=I6LUw#%&*GQE z*%YWPq8%hSGrlM1Zo>+e7gq+lb8XoI^qopg5rCV*lw$ZdgC`z6h6|l8QTZ=T!bFlo7xXRgL^qx znc8kU_Sk_i$RwQdJgZ^JQA=#CI^U|8J)4!|X;~n5u}cR3RBKcT{;!48(j$pq3W}E# zlnHQ3s5p6NRk;O&GLYy5k~4J!1OqwHG4+3;HNKg3x1ra>1AGB>_(4R%7=F>22YKCq*mbz5WXOW3G)?2 zu&pqb>HPCwEx{>o?Rl?VPJl8hU%mil8%_uz2(J0E3NXA@n-}iSz*IZzX|FY4V+aFj zthAZ91KW30>mwk_=JkM}?#-AUocR8)m5YqFYC5%Dz)*p2k&*h9g}fjA zDu(+d?4Z()Xt>AGvhb6~_3)BGI`P)1Ko8C!1g9oD>0oQjD~OZkFSB7Np(jwYPYi_f zPbzujdG^(4H#619SM7+ahDT_N$7auLGki4yvuQiy-f1E&cG){OzhQJ&(9dzns0ylCjxjdei_^_}Zd+tEbMB@eI%ne34K;}*JcEXqy7ra3W@J~;F+9Wz zjcyk$v3Ur>mZNjSP8{RVcdwgg;gXRkSmuY-$NQ(HDK|4V&90$4BI%eWkF|p+n51=8 zV$WL%WTqKRw-vt<3>`$Zr7dHgkjpOL5b^T#A)z%H3U?!zfo$>fooo`5mhuEMq}?VU zIS)}OR25nbx6TUfSGu??)f9aXg>S4(e8o54TS%rt^ERQH5=RslQrWw^5Sm={zJ%UJ ze>jDf5}nrrG*$tHKVI@0YS(NrR^veu+q0y_f00lA*Aeph&a94`|c3@%G@qDN&7? zmJ;P3QimXCg>8<4-W6`Wclw+MP|fYXmSUg7EQ>krRo9k&nVzc*PsXzkIw zUN{_CK}ASj z=iv*R<)%2%IMoVI@w6I?&8f`rDgyeBmRUO2k2z==M*0Pr@ga-%gI@bXmA-m_GICf> zJfftDKSeOlvhXB%Y>8paqY~tp^zqDz$_4vf8zleMgmaHz P?YA}##FKC$Ukc+txn+g* literal 0 HcmV?d00001 diff --git a/tests/lang/ref/let.png b/tests/lang/ref/let.png deleted file mode 100644 index c555a9a07c25f2c72c8386bc880940dfc45a09e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3542 zcma)`^RS(nZ)F49Yn*7eczI$%-CioyCWf42lWs_)=W&3PB@Gq4msguDcM5y zAwps&2Ku7`$`_;1e)Rvq8)0n2Cf271?>^VzKE-HeT?Xky!;IK#S*O4&=-_BwD;-x| zimugZIgI4DJxq_bse0lmQ1hSr3GOQQiB(4Sq+}u6M+irkjRrh<}du0{g z%9Q&43xE?AqV0Y5I*uYq$oyQbmEtOQwTT*}+0|Ry-oS1>-_DbFC1~nggg-FqQ5H{4 zlAyel;}tTkoVL3B{a_h-kRsLzrvB+Bxj3LWqhBi+6Rix}e$y1{}VCyvyTLTT#$9kk|bzuQqM9-6~wY>CS z^*M4&m+#cqAUk$^$FFB@rgJOkjn78H8BWeT;Vojr_s$!;lEpLP4*S-!BXZb^3}+<- zMYhiGB~n{p&vg&mhO7;L`W|yGh}wFH=%YdR$y!)YmbKWKmaeDK z-{F`OZJOtc8FTNj>UYnSona~xOz~E4!C`A|1=)D>3iuIVaE0mO@IjBIwPFPQ^z3>* z#Nt*wdZ>+}A@xU$(KVKxcLPuQL)Z_M46Y?q)9;QsCJ>b-BB2`VFDujqHHbn*d?hWe z*>dr74N!B010tIrMO&1loT7GAN-VNyu<~qa2B&t5TPB=(tPoU^UzCn9@q>{lNe)9= ziLtH>p+Spb4f8jI@FDb27)0Fi8C$&zyD_EFFWg60x^s^p%rVl9=_eD_m&I5zoWS>u zAa;|GXOU1;-CHr9mU*+LsNnhsRz=KNKTL`O!qF@ z|E3A4JV7reAnB^x0CxGJTE{GW&t&xM1H4dsO0Rq ztu#-{uVnzt<^GB>T)`W|(a^J=%FwESTVE_zy+xht1rI)Yf^8(4f|F?jFpP2z-ygv#3rf|n}zJSX@PkDB_zY?M67?LozURwhV zsU$R*LOc>MZV9UAk#G;Q7`+WegXQTNV03Wlb#r5?)qb)3$P5548`7c932%to7pxYv z6Y8C}OvY%)eY_)!S_tS%0Q;N`OMZGKse>%cpP>WV37>`DUHBHANRT^|p0-q=n}Y~T zeYmxineK_ttlpqWU*Dcd`lw})QoH2J`4zQb9*V|%4R^}EHlv77k>}|>NV>Bb#Daf- zE9JWS>SX3!tyDJDAdm1b(S?m4KXKr8S7H>Y{KP-$PAKJ_qHPDOWm zo&v);Y8`_Mwsuhu{rsWr6?VX%Z8)2_=qZGeZA=3Hyg=?bKPC1aLJ{}wMQJ#tI4HN+ zoq`!swsABXnjRTt=DEcCoFLvYfgxxa3`;~dnxSap0`yw$3W9*SS9o^fjuSC|_<|^+qEhm&H zoRXs<;r%w!j6H5K{1mm_fx_lRy`;eVi&9lpD1Obrm@tX)az&znv)tFEHvpdNhl@)`k+-WehQo_6` zpUku(DaNG`Q09Hyt{@@`$z4NwSJg=q2w#92XoA>pd-Suv2Q7>@T1WAboir6{!WI5R z6&}9%nyO%5wouY@x?(U_%H#oV$ZvnFB1Yri))9tCP`2+h4FCYKe~>mD^O zgr*D5tnyb0lG(cx|FDL$X5nGI>&({r_9nm&HU}daW_N0EZr+YCgS-?#2ObX`Mauiy zc-@{h)PeqkZJZh{^{p&E{*@+YCmWJ(d*PhV;*hCIZi-1tBo_S-xDEaWw3F)Ou^biXZvp`bgSz<_Fz*aRQVz)`*K#)`2Dt7P@^^0-W&S8H#ba$#3_9>JTE? zvyahtEI|Wz#Um){Q&xF3P@jodT@C{aJEO>9Wi`$N0oip>w^PirfLnMe=j^QU$23u- z5QhTkEx4|3O|i9E$?%{MkT_hIVV8%3mkM%5Fo6Asz{&LYY#7A2ovbB^9b0};T_4oW zOvM!lxEcRG2aiu9IB8vyVd0v%rIViglD&S#*4`Z~1-jG}WQNl8fdTbS z+`V-RK`OCG)jUzdRWDR|ZXCF&I%fPJi#%_YVPe5WeaPn^zS7mIaWUDWNk^cEAmhe4 zVHEKZcB(F(k-6f=u(~R

HmEO9gAcZpTfFT1vG@&RS9qaVx znJD)n?pbHpLuo8$f1+#9A^t(uBa9kGt%jZt(oufjXtz*wMa?_B_aF~`W$5#Phg16g zH8NW5xOZf1w#O1`wu<$dImy4l7EB#C+1-g)KI5fr?}*CK4^*36e^)C=)_r_EJfc{o zYX+=Rs1Cys!b`Q z5Y4@xJpL{Nt#Oz}2|4owNxKE6>PpkeZblL-dB;p^ZatxRCKcYtV`r79`UbbB8HH2J^OA0B||b3xY+CJSZmsCBy}?eTEX0?azz=$t-ahD1h?3 zv6PKO!geyMZ9;0Oe|JfmP5=5W1Rb$SyDcj8#|<8OYH00-lH#c8HG1;|&gTCJ$^Yc% hcX?9m|5V3?6W09YrOTm%V8-7I8{XK$sMNrf^lxf%Tjl@& diff --git a/tests/lang/ref/linebreak.png b/tests/lang/ref/linebreak.png new file mode 100644 index 0000000000000000000000000000000000000000..4769e29135f39f6f3c481fb77580ca3ae5bc5779 GIT binary patch literal 3668 zcmai%c`zH=+sC6qV-GGGlpyw9OD#nbln|=c+IwrMwWyuaiWDtXV!KK$*RDis3))nr z8e0)6NiC(eR;o(T+Iijiy>sXH&fK~0cb@aldCtt4^UU}8%yaHrTbXjP3$p_N04|i7 zu?+yg1Uy+d(8&e>>iQ`a0N@ru86)hXCs#j?Mm&AV$MWf8;xa(@E_VfY5qHSx3g%HJ z2Apv>9I9*0rht(CwhwJ___lPA@nl-`*$wx3Pg$oFRcPXQVJ5!6HOpz>1j0c7{~&c; zG8=4`3<+PNGQDq>gy%aZK`%xWLP4^iVIYoN`MlO$5~U&f)F*xy1`;fWxp(eS{*>tN zuz6Ej_e9|U$i$4|x=gOK^s+f@mZ(2&3t7Y#z*3&f_#FP0cuuMIxzb>h=<|`4xoXfB zPK_W}+2!yU+zN?UVI~Y)E!6Fgy^$PD;YGOr--2I3+}8QYY_Kl7$fV8(_`JNExBD0V}j%d;-cF0q~6tlePNj_gKgdw zfD~O7ZIP0$=Bc`gi)v-#j@OCR4JV)R4C!m$v{sNp+lR)WfiyW#IECgM&>(x(S!mNW z=Mq)yS-#H?6)YZ_^ArPvZ1yT**sm0rnm{4eLO>h)rD4C}wfZ2^JN?#lf}~Qgz-J8H zYFQF;V{G9bS{2TabXt=RU81S*!S(ZRCc=~{;np1zYT8>YzkA1=$4;O6{8?pkBODxL z*lvu&6N+bW;aa#wuPBXrsFcOOTjThYM8^Jr)xI(iSB37lvgX(JGm3Y>6{fQq@nj@e z@?t>Yx&X4^CTx2WeGuYS!Npp$aeI0iFk~RacKj>>Nu3fCKv_|STlL%&4x9Jb@D-YP zi11JM4UGhjvV*DXk|{-no+Ygbq)z_?(caMWas9S?h7$EZrhoEB#)}{7fs9ao@jlp8 znOlt)&;$v)lS00$9Ao09u4rrN#pCx>PN9gbjBse}X&mQdRt5d;S8?KpajBI5@&^Wb zpotOLjyOJW1L6jolxAIy4wirNTc3SzE7dX+SN(gjumn$Ci;ZC!`h2?jLmwH&BOh0x z6e1+sr6(OsCZeZi9>BF8RP;_GbT(3*=^?Pwa6-*>M5;Y8f3!`6mz0ty#Tae5U-1@R zWt3}ngI}l2gZGz>5hhBRTmSO|Hiay&N|Z*PKzD_|1C}_R*)CA_b7o4+Qcm$LgI?}& z&T(EtYlVHn@ACe&=}DPPrmA%HFAo#|rKnd?)}6y3!AEY!m>~JH@Zn|R_RPMSSSYA6 z96;fYW5}!-`Ldsa49pg$Yd;&mO!2j~8FJT6c`m&9<$HgN(n(hceXgevCBeibMbP3^CN=LrABI!eFmH_cQmo5lvYD)hVDGOo`63a0 zg+AX{5-IhCc3{?)W`Z0FlwDCm z$91Gz6Wv@iS)lA3xsN znrTn5s|He6+cEI-OL5V1`kai!;-FT7R^lSC@O@J(ZmT3sl_jUg2X|Zk1`@?SlBJg< zfC%=q&2i!F>%_>~a+y|rhs6*gSrUH;1o`pP>Qyu{?JOnZ?S;wwr9^0^fuj{0`;%I$ z?5LDClO~Y?8jgrkBX4&-bcIRSH;NE&!$bDsO#6?aNvvgzOQBb*LD3QK4cM4dKoIJ4 z(-K+xm$SGi%F20Lee!DL$XwuYgzD~#BnAHx>TZHi*{p@b_A!6iMPq$Ul9kcFSqC^r z;D!AyJa$@(8n!3M`0B~|9?F3P`TN<5IWxSBjmGBT8Z?$fAh+M)cRMQVqoBFP zAs@+EyD`Vsbt+MT?)1Kdw=W`TsP)&pR#eu@)7=Z+PI=yb8zO_z^2JEm>8sE+O%C+k?dwtqXZXp0We|eyP9#`?iBS#cZ54Xu_zz{Tjl| zo5xrq_YfIhtFbLWqUZ)(=q&&0##`EEc=&y2UCTB0Z`5ZfP#;M(~AT!}N;27e?ACHc^z#klf2Uq;|X3C*z zc`XeApx(|)@v$5yS4vwDUL=D<64DOjK&}LXhpKX*0F5c3AX1X#GZW7cxqRjV>y9ws zv?^Ttb)SVS1*Haol@Fs;D#TK`i5=I1V;?j zb9Vf5!;!j>P{yqJm9xnNeX8gSmhJ++{B!s^Tzl)QgEh0Yg?$IssRYHihl|!J7&TWH zRtra_9jlBfLDduw^XbPSsavZKGNlO^@a0#o#%7hF(EO2L7aXTcL2`SP3g4)G2-?&3 zE3#IOjCY@8R}u_O8CIu%jE%(rW)4j8mOF?Z^IiBIFb z(ev$jwb#{4s=YH+U20$bw8c^oQys))uzmip;(bmR`8U68v39lV4L!;n;l75m$PQ)u zrbAv*QScsKLd_w�t-n5~;{VT7$l$YGN4|t+SKjZXB z9VvRD^XZ_fL{DYUlCnjo#svIvLx%LxZ*$J`f Hn#M{m^|Okv1DEP|Rgms8jM2SD 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 F{s%u)a;E?Q literal 4459 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 diff --git a/tests/lang/ref/repr.png b/tests/lang/ref/repr.png new file mode 100644 index 0000000000000000000000000000000000000000..f3bf781ebba6025c6843387dd006164017044907 GIT binary patch literal 8440 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 literal 0 HcmV?d00001 diff --git a/tests/lang/ref/spacing.png b/tests/lang/ref/spacing.png new file mode 100644 index 0000000000000000000000000000000000000000..5c3acf9b2a950fefbdea50b4a6a018ee0aaef935 GIT binary patch literal 3858 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 literal 0 HcmV?d00001 diff --git a/tests/lang/ref/text.png b/tests/lang/ref/text.png index 54479229c86382606748c55f7fe560f59e862724..88ce95e33307d347a724426ad7d9aa61a91314ea 100644 GIT binary patch literal 1892 zcmai#c{JOJ7RP^xO2m?wVN{jImZ~MDwI!5@XcEexmRiensL)Zbp(Rws3q{7DB}E%l zwXr5>G4=`_yQ;O6pq8QyrHrMP={s}gocGV0_r0HU&;9G3``70t+S?H%#TCQ>0FWdR z@s0o>1o}ERg1J3|BJ?QEbRx)K)@~ZzqDNjN4EVIqEkJ!fhJMUO6Mo>#V&_D48Dop>p z^RUSv)?C+llwF42(*faB-At(FTN!ig)kM8{l>u$97bZIuRehh1f^Eg<{?v`bLB}97 ziPlt~bSf9DS6a4V*-+FfY?5lb3o}osmLY(1T8?NUM`~eC6XG!KH`X0MCfz{tnP{%svX7b4O_ALWC6vlcaJLX_p%I& z?pk!itPN=8$?aOV=Q|xS#9A|ty<6#5kFn{^$>qPWD#;3IrBmarRn2h#osWJ$PG(3? z3g#II`PlzSlwoY#-+8Ib(|sV>0+aZ^%nXCEn0BL}-Ln$#OjF;e1@K;EFAdf#-_p$b zGJ8_xOj{JsCJK&22TRhrIq-r6NC5Oj71sh>S(Srrn9wVO)U3lZbI@v@sXvU7OF^vQA5${+r{9U?6M!SEx#+PW8NCk^wOwVUL8nU*Tfe!P@{U4v^fO&PDn z-i=qgtvu;1($|7IT@RNN@)WBW?f+Nd42r?EI>`WqA6@N(cwY$STV)!|^f)`feH7v! zY2WevEmvUBS+bsLnh4Xsbn#FF7rwgYjR@_l)u!}K<|?vX{R*jaEjDBNwu1?g-yk}- zwRwUN05_a2_J7Qc}i!)+zBDN7|(9jJ;93h7_wB)xq6flgQ}e!#v0k2296 zbbhO&`FP;X4UGQ&UCQ@FAU_8|8zP6{b#RNkd*E9yh%h(Q7(QnZ2S4qp|Py>~Nzw^>OUp z`10hx%(Zsr1l~2qO^%R6&bmz(Sl4|NwR87j%5^|bbZNMBd^stsxZ3E~WqtfGsoa$404j@n zZu(P?Q3Z}qfM?F}RX>r|bJrAT^O=$ zS8085pAyjavoEQDi;Jnf$(edfO*;(yC+q0`mvva%(u5G6N5{;y!2i5Yl9e5vgY${~ E6V_~Q1ONa4 delta 720 zcmaFDcbj#BczqZL0}${8ZJ)=$z_iHI#WAGf*4vv8dlwssusnFlVAa64fccK&Hs(u= z*BgP{1uW~D-P!dTg<=lf;ZN4=G`lo6Pqg*!OnXJnJxAoXDe^7Q=vo9q^^*TKa5!=} z2{Z|`D6lAEGS4+RwB_Eef7I``AzSP2x%baLXtA)hFPeWQ?EZo|^=gNLmMN3{2s zzvhW=e84v8pzis5@j+LMWR4q7627%rX~N@+Uee#&rDQ#u>&?XSyszgyY*Or>^e~6x z#ihmVe}$V)r#7;k^((T_iqQLcS1@CzR>1o@)sqnxlTvER&XhYpPz`6j5K*r;(e27j zL5cOHZx1Ou$wcq?c~bp{-ID8NKKGdvr?|e?Uh|z}qpPt=#^dzGjMHwPc~lhEQYCY| zP)4>VC7NYYY;FI84HMpc{xV;ni%)yPdQO#->#Vh%_UB>zG6OQfIPe!*~Syf~1GD);g-1$KkXQJz_-*2u3 zE9=aV6ST>E5uES-?#GjcL(9`YGMC;eIvQ>AuU;@I@R&QxB+)~U-+t)hf5y!Cc;0u_ z$2rUE-5xX*-P@KuKRWNn4Nqsw{QUuU{vG+`e*gJ9ecu?{gHHDpBz5QhyDL|hX>2C(*-Y|Pj#JzB zh`7p=r-Jq@u)8K!A0N2qxaz~J9GP#foU>f;;r+H9-?ThgCLJt~z5eyIwcf7R=f$z4 j6KLv*?}eqT`A_+SXFYuSsP@TRP}22u^>bP0l+XkK8T&{c diff --git a/tests/lang/ref/values.png b/tests/lang/ref/values.png deleted file mode 100644 index df46bd2d9a88ec97ba2ae671c2a61ae667a6c36e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8143 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 D8>s(1 diff --git a/tests/lang/typ/arrays.typ b/tests/lang/typ/array.typ similarity index 85% rename from tests/lang/typ/arrays.typ rename to tests/lang/typ/array.typ index c91a5ac18..f80cc0cd4 100644 --- a/tests/lang/typ/arrays.typ +++ b/tests/lang/typ/array.typ @@ -1,3 +1,6 @@ +// Test arrays. + +--- // Empty. {()} @@ -16,24 +19,19 @@ , #003 ,)} -// Missing closing paren. // Error: 3-3 expected closing paren {(} -// Not an array. // Error: 2-3 expected expression, found closing paren {)} -// Missing comma and bad expression. // Error: 2:4-2:4 expected comma // Error: 1:4-1:6 expected expression, found end of block comment {(1*/2)} -// Bad expression. // Error: 6-8 expected expression, found invalid token {(1, 1u 2)} -// Leading comma is not an expression. // Error: 3-4 expected expression, found comma {(,1)} diff --git a/tests/lang/typ/block-invalid.typ b/tests/lang/typ/block-invalid.typ new file mode 100644 index 000000000..cf51b91b0 --- /dev/null +++ b/tests/lang/typ/block-invalid.typ @@ -0,0 +1,37 @@ +// Test invalid code block syntax. + +--- +// Multiple unseparated expressions in one line. + +// Error: 2-4 expected expression, found invalid token +{1u} + +// Should output `1`. +// Error: 3-3 expected semicolon or line break +{0 1} + +// Should output `2`. +// Error: 2:13-2:13 expected semicolon or line break +// Error: 1:24-1:24 expected semicolon or line break +{#let x = -1 #let y = 3 x + y} + +// Should output `3`. +{ + // Error: 10-13 expected identifier, found string + #for "v" + + // Error: 11-11 expected keyword `#in` + #for v #let z = 1 + 2 + + z +} + +--- +// Ref: false +// Error: 3:1-3:1 expected closing brace +{ + +--- +// Ref: false +// Error: 1-2 unexpected closing brace +} diff --git a/tests/lang/typ/block-scoping.typ b/tests/lang/typ/block-scoping.typ new file mode 100644 index 000000000..bd1f58675 --- /dev/null +++ b/tests/lang/typ/block-scoping.typ @@ -0,0 +1,35 @@ +// Test scoping with blocks. +// Ref: false + +--- +// Block in template does not create a scope. +{ #let x = 1 } +#[test x, 1] + +--- +// Block in expression does create a scope. +#let a = { + #let b = 1 + b +} + +#[test a, 1] + +// Error: 2-3 unknown variable +{b} + +--- +// Multiple nested scopes. +{ + #let a = "a1" + { + #let a = "a2" + { + test(a, "a2") + #let a = "a3" + test(a, "a3") + } + test(a, "a2") + } + test(a, "a1") +} diff --git a/tests/lang/typ/block-value.typ b/tests/lang/typ/block-value.typ new file mode 100644 index 000000000..62934ce67 --- /dev/null +++ b/tests/lang/typ/block-value.typ @@ -0,0 +1,38 @@ +// Test return value of code blocks. + +--- +All none + +// Nothing evaluates to none. +{} + +// Let evaluates to none. +{ #let v = 0 } + +// Trailing none evaluates to none. +{ + type("") + none +} + +--- +// Evaluates to single expression. +{ "Hello" } + +// Evaluates to trailing expression. +{ #let x = "Hel"; x + "lo" } + +// Evaluates to concatenation of for loop bodies. +{ + #let parts = ("Hel", "lo") + #for s #in parts [{s}] +} + +--- +// Works the same way in code environment. +// Ref: false +#[test { + #let x = 1 + #let y = 2 + x + y +}, 3] diff --git a/tests/lang/typ/blocks.typ b/tests/lang/typ/blocks.typ deleted file mode 100644 index b2691ffb1..000000000 --- a/tests/lang/typ/blocks.typ +++ /dev/null @@ -1,17 +0,0 @@ -// Empty. -{} - -// Basic expression. -{1} - -// Bad expression. -// Error: 2-4 expected expression, found invalid token -{1u} - -// Missing closing brace in nested block. -// Error: 5-5 expected closing brace -{({1) + 1} - -// Missing closing bracket in template expression. -// Error: 11-11 expected closing bracket -{[_] + [3_} diff --git a/tests/lang/typ/bracket-call.typ b/tests/lang/typ/bracket-call.typ deleted file mode 100644 index a2d563c68..000000000 --- a/tests/lang/typ/bracket-call.typ +++ /dev/null @@ -1,107 +0,0 @@ -// 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. -// Error: 7-8 expected identifier, found integer -#[f | 1 | box][💕] - -// Error: 2:3-2:3 expected identifier -// Error: 1:4-1:4 expected identifier -#[||f true] - -// Error: 7-7 expected identifier -#[f 1|] - -// Error: 2:3-2:3 expected identifier -// Error: 1:4-1:4 expected identifier -#[|][Nope] - -// Error: 2:6-2:6 expected closing paren -// Error: 1:9-1:10 expected expression, found closing paren -#[f (|f )] - -// With actual functions. -#[box width: 1cm | image "res/rhino.png"] - ---- -// Error: 5-7 expected expression, found end of block comment -#[f */] - -// Error: 8-9 expected expression, found colon -#[f a:1:] - -// Error: 6-6 expected comma -#[f 1 2] - -// Error: 2:5-2:6 expected identifier -// Error: 1:7-1:7 expected expression -#[f 1:] - -// Error: 5-6 expected identifier -#[f 1:2] - -// Error: 5-8 expected identifier -#[f (x):1] - ---- -// Ref: false -// Error: 2:3-2:4 expected function, found string -#let x = "string" -#[x] - -// Error: 3-4 expected identifier, found invalid token -#[# 1] - -// Error: 4:1-4:1 expected identifier -// Error: 3:1-3:1 expected closing bracket -#[ - ---- -// Ref: false -// Error: 2:3-2:4 expected identifier, found closing paren -// Error: 3:1-3:1 expected closing bracket -#[) - ---- -// Error: 3:1-3:1 expected closing bracket -#[f [*] - ---- -// 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/lang/typ/call-args.typ b/tests/lang/typ/call-args.typ new file mode 100644 index 000000000..cf79c1f02 --- /dev/null +++ b/tests/lang/typ/call-args.typ @@ -0,0 +1,34 @@ +// Test function call arguments. + +--- +// One argument. +#[f bold] + +// One argument and trailing comma. +#[f 1,] + +// One named argument. +#[f a:2] + +// Mixed arguments. +{f(1, a: (3, 4), 2, b: "5")} + +--- +// Error: 5-6 expected expression, found colon +#[f :] + +// Error: 8-10 expected expression, found end of block comment +#[f a:1*/] + +// Error: 6-6 expected comma +#[f 1 2] + +// Error: 2:5-2:6 expected identifier +// Error: 1:7-1:7 expected expression +#[f 1:] + +// Error: 5-6 expected identifier +#[f 1:2] + +// Error: 4-7 expected identifier +{f((x):1)} diff --git a/tests/lang/typ/call-bracket.typ b/tests/lang/typ/call-bracket.typ new file mode 100644 index 000000000..2ee2c5d41 --- /dev/null +++ b/tests/lang/typ/call-bracket.typ @@ -0,0 +1,18 @@ +// Test bracketed function calls. + +--- +// Whitespace insignificant. +#[f], #[ f ] + +// Body and no body. +#[f][#[f]] + +// Tight functions. +#[f]#[f] + +// Multi-paragraph body. +#[align right][ + First + + Second +] diff --git a/tests/lang/typ/call-chain.typ b/tests/lang/typ/call-chain.typ new file mode 100644 index 000000000..72899f958 --- /dev/null +++ b/tests/lang/typ/call-chain.typ @@ -0,0 +1,31 @@ +// Test bracket call chaining. + +--- +// Chained once. +#[f | f] + +// Chained twice. +#[f|f|f] + +// With body. +// Error: 7-8 expected identifier, found integer +#[f | 1 | box][💕] + +// With actual functions. +#[box width: 1cm | image "res/rhino.png"] + +--- +// Error: 8-8 expected identifier +#[f 1 |] + +// Error: 4-4 expected identifier +#[ | f true] + +// Error: 2:3-2:3 expected identifier +// Error: 1:4-1:4 expected identifier +#[|][Nope] + +// Pipe wins over parens. +// Error: 2:6-2:6 expected closing paren +// Error: 1:9-1:10 expected expression, found closing paren +#[f (|f )] diff --git a/tests/lang/typ/call-invalid.typ b/tests/lang/typ/call-invalid.typ new file mode 100644 index 000000000..8e3efa328 --- /dev/null +++ b/tests/lang/typ/call-invalid.typ @@ -0,0 +1,36 @@ +// Test invalid function calls. + +--- +// Error: 4-4 expected closing paren +{f(} + +--- +// Error: 4:1-4:1 expected identifier +// Error: 3:1-3:1 expected closing bracket +#[ + +--- +// Error: 3-3 expected identifier +#[] + +// Error: 3-6 expected identifier, found string +#["f"] + +// Error: 2:3-2:4 expected identifier, found opening paren +// Error: 1:5-1:6 expected expression, found closing paren +#[(f)] + +--- +#let x = "string" + +// Error: 3-4 expected function, found string +#[x] + +--- +// 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/lang/typ/call-paren.typ b/tests/lang/typ/call-paren.typ new file mode 100644 index 000000000..482e20e83 --- /dev/null +++ b/tests/lang/typ/call-paren.typ @@ -0,0 +1,11 @@ +// Test parenthesized function calls. +// Ref: false + +--- +// Whitespace insignificant. +#[test type(1), "integer"] +#[test type (1), "integer"] + +// From variable. +#let alias = type +#[test alias(alias), "function"] diff --git a/tests/lang/typ/comments.typ b/tests/lang/typ/comment.typ similarity index 65% rename from tests/lang/typ/comments.typ rename to tests/lang/typ/comment.typ index 3cabb5869..524a24e3c 100644 --- a/tests/lang/typ/comments.typ +++ b/tests/lang/typ/comment.typ @@ -1,3 +1,6 @@ +// Test line and block comments. + +--- // Line comment acts as spacing. A// you B @@ -7,12 +10,13 @@ C/* /* */ */D -// Works in headers. +// Works in code. #[f /*1*/ a: "b" // , 1] +--- // End should not appear without start. -// Error: 7-9 unexpected end of block comment +// Error: 1:7-1:9 unexpected end of block comment /* */ */ // Unterminated is okay. diff --git a/tests/lang/typ/dictionaries.typ b/tests/lang/typ/dict.typ similarity index 67% rename from tests/lang/typ/dictionaries.typ rename to tests/lang/typ/dict.typ index 4f9e0f608..b12dbd590 100644 --- a/tests/lang/typ/dictionaries.typ +++ b/tests/lang/typ/dict.typ @@ -1,14 +1,18 @@ +// Test dictionaries. + +--- // Empty {(:)} // Two pairs. {(one: 1, two: 2)} -// Simple expression after this is already identified as a dictionary. +--- +// Simple expression after already being identified as a dictionary. // Error: 9-10 expected named pair, found expression {(a: 1, b)} -// Identified as dictionary by initial colon. +// Identified as dictionary due to initial colon. // Error: 4:4-4:5 expected named pair, found expression // Error: 3:5-3:5 expected comma // Error: 2:12-2:16 expected identifier diff --git a/tests/lang/typ/emph-strong.typ b/tests/lang/typ/emph-strong.typ deleted file mode 100644 index 2f77c7bbe..000000000 --- a/tests/lang/typ/emph-strong.typ +++ /dev/null @@ -1,11 +0,0 @@ -// Basic. -_Emph_ and *strong*! - -// Inside of words. -Pa_rtl_y emphasized or str*ength*ened. - -// Scoped to body. -#[box][*Sco_ped] to body. - -// Unterminated is fine. -_The End diff --git a/tests/lang/typ/emph.typ b/tests/lang/typ/emph.typ new file mode 100644 index 000000000..8e5812a87 --- /dev/null +++ b/tests/lang/typ/emph.typ @@ -0,0 +1,14 @@ +// Test emphasis toggle. + +--- +// Basic. +_Emphasized!_ + +// Inside of words. +Partly em_phas_ized. + +// Scoped to body. +#[box][_Scoped] to body. + +// Unterminated is fine. +_The End diff --git a/tests/lang/typ/escaping.typ b/tests/lang/typ/escape.typ similarity index 76% rename from tests/lang/typ/escaping.typ rename to tests/lang/typ/escape.typ index 57d8ec689..3c0f02f38 100644 --- a/tests/lang/typ/escaping.typ +++ b/tests/lang/typ/escape.typ @@ -1,8 +1,11 @@ +// Test escape sequences. + +--- // Escapable symbols. -\\ \/ \[ \] \{ \} \* \_ \# \~ \` \$ +\\ \/ \[ \] \{ \} \# \* \_ \= \~ \` \$ // No need to escape. -( ) = ; +( ) ; < > // Unescapable. \a \: \; \( \) @@ -12,7 +15,7 @@ \/\* \*\/ \/* \*/ * -// Test unicode escape sequence. +// Unicode escape sequence. \u{1F3D5} == 🏕 // Escaped escape sequence. diff --git a/tests/lang/typ/expr-assoc.typ b/tests/lang/typ/expr-assoc.typ new file mode 100644 index 000000000..64db98c68 --- /dev/null +++ b/tests/lang/typ/expr-assoc.typ @@ -0,0 +1,18 @@ +// Test operator associativity. +// Ref: false + +--- +// Math operators are left-associative. +#[test 10 / 2 / 2 == (10 / 2) / 2, true] +#[test 10 / 2 / 2 == 10 / (2 / 2), false] +#[test 1 / 2 * 3, 1.5] + +--- +// Assignment is right-associative. +{ + #let x = 1 + #let y = 2 + x = y = "ok" + test(x, none) + test(y, "ok") +} diff --git a/tests/lang/typ/expr-binary.typ b/tests/lang/typ/expr-binary.typ new file mode 100644 index 000000000..b02269981 --- /dev/null +++ b/tests/lang/typ/expr-binary.typ @@ -0,0 +1,132 @@ +// Test binary expressions. +// Ref: false + +--- +// Test template addition. +// Ref: true +{[*Hello ] + [world!*]} + +--- +// Test math operators. + +// Addition. +#[test 2 + 4, 6] +#[test "a" + "b", "ab"] +#[test (1, 2) + (3, 4), (1, 2, 3, 4)] +#[test (a: 1) + (b: 2, c: 3), (a: 1, b: 2, c: 3)] + +// Subtraction. +#[test 1-4, 3*-1] +#[test 4cm - 2cm, 2cm] +#[test 1e+2-1e-2, 99.99] + +// Multiplication. +#[test 2 * 4, 8] + +// Division. +#[test 12pt/.4, 30pt] +#[test 7 / 2, 3.5] + +// Combination. +#[test 3-4 * 5 < -10, true] +#[test { #let x; x = 1 + 4*5 >= 21 and { x = "a"; x + "b" == "ab" }; x }, true] + +// Mathematical identities. +#let nums = (1, 3.14, 12pt, 45deg, 90%, 13% + 10pt) +#for v #in nums { + // Test plus and minus. + test(v + v - v, v) + test(v - v - v, -v) + + // Test plus/minus and multiplication. + test(v - v, 0 * v) + test(v + v, 2 * v) + + // Integer addition does not give a float. + #if type(v) != "integer" { + test(v + v, 2.0 * v) + } + + // Linears cannot be divided by themselves. + #if type(v) != "linear" { + test(v / v, 1.0) + test(v / v == 1, true) + } +} + + +// Make sure length, relative and linear +// - can all be added to / subtracted from each other, +// - multiplied with integers and floats, +// - divided by floats. +#let dims = (10pt, 30%, 50% + 3cm) +#for a #in dims { + #for b #in dims { + test(type(a + b), type(a - b)) + } + + #for b #in (7, 3.14) { + test(type(a * b), type(a)) + test(type(b * a), type(a)) + test(type(a / b), type(a)) + } +} + +--- +// Test boolean operators. + +// And. +#[test false and false, false] +#[test false and true, false] +#[test true and false, false] +#[test true and true, true] + +// Or. +#[test false or false, false] +#[test false or true, true] +#[test true or false, true] +#[test true or true, true] + +// Short-circuiting. +#[test false and dont-care, false] +#[test true or dont-care, true] + +--- +// Test equality operators. + +#[test 1 == "hi", false] +#[test 1 == 1.0, true] +#[test 30% == 30% + 0cm, true] +#[test 1in == 0% + 72pt, true] +#[test 30% == 30% + 1cm, false] +#[test "ab" == "a" + "b", true] +#[test () == (1,), false] +#[test (1, 2, 3) == (1, 2.0) + (3,), true] +#[test (:) == (a: 1), false] +#[test (a: 2 - 1.0, b: 2) == (b: 2, a: 1), true] +#[test [*Hi*] == [*Hi*], true] + +#[test "a" != "a", false] +#[test [*] != [_], true] + +--- +// Test comparison operators. + +#[test 13 * 3 < 14 * 4, true] +#[test 5 < 10, true] +#[test 5 > 5, false] +#[test 5 <= 5, true] +#[test 5 <= 4, false] +#[test 45deg < 1rad, true] + +--- +// Test assignment operators. + +#let x = 0 +{ x = 10 } #[test x, 10] +{ x -= 5 } #[test x, 5] +{ x += 1 } #[test x, 6] +{ x *= x } #[test x, 36] +{ x /= 2.0 } #[test x, 18.0] +{ x = "some" } #[test x, "some"] +{ x += "thing" } #[test x, "something"] diff --git a/tests/lang/typ/expr-invalid.typ b/tests/lang/typ/expr-invalid.typ new file mode 100644 index 000000000..2d16034bb --- /dev/null +++ b/tests/lang/typ/expr-invalid.typ @@ -0,0 +1,59 @@ +// Test invalid expressions. +// Ref: false + +--- +// Missing expressions. + +// Error: 3-3 expected expression +{-} + +// Error: 11-11 expected expression +#[test {1+}, 1] + +// Error: 11-11 expected expression +#[test {2*}, 2] + +--- +// Mismatched types. + +// Error: 2-12 cannot apply '+' to template +{+([] + [])} + +// Error: 2-5 cannot apply '-' to string +{-""} + +// Error: 2-8 cannot apply 'not' to array +{not ()} + +// Error: 1:2-1:12 cannot apply '<=' to relative and relative +{30% <= 40%} + +// Special messages for +, -, * and /. +// Error: 4:03-4:10 cannot add integer and string +// Error: 3:12-3:19 cannot subtract integer from relative +// Error: 2:21-2:29 cannot multiply integer with boolean +// Error: 1:31-1:39 cannot divide integer by length +{(1 + "2", 40% - 1, 2 * true, 3 / 12pt)} + +// Error: 15-23 cannot apply '+=' to integer and string +{ #let x = 1; x += "2" } + +--- +// Bad left-hand sides of assignment. + +// Error: 1:3-1:6 cannot assign to this expression +{ (x) = "" } + +// Error: 1:3-1:8 cannot assign to this expression +{ 1 + 2 += 3 } + +// Error: 1:3-1:4 unknown variable +{ z = 1 } + +// Error: 1:3-1:6 cannot assign to a constant +{ box = "hi" } + +// Works if we define box beforehand +// (since then it doesn't resolve to the standard library version anymore). +#let box = "" +{ box = "hi" } diff --git a/tests/lang/typ/expr-prec.typ b/tests/lang/typ/expr-prec.typ new file mode 100644 index 000000000..fea5f7949 --- /dev/null +++ b/tests/lang/typ/expr-prec.typ @@ -0,0 +1,30 @@ +// Test operator precedence. +// Ref: false + +--- +// Multiplication binds stronger than addition. +#[test 1+2*-3, -5] + +// Subtraction binds stronger than comparison. +#[test 3 == 5 - 2, true] + +// Boolean operations bind stronger than '=='. +#[test "a" == "a" and 2 < 3, true] +#[test not "b" == "b", false] + +// Assignment binds stronger than boolean operations. +// Error: 2-7 cannot assign to this expression +{not x = "a"} + +--- +// Parentheses override precedence. +#[test (1), 1] +#[test (1+2)*-3, -9] + +// Error: 15-15 expected closing paren +#[test {(1 + 1}, 2] + +--- +// Precedence doesn't matter for chained unary operators. +// Error: 2-11 cannot apply '-' to boolean +{-not true} diff --git a/tests/lang/typ/expr-unary.typ b/tests/lang/typ/expr-unary.typ new file mode 100644 index 000000000..a1d97a494 --- /dev/null +++ b/tests/lang/typ/expr-unary.typ @@ -0,0 +1,23 @@ +// Test unary expressions. +// Ref: false + +--- +// Test plus and minus. +#for v #in (1, 3.14, 12pt, 45deg, 90%, 13% + 10pt) { + // Test plus. + test(+v, v) + + // Test minus. + test(-v, -1 * v) + test(--v, v) + + // Test combination. + test(-++ --v, -v) +} + +#[test -(4 + 2), 6-12] + +--- +// Test not. +#[test not true, false] +#[test not false, true] diff --git a/tests/lang/typ/expressions.typ b/tests/lang/typ/expressions.typ deleted file mode 100644 index 167d0d1a7..000000000 --- a/tests/lang/typ/expressions.typ +++ /dev/null @@ -1,120 +0,0 @@ -// Ref: false - -#let a = 2 -#let b = 4 - -// Error: 14-17 cannot apply '+' to string -#let error = +"" - -// Paren call. -#[test f(1), "f(1)"] -#[test type(1), "integer"] - -// Unary operations. -#[test +1, 1] -#[test -1, 1-2] -#[test --1, 1] - -// Math operations. -#[test "a" + "b", "ab"] -#[test 1-4, 3*-1] -#[test a * b, 8] -#[test 12pt/.4, 30pt] -#[test 1e+2-1e-2, 99.99] - -// Associativity. -#[test 1+2+3, 6] -#[test 1/2*3, 1.5] - -// Precedence. -#[test 1+2*-3, -5] - -// Short-circuiting logical operators. -#[test not "a" == "b", true] -#[test not 7 < 4 and 10 == 10, true] -#[test 3 < 2 or 4 < 5, true] -#[test false and false or true, true] - -// Right-hand side not even evaluated. -#[test false and dont-care, false] -#[test true or dont-care, true] - -// Equality and inequality. -#[test "ab" == "a" + "b", true] -#[test [*Hi*] == [*Hi*], true] -#[test "a" != "a", false] -#[test [*] != [_], true] -#[test (1, 2, 3) == (1, 2) + (3,), true] -#[test () == (1,), false] -#[test (a: 1, b: 2) == (b: 2, a: 1), true] -#[test (:) == (a: 1), false] -#[test 1 == "hi", false] -#[test 1 == 1.0, true] -#[test 30% == 30% + 0cm, true] -#[test 1in == 0% + 72pt, true] -#[test 30% == 30% + 1cm, false] - -// Comparisons. -#[test 13 * 3 < 14 * 4, true] -#[test 5 < 10, true] -#[test 5 > 5, false] -#[test 5 <= 5, true] -#[test 5 <= 4, false] -#[test 45deg < 1rad, true] - -// Assignment. -#let x = "some" -#let y = "some" -#[test (x = y = "") == none and x == none and y == "", true] - -// Modify-assign operators. -#let x = 0 -{ x = 10 } #[test x, 10] -{ x -= 5 } #[test x, 5] -{ x += 1 } #[test x, 6] -{ x *= x } #[test x, 36] -{ x /= 2.0 } #[test x, 18.0] -{ x = "some" } #[test x, "some"] -{ x += "thing" } #[test x, "something"] - -// Error: 3-4 unknown variable -{ z = 1 } - -// Error: 3-6 cannot assign to this expression -{ (x) = "" } - -// Error: 3-8 cannot assign to this expression -{ 1 + 2 = 3} - -// Error: 3-6 cannot assign to a constant -{ box = "hi" } - -// Works if we define box before (since then it doesn't resolve to the standard -// library version anymore). -#let box = ""; { box = "hi" } - -// Parentheses. -#[test (a), 2] -#[test (2), 2] -#[test (1+2)*3, 9] - -// Error: 3-3 expected expression -{-} - -// Error: 11-11 expected expression -#[test {1+}, 1] - -// Error: 11-11 expected expression -#[test {2*}, 2] - -// Error: 8-17 cannot apply '-' to boolean -#[test -not true, error] - -// Error: 2-8 cannot apply 'not' to array -{not ()} - -// Error: 3-10 cannot apply '+' to integer and string -{(1 + "2")} - -// Error: 2-12 cannot apply '<=' to relative and relative -{30% <= 40%} diff --git a/tests/lang/typ/for-invalid.typ b/tests/lang/typ/for-invalid.typ new file mode 100644 index 000000000..ca83649ab --- /dev/null +++ b/tests/lang/typ/for-invalid.typ @@ -0,0 +1,35 @@ +// Test invalid for loop syntax. + +--- +// Error: 5-5 expected identifier +#for + +// Error: 7-7 expected keyword `#in` +#for v + +// Error: 11-11 expected expression +#for v #in + +// Error: 16-16 expected body +#for v #in iter + +--- +// Should output `v iter`. +// Error: 2:5-2:5 expected identifier +// Error: 2:3-2:6 unexpected keyword `#in` +#for +v #in iter {} + +// Should output `A thing`. +// Error: 7-10 expected identifier, found string +A#for "v" thing. + +// Should output `iter`. +// Error: 2:6-2:9 expected identifier, found string +// Error: 1:10-1:13 unexpected keyword `#in` +#for "v" #in iter {} + +// Should output `+ b iter`. +// Error: 2:7-2:7 expected keyword `#in` +// Error: 1:12-1:15 unexpected keyword `#in` +#for a + b #in iter {} diff --git a/tests/lang/typ/for-loop.typ b/tests/lang/typ/for-loop.typ new file mode 100644 index 000000000..944cef1ea --- /dev/null +++ b/tests/lang/typ/for-loop.typ @@ -0,0 +1,44 @@ +// Test which things are iterable. +// Ref: false + +--- +// Array. + +#for x #in () {} + +#let sum = 0 +#for x #in (1, 2, 3, 4, 5) { + sum += x +} +#[test sum, 15] + +--- +// Dictionary. +// Ref: true +(\ #for k, v #in (name: "Typst", age: 2) [ + #[h 0.5cm] {k}: {v}, \ +]) + +--- +// String. +{ + #let out = "" + #let first = true + #for c #in "abc" { + #if not first { + out += ", " + } + first = false + out += c + } + test(out, "a, b, c") +} + +--- +// Uniterable expression. +// Error: 12-16 cannot loop over boolean +#for v #in true {} + +// Make sure that we don't complain twice. +// Error: 12-19 cannot add integer and string +#for v #in 1 + "2" {} diff --git a/tests/lang/typ/for-pattern.typ b/tests/lang/typ/for-pattern.typ new file mode 100644 index 000000000..87bf603fe --- /dev/null +++ b/tests/lang/typ/for-pattern.typ @@ -0,0 +1,30 @@ +// Test for loop patterns. +// Ref: false + +--- +#let out = () + +// Values of array. +#for v #in (1, 2, 3) { + out += (v,) +} + +// Values of dictionary. +#for v #in (a: 4, b: 5) { + out += (v,) +} + +// Keys and values of dictionary. +#for k, v #in (a: 6, b: 7) { + out += (k,) + out += (v,) +} + +#[test out, (1, 2, 3, 4, 5, "a", 6, "b", 7)] + +--- +// Keys and values of array. +// Error: 6-10 mismatched pattern +#for k, v #in (-1, -2, -3) { + dont-care +} diff --git a/tests/lang/typ/for-value.typ b/tests/lang/typ/for-value.typ new file mode 100644 index 000000000..f0705fc5f --- /dev/null +++ b/tests/lang/typ/for-value.typ @@ -0,0 +1,20 @@ +// Test return value of for loops. + +--- +// Template body yields template. +// Should output `234`. +#for v #in (1, 2, 3, 4) [#if v >= 2 [{v}]] + +--- +// Block body yields template. +// Should output `[1st, 2nd, 3rd, 4th, 5th, 6th]`. +{ + [\[] + #for v #in (1, 2, 3, 4, 5, 6) { + (#if v > 1 [, ] + + [{v}] + + #if v == 1 [st] + + #if v == 2 [nd] + + #if v == 3 [rd] + + #if v >= 4 [th]) + } + [\]] +} diff --git a/tests/lang/typ/headings.typ b/tests/lang/typ/heading.typ similarity index 56% rename from tests/lang/typ/headings.typ rename to tests/lang/typ/heading.typ index 2fd2d2aca..9bff2e6e8 100644 --- a/tests/lang/typ/headings.typ +++ b/tests/lang/typ/heading.typ @@ -1,41 +1,44 @@ -// Test different numbers of hashtags. - -// Valid levels. -= One -=== Three -====== Six - -// Too many hashtags. -// Warning: 1-8 should not exceed depth 6 -======= Seven +// Test headings. --- -// Test heading vs. no heading. +// Different number of hashtags. -// Parsed as headings if at start of the context. -/**/ = Heading -{[== Heading]} -#[box][=== Heading] +// Valid levels. +=1 +===2 +======6 -// Not at the start of the context. -Text = with=sign - -// Escaped. -\= No heading +// Too many hashtags. +// Warning: 1:1-1:8 should not exceed depth 6 +=======7 --- // Heading continuation over linebreak. // Code blocks continue heading. -= This { - "continues" += A{ + "B" } // Function call continues heading. = #[box][ - This, -] too + A +] B // Without some kind of block, headings end at a line break. -= This -not += A +B + +--- +// Heading vs. no heading. + +// Parsed as headings if at start of the context. +/**/ = Ok +{[== Ok]} +#[box][=== Ok] + +// Not at the start of the context. +No = heading + +// Escaped. +\= No heading diff --git a/tests/lang/typ/if-branch.typ b/tests/lang/typ/if-branch.typ new file mode 100644 index 000000000..8399d6741 --- /dev/null +++ b/tests/lang/typ/if-branch.typ @@ -0,0 +1,45 @@ +// Test conditions of if-else expressions. + +--- +// Test condition evaluation. +#if 1 < 2 [ + Ok. +] + +#if true == false [ + Bad, but we {dont-care}! +] + +--- +// Brace in condition. +#if {true} [ + Ok. +] + +// Multi-line condition with parens. +#if ( + 1 + 1 + == 1 +) { + nope +} #else { + "Ok." +} + +// Multiline. +#if false [ + Bad. +] #else { + #let pt = "." + "Ok" + pt +} + +--- +// Condition must be boolean. +// If it isn't, neither branch is evaluated. +// Error: 5-14 expected boolean, found string +#if "a" + "b" { nope } #else { nope } + +// Make sure that we don't complain twice. +// Error: 5-12 cannot add integer and string +#if 1 + "2" {} diff --git a/tests/lang/typ/if-invalid.typ b/tests/lang/typ/if-invalid.typ new file mode 100644 index 000000000..c7ead226c --- /dev/null +++ b/tests/lang/typ/if-invalid.typ @@ -0,0 +1,28 @@ +// Test invalid if syntax. + +--- +// Error: 4-4 expected expression +#if + +// Error: 5-5 expected expression +{#if} + +// Error: 6-6 expected body +#if x + +// Error: 1-6 unexpected keyword `#else` +#else {} + +--- +// Should output `x`. +// Error: 4-4 expected expression +#if +x {} + +// Should output `something`. +// Error: 6-6 expected body +#if x something + +// Should output `A thing.` +// Error: 20-20 expected body +A#if false {} #else thing diff --git a/tests/lang/typ/if-value.typ b/tests/lang/typ/if-value.typ new file mode 100644 index 000000000..f9e95ff6c --- /dev/null +++ b/tests/lang/typ/if-value.typ @@ -0,0 +1,21 @@ +// Test return value of if expressions. +// Ref: false + +--- +{ + #let x = 1 + #let y = 2 + #let z + + // Returns if branch. + z = #if x < y { "ok" } + test(z, "ok") + + // Returns else branch. + z = #if x > y { "bad" } #else { "ok" } + test(z, "ok") + + // Missing else evaluates to none. + z = #if x > y { "bad" } + test(z, none) +} diff --git a/tests/lang/typ/if.typ b/tests/lang/typ/if.typ deleted file mode 100644 index 0e0d03d17..000000000 --- a/tests/lang/typ/if.typ +++ /dev/null @@ -1,64 +0,0 @@ -#let x = true - -// The two different bodies. -#if true [_1_,] #if x {"2"} - -// Braced condition is fine. -#if {true} {"3"} - -// Newlines. -#if false [ - -] #else [ - 4 -] - -// Multiline (condition needs parens because it's terminated by the line break, -// just like the right-hand side of a let-binding). -#if ( - x -) { - "Fi" + "ve" -} - -// Spacing is somewhat delicate. We only want to have spacing in the output if -// there was whitespace before/after the full if-else statement. In particular, -// spacing after a simple if should be retained, but spacing between the first -// body and the else should be ignored. -a#if true[b]c \ -a#if true[b] c \ -a #if true{"b"}c \ -a #if true{"b"} c \ -a#if false [?] #else [b]c \ -a#if true {"b"} #else {"?"} c \ - -// Body not evaluated at all if condition is false. -#if false { dont-care-about-undefined-variables } - ---- -#let x = true - -// Needs condition. -// Error: 6-7 expected expression, found closing brace -a#if } - -// Needs if-body. -// Error: 2:7-2:7 expected body -// Error: 1:16-1:16 expected body -a#if x b#if (x)c - -// Needs else-body. -// Error: 20-20 expected body -a#if true [b] #else c - -// Lone else. -// Error: 1-6 unexpected keyword `#else` -#else [] - -// Condition must be boolean. If it isn't, neither branch is evaluated. -// Error: 5-14 expected boolean, found string -#if "a" + "b" { "nope" } #else { "nope" } - -// No coercing from empty array or or stuff like that. -// Error: 5-7 expected boolean, found array -#if () { "nope" } #else { "nope" } diff --git a/tests/lang/typ/let-invalid.typ b/tests/lang/typ/let-invalid.typ new file mode 100644 index 000000000..3e32e2cf4 --- /dev/null +++ b/tests/lang/typ/let-invalid.typ @@ -0,0 +1,20 @@ +// Test invalid let binding syntax. + +--- +// Error: 5-5 expected identifier +#let + +// Error: 6-9 expected identifier, found string +#let "v" + +// Should output `1`. +// Error: 7-7 expected semicolon or line break +#let v 1 + +// Error: 9-9 expected expression +#let v = + +--- +// Should output `= 1`. +// Error: 6-9 expected identifier, found string +#let "v" = 1 diff --git a/tests/lang/typ/let-terminated.typ b/tests/lang/typ/let-terminated.typ new file mode 100644 index 000000000..6dda7bb21 --- /dev/null +++ b/tests/lang/typ/let-terminated.typ @@ -0,0 +1,28 @@ +// Test termination of let statements. + +--- +// Terminated by line break. +#let v1 = 1 +One + +// Terminated by semicolon. +#let v2 = 2; Two + +// Terminated by semicolon and line break. +#let v3 = 3; +Three + +// Terminated because expression ends. +// Error: 12-12 expected semicolon or line break +#let v4 = 4 Four + +// Terminated by semicolon even though we are in a paren group. +// Error: 2:19-2:19 expected expression +// Error: 1:19-1:19 expected closing paren +#let v5 = (1, 2 + ; Five + +#[test v1, 1] +#[test v2, 2] +#[test v3, 3] +#[test v4, 4] +#[test v5, (1, 2)] diff --git a/tests/lang/typ/let-value.typ b/tests/lang/typ/let-value.typ new file mode 100644 index 000000000..12e1ba78c --- /dev/null +++ b/tests/lang/typ/let-value.typ @@ -0,0 +1,11 @@ +// Test value of let binding. +// Ref: false + +--- +// Automatically initialized with none. +#let x +#[test x, none] + +// Manually initialized with one. +#let x = 1 +#[test x, 1] diff --git a/tests/lang/typ/let.typ b/tests/lang/typ/let.typ deleted file mode 100644 index 4f42e44c6..000000000 --- a/tests/lang/typ/let.typ +++ /dev/null @@ -1,66 +0,0 @@ -// Automatically initialized with `none`. -#let x -#[test x, none] - -// Initialized with `1`. -#let y = 1 -#[test y, 1] - -// Initialize with template, not terminated by semicolon in template. -#let v = [Hello; there] - -// Not terminated by line break due to parens. -#let x = ( - 1, - 2, - 3, -) -#[test x, (1, 2, 3)] - -// Multiple bindings in one line. -#let x = "a"; #let y = "b"; #[test x + y, "ab"] - -// Invalid name. -// Error: 6-7 expected identifier, found integer -#let 1 - -// Invalid name. -// Error: 6-7 expected identifier, found integer -#let 1 = 2 - -// Missing binding name. -// Error: 5-5 expected identifier -#let -x = 5 - -// Missing right-hand side. -// Error: 9-9 expected expression -#let a = - -// No name at all. -// Error: 11-11 expected identifier -The Fi#let;rst - -// Terminated with just a line break. -#let v = "a" -The Second #[test v, "a"] - -// Terminated with semicolon + line break. -#let v = "a"; -The Third #[test v, "a"] - -// Terminated with just a semicolon. -The#let v = "a"; Fourth #[test v, "a"] - -// Terminated by semicolon even though we are in a paren group. -// Error: 2:25-2:25 expected expression -// Error: 1:25-1:25 expected closing paren -The#let array = (1, 2 + ;Fifth #[test array, (1, 2)] - -// Not terminated. -// Error: 16-16 expected semicolon or line break -The#let v = "a"Sixth #[test v, "a"] - -// Not terminated. -// Error: 16-16 expected semicolon or line break -The#let v = "a" #[test v, "a"] Seventh diff --git a/tests/lang/typ/linebreaks.typ b/tests/lang/typ/linebreak.typ similarity index 75% rename from tests/lang/typ/linebreaks.typ rename to tests/lang/typ/linebreak.typ index ee2f453ae..e63929924 100644 --- a/tests/lang/typ/linebreaks.typ +++ b/tests/lang/typ/linebreak.typ @@ -1,6 +1,6 @@ -// Leading line break. -\ Leading +// Test forced line breaks. +--- // Directly after word. Line\ Break @@ -10,10 +10,14 @@ Line \ Break // Directly before word does not work. No \Break -// Trailing before paragraph break. -Paragraph 1 \ +--- +// Leading line break. +\ Leading -Paragraph 2 +// Trailing before paragraph break. +Trailing 1 \ + +Trailing 2 // Trailing before end of document. -Paragraph 3 \ +Trailing 3 \ diff --git a/tests/lang/typ/nbsp.typ b/tests/lang/typ/nbsp.typ index b2f099503..5af6c84f9 100644 --- a/tests/lang/typ/nbsp.typ +++ b/tests/lang/typ/nbsp.typ @@ -1,2 +1,5 @@ +// Test the non breaking space. + +--- // Parsed correctly, but not actually doing anything at the moment. The non-breaking~space does not work. diff --git a/tests/lang/typ/raw.typ b/tests/lang/typ/raw.typ index 36149dc89..753f1a09c 100644 --- a/tests/lang/typ/raw.typ +++ b/tests/lang/typ/raw.typ @@ -1,12 +1,17 @@ -#[font 8pt] +// Test raw blocks. +--- // No extra space. `A``B` +--- // Typst syntax inside. `#let x = 1` \ `#[f 1]` +--- +// Trimming. + // Space between "rust" and "let" is trimmed. The keyword ```rust let```. @@ -19,15 +24,17 @@ The keyword ```rust let```. ```py import this -def say_hi(): - print("Hi!") +def hi(): + print("Hi!") ``` +--- // Lots of backticks inside. ```` ```backticks``` ```` +--- // Unterminated. // Error: 2:1-2:1 expected backtick(s) `endless diff --git a/tests/lang/typ/values.typ b/tests/lang/typ/repr.typ similarity index 95% rename from tests/lang/typ/values.typ rename to tests/lang/typ/repr.typ index 7260cad10..1975a8e68 100644 --- a/tests/lang/typ/values.typ +++ b/tests/lang/typ/repr.typ @@ -1,10 +1,12 @@ // Test representation of values in the document. +--- +// Variables. + #let name = "Typst" #let ke-bab = "Kebab!" #let α = "Alpha" -// Variables. {name} \ {ke-bab} \ {α} \ @@ -12,11 +14,13 @@ // Error: 2-3 unknown variable {_} +--- // Literal values. {none} (empty) \ {true} \ {false} \ +--- // Numerical values. {1} \ {1.0e-4} \ @@ -29,12 +33,15 @@ {2.5rad} \ {45deg} \ +--- // Colors. {#f7a20500} \ +--- // Strings and escaping. {"hi"} \ {"a\n[]\"\u{1F680}string"} \ +--- // Templates. {[*{"Hi"} #[f 1]*]} diff --git a/tests/lang/typ/spacing.typ b/tests/lang/typ/spacing.typ new file mode 100644 index 000000000..54e49f2d7 --- /dev/null +++ b/tests/lang/typ/spacing.typ @@ -0,0 +1,27 @@ +// Test spacing around control flow structures. + +--- +// Spacing around let. + +// Error: 6-6 expected identifier +A#let;B \ +A#let x = 1;B #[test x, 1] \ +A #let x = 2;B #[test x, 2] \ +A#let x = 3; B #[test x, 3] \ + +--- +// Spacing around if-else. + +A#if true[B]C \ +A#if true[B] C \ +A #if true{"B"}C \ +A #if true{"B"} C \ +A#if false [] #else [B]C \ +A#if true [B] #else [] C \ + +--- +// Spacing around for loop. + +A#for _ #in (none,) [B]C \ +A#for _ #in (none,) [B] C \ +A #for _ #in (none,) [B]C \ diff --git a/tests/lang/typ/strong.typ b/tests/lang/typ/strong.typ new file mode 100644 index 000000000..63e6eb35b --- /dev/null +++ b/tests/lang/typ/strong.typ @@ -0,0 +1,14 @@ +// Test strong toggle. + +--- +// Basic. +*Strong!* + +// Inside of words. +Partly str*ength*ened. + +// Scoped to body. +#[box][*Scoped] to body. + +// Unterminated is fine. +*The End diff --git a/tests/lang/typ/text.typ b/tests/lang/typ/text.typ index 9c1e79770..d86f48957 100644 --- a/tests/lang/typ/text.typ +++ b/tests/lang/typ/text.typ @@ -1 +1,8 @@ +// Test simple text. + +--- Hello 🌏! + +--- +// Some code stuff in text. +let f() , ; : | + - /= == 12 "string" diff --git a/tests/typeset.rs b/tests/typeset.rs index 76436ae84..63831c229 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -141,12 +141,29 @@ fn test( let mut ok = true; let mut frames = vec![]; - let mut lines = 0; - for (i, part) in src.split("---").enumerate() { - let (part_ok, part_frames) = test_part(part, i, lines, env); - ok &= part_ok; - frames.extend(part_frames); + let mut compare_ref = true; + + let parts: Vec<_> = src.split("---").collect(); + for (i, part) in parts.iter().enumerate() { + let is_header = i == 0 + && parts.len() > 1 + && part + .lines() + .all(|s| s.starts_with("//") || s.chars().all(|c| c.is_whitespace())); + + if is_header { + for line in part.lines() { + if line.starts_with("// Ref: false") { + compare_ref = false; + } + } + } else { + let (part_ok, part_frames) = test_part(part, i, compare_ref, lines, env); + ok &= part_ok; + frames.extend(part_frames); + } + lines += part.lines().count() as u32; } @@ -179,9 +196,16 @@ fn test( ok } -fn test_part(src: &str, i: usize, lines: u32, env: &mut Env) -> (bool, Vec) { +fn test_part( + src: &str, + i: usize, + compare_ref: bool, + lines: u32, + env: &mut Env, +) -> (bool, Vec) { let map = LineMap::new(src); - let (compare_ref, ref_diags) = parse_metadata(src, &map); + let (local_compare_ref, ref_diags) = parse_metadata(src, &map); + let compare_ref = local_compare_ref.unwrap_or(compare_ref); let mut scope = library::new(); @@ -242,12 +266,20 @@ fn test_part(src: &str, i: usize, lines: u32, env: &mut Env) -> (bool, Vec (bool, SpanVec) { +fn parse_metadata(src: &str, map: &LineMap) -> (Option, SpanVec) { let mut diags = vec![]; - let mut compare_ref = true; + let mut compare_ref = None; for (i, line) in src.lines().enumerate() { - compare_ref &= !line.starts_with("// Ref: false"); + let line = line.trim(); + + if line.starts_with("// Ref: false") { + compare_ref = Some(false); + } + + if line.starts_with("// Ref: true") { + compare_ref = Some(true); + } let (level, rest) = if let Some(rest) = line.strip_prefix("// Warning: ") { (Level::Warning, rest)