From 29be90bf95f2ea10c435e7b02f8c26626b956417 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 17 Jan 2021 13:53:22 +0100 Subject: [PATCH] =?UTF-8?q?Assertions=20with=20[eq]=20+=20better=20tests?= =?UTF-8?q?=20=F0=9F=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/eval/call.rs | 28 +++++++++-- src/parse/mod.rs | 10 ++-- src/parse/parser.rs | 85 +++++++++++++++++--------------- tests/lang/ref/arrays.png | Bin 3479 -> 3609 bytes tests/lang/ref/basics.png | Bin 5051 -> 0 bytes tests/lang/ref/blocks.png | Bin 1363 -> 799 bytes tests/lang/ref/emph-strong.png | Bin 0 -> 4117 bytes tests/lang/ref/expressions.png | Bin 2351 -> 0 bytes tests/lang/ref/headings.png | Bin 7850 -> 7985 bytes tests/lang/ref/let.png | Bin 1493 -> 1563 bytes tests/lang/ref/linebreaks.png | Bin 0 -> 4161 bytes tests/lang/ref/nbsp.png | Bin 0 -> 1854 bytes tests/lang/ref/raw.png | Bin 4212 -> 4071 bytes tests/lang/ref/text.png | Bin 0 -> 731 bytes tests/lang/ref/values.png | Bin 8531 -> 8651 bytes tests/lang/typ/arrays.typ | 17 ++++++- tests/lang/typ/basics.typ | 14 ------ tests/lang/typ/blocks.typ | 19 ++++--- tests/lang/typ/comments.typ | 9 ++-- tests/lang/typ/dictionaries.typ | 2 + tests/lang/typ/emph-strong.typ | 11 +++++ tests/lang/typ/escaping.typ | 2 + tests/lang/typ/expressions.typ | 42 +++++++++------- tests/lang/typ/headings.typ | 22 ++++++--- tests/lang/typ/let.typ | 61 +++++++++++++++++------ tests/lang/typ/linebreaks.typ | 19 +++++++ tests/lang/typ/nbsp.typ | 2 + tests/lang/typ/raw.typ | 21 +++++--- tests/lang/typ/text.typ | 1 + tests/lang/typ/values.typ | 28 +++++++---- tests/typeset.rs | 26 +++++++++- 31 files changed, 284 insertions(+), 135 deletions(-) delete mode 100644 tests/lang/ref/basics.png create mode 100644 tests/lang/ref/emph-strong.png delete mode 100644 tests/lang/ref/expressions.png create mode 100644 tests/lang/ref/linebreaks.png create mode 100644 tests/lang/ref/nbsp.png create mode 100644 tests/lang/ref/text.png delete mode 100644 tests/lang/typ/basics.typ create mode 100644 tests/lang/typ/emph-strong.typ create mode 100644 tests/lang/typ/linebreaks.typ create mode 100644 tests/lang/typ/nbsp.typ create mode 100644 tests/lang/typ/text.typ diff --git a/src/eval/call.rs b/src/eval/call.rs index 8e75f17cc..5b0628a8a 100644 --- a/src/eval/call.rs +++ b/src/eval/call.rs @@ -73,7 +73,7 @@ impl Args { where T: Cast>, { - self.pos.iter_mut().find_map(move |slot| try_cast(ctx, slot)) + (0 .. self.pos.len()).find_map(move |i| try_cast(ctx, &mut self.pos, i)) } /// Find and remove the first convertible positional argument, producing an @@ -97,7 +97,16 @@ impl Args { where T: Cast>, { - self.pos.iter_mut().filter_map(move |slot| try_cast(ctx, slot)) + let mut i = 0; + std::iter::from_fn(move || { + while i < self.pos.len() { + if let Some(val) = try_cast(ctx, &mut self.pos, i) { + return Some(val); + } + i += 1; + } + None + }) } /// Convert and remove the value for the given named argument, producing an @@ -163,17 +172,26 @@ where /// Try to cast the value in the slot into `T`, putting it back if the /// conversion fails. -fn try_cast(ctx: &mut EvalContext, slot: &mut Spanned) -> Option +fn try_cast( + ctx: &mut EvalContext, + vec: &mut Vec>, + i: usize, +) -> Option where T: Cast>, { // Replace with error placeholder when conversion works since error values // are ignored when generating "unexpected argument" errors. - let value = std::mem::replace(slot, Spanned::zero(Value::Error)); + let slot = &mut vec[i]; + let value = std::mem::replace(slot, Spanned::zero(Value::None)); let span = value.span; match T::cast(value) { - CastResult::Ok(t) => Some(t), + CastResult::Ok(t) => { + vec.remove(i); + Some(t) + } CastResult::Warn(t, m) => { + vec.remove(i); ctx.diag(warning!(span, "{}", m)); Some(t) } diff --git a/src/parse/mod.rs b/src/parse/mod.rs index b6836d384..7c92185d5 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -117,7 +117,7 @@ fn heading(p: &mut Parser) -> NodeHeading { // Parse the heading contents. let mut contents = vec![]; - while p.check(|t| !matches!(t, Token::Space(n) if n > 0)) { + while p.check(|t| !matches!(t, Token::Space(n) if n >= 1)) { if let Some(node) = p.span_if(|p| node(p, &mut false)) { contents.push(node); } @@ -388,8 +388,8 @@ fn string(p: &mut Parser, token: TokenStr) -> String { /// Parse a let expresion. fn expr_let(p: &mut Parser) -> Option { p.push_mode(TokenMode::Code); - p.start_group(Group::Terminated); p.eat_assert(Token::Let); + p.start_group(Group::Expr); let pat = p.span_if(ident); let mut rhs = None; @@ -404,11 +404,11 @@ fn expr_let(p: &mut Parser) -> Option { p.diag_expected("identifier"); } - while !p.eof() { - p.diag_unexpected(); + p.pop_mode(); + if !p.eof() { + p.diag_expected("semicolon or line break"); } - p.pop_mode(); p.end_group(); pat.map(|pat| Expr::Let(ExprLet { pat, expr: rhs })) } diff --git a/src/parse/parser.rs b/src/parse/parser.rs index 2b5fe7206..8c27c8f7a 100644 --- a/src/parse/parser.rs +++ b/src/parse/parser.rs @@ -112,16 +112,14 @@ impl<'s> Parser<'s> { /// # Panics /// This panics if the next token does not start the given group. pub fn start_group(&mut self, group: Group) { + self.groups.push(group); match group { Group::Paren => self.eat_assert(Token::LeftParen), Group::Bracket => self.eat_assert(Token::LeftBracket), Group::Brace => self.eat_assert(Token::LeftBrace), - Group::Subheader => {} - Group::Terminated => {} + Group::Expr => self.repeek(), + Group::Subheader => self.repeek(), } - - self.groups.push(group); - self.repeek(); } /// Ends the parsing of a group and returns the span of the whole group. @@ -129,26 +127,21 @@ impl<'s> Parser<'s> { /// # Panics /// This panics if no group was started. pub fn end_group(&mut self) { - // Check that we are indeed at the end of the group. - debug_assert_eq!(self.peek(), None, "unfinished group"); - let group = self.groups.pop().expect("no started group"); self.repeek(); - let end = match group { - Group::Paren => Some(Token::RightParen), - Group::Bracket => Some(Token::RightBracket), - Group::Brace => Some(Token::RightBrace), - Group::Subheader => None, - Group::Terminated => Some(Token::Semicolon), + let (end, required) = match group { + Group::Paren => (Token::RightParen, true), + Group::Bracket => (Token::RightBracket, true), + Group::Brace => (Token::RightBrace, true), + Group::Expr => (Token::Semicolon, false), + Group::Subheader => return, }; - if let Some(token) = end { - if self.next == Some(token) { - self.bump(); - } else { - self.diag(error!(self.next_start, "expected {}", token.name())); - } + if self.next == Some(end) { + self.bump(); + } else if required { + self.diag(error!(self.next_start, "expected {}", end.name())); } } @@ -169,7 +162,7 @@ impl<'s> Parser<'s> { where F: FnOnce(&mut Self) -> Option, { - self.span(|p| f(p)).transpose() + self.span(f).transpose() } /// Consume the next token. @@ -269,17 +262,21 @@ impl<'s> Parser<'s> { match self.tokens.mode() { TokenMode::Markup => {} - TokenMode::Code => { - while matches!( - self.next, - Some(Token::Space(_)) | - Some(Token::LineComment(_)) | - Some(Token::BlockComment(_)) - ) { - self.next_start = self.tokens.pos(); - self.next = self.tokens.next(); + TokenMode::Code => loop { + match self.next { + Some(Token::Space(n)) => { + if n >= 1 && self.groups.last() == Some(&Group::Expr) { + break; + } + } + Some(Token::LineComment(_)) => {} + Some(Token::BlockComment(_)) => {} + _ => break, } - } + + self.next_start = self.tokens.pos(); + self.next = self.tokens.next(); + }, } self.repeek(); @@ -287,16 +284,22 @@ impl<'s> Parser<'s> { fn repeek(&mut self) { self.peeked = self.next; - if self.groups.contains(&match self.next { - Some(Token::RightParen) => Group::Paren, - Some(Token::RightBracket) => Group::Bracket, - Some(Token::RightBrace) => Group::Brace, - Some(Token::Pipe) => Group::Subheader, - Some(Token::Semicolon) => Group::Terminated, + let token = match self.next { + Some(token) => token, + None => return, + }; + + match token { + Token::RightParen if self.groups.contains(&Group::Paren) => {} + Token::RightBracket if self.groups.contains(&Group::Bracket) => {} + Token::RightBrace if self.groups.contains(&Group::Brace) => {} + Token::Semicolon if self.groups.contains(&Group::Expr) => {} + Token::Space(n) if n >= 1 && self.groups.last() == Some(&Group::Expr) => {} + Token::Pipe if self.groups.contains(&Group::Subheader) => {} _ => return, - }) { - self.peeked = None; } + + self.peeked = None; } } @@ -316,9 +319,9 @@ pub enum Group { Bracket, /// A curly-braced group: `{...}`. Brace, + /// A group ended by a semicolon or a line break: `;`, `\n`. + Expr, /// A group ended by a chained subheader or a closing bracket: /// `... >>`, `...]`. Subheader, - /// A group ended by a semicolon: `;`. - Terminated, } diff --git a/tests/lang/ref/arrays.png b/tests/lang/ref/arrays.png index 2d70a3f67642947865bd7c48328dc84a8d1a84a6..36845b5f20004d0f8c4f9acf375c5a928a54b329 100644 GIT binary patch literal 3609 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 Od>CC*om#Y0{J#K}s9&W3 literal 3479 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 diff --git a/tests/lang/ref/basics.png b/tests/lang/ref/basics.png deleted file mode 100644 index 3c3dd7a0c703bd63839f3e47357d7b8a72872115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5051 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 B1)cx^ diff --git a/tests/lang/ref/blocks.png b/tests/lang/ref/blocks.png index ca826c1b90a9b0905ba071b027d100c7201f32de..22a5722ad42df38500fed738a3e17135388d9d1b 100644 GIT binary patch literal 799 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 z zEKDZbz>bj9)fC9fRb8K*wmigMR3Nl8@g${p&uipWl+O0Qdi1ulsN?RJE+6=lIr zt1xB(K4vjX6-p9|t%A*`EYq;6&9wuIdq0A+`>bohg4DTBh9%WRxwh8QIXdL!y<*`< z^%rtKx<{LwdE<^-BSN?jbq+pNbXI$mf8Ca!F+E1t`d;q+`b|@IFfGLb_uKG86Wb7c zGeTgW6@LsYe6~N2lhst4l6}C#OnIvoTSe~lrIC3Zrzs^3&Eb^|j3smWI*s(Gft{|o zc)Y_99lqN!nX+u0461ci)|(5@RkFY%IcP5h=#r+S2F#7K5s0>z^jAPk?eW%x{3kwx zKR-Na;X^o;N=#I=@`nT8&b(e1n(On_>jb)cHyTM(g3}uZZW51IKF*6*6nrSbY%R!m zp>DY_qFHG%!=t^t>6uj7iBd%riLe-AOL%_Ls#&4@j{P{krh&D8dkR zj8;?s2gwMgy~r$_G=-bp)r(HcPkp1uG9vh8lRJv zDi-c4H_Q!td|QtyXp;-mk5t+#E&%_hvwJx0X>KJgt+i$ffkbWtB$nvo#^p~ z>JRpX8MOPd4CIlx;;`lAl(r6%y9i=JNH{OI0IX9_M&*y_Z_AwWDQg}aOLiw_aUEqa z=GBV6&>l!JoVgRnG^+F!6`OuvZ4-#Dp78g416kXFWlA?b0c<;m{@NWX{^Tms)Hn&c zW~%hJ4w{#`ih^7MLMFTVttHKFz0zA(6KYFYAt=AYhc~~bRv92|a~14x|aAJpi8OEIHHSOA0*;_}&uOw{TPlRT~7_R2csbgsv-cec+{ zkHybasSqcZeO*GCQ0JFxKEd0A^01iLZ3Iddf25;ZcRRpWF(20kC*)^z#<rYL~hQRlf+bplFGnQHR;E=wm3?I!&hC9b&mSpYoZ6MuLH6A;-8o5cxA-IqAQ zqAfXC7!Gwpo(dEuz#Yg-&Da;LFr7*`N(ql7f+n>|NOdOC;C^%n$OVY VNd7awrZ(_D)+dAz@p2qh^f#biwfO)5 literal 1493 zcmai!eKgYx9L9faON$wHiP74MyUW?UPhPsD zag4m>HJOl?qLFur$jgWrDaGyn(K+37?mhQ8pYxpOkMDoadA_$?T^!_P)MWqwkjFaO zx&we1_)9L3`eFdMJ=YQdByzB}7>}s2m5G(KN;H%{U3|SiK0IH8rceP|rY^$5sTyk$ zj~0Owj?$?q%5OJ7mFblihq4ssHIl2|=Y_)QvqpY*s&r((Dk)O31tHg}^#4p3D`jty zRP`8v7^?Tcyn!IKF9Bfg&Dyav8}*x1rwPv7(m;$_>dELd%my1~5=|`#Kri(pJ9j*=xO3zg&k($OB{iF;^jX z6s%l9a>5I${;YiozrkkP!E3wbN<$RGOW+Y{UA*{Ob{N}D47xKXF+Hl3nU3QzH@k@^ zL^7P$#XWOj^-yvwa>Zs9`jFnw>$?mYTH|0h_rIa-GILRvA?rWB8l~Ihs*x^8V4aQ- zk5BxNM~=dQw>Bl??JZEM29uiQ8?`_{hS94tFa&#?e1SdCGl#$QFiAF9#`1NXse>b)e`;9AfplG)j@m>H|X_huy)$rk1toz${^A%6ekSja*_B1f4d zM<^>PLEGQtIa=OGA=GjWKImsHCXI^m2Kpyrx{N11R{B+ZYb;iX@L8uTB|DQ+DaE#3 z6fcm-+@g($d2$`YN({vdP|Mv87(h@ewc3k{u&9{FA59TB3zzVE*d2HqLM=E}9gcH1 zybPIf69gHPko8`{Oe+uB--|pD+#YBE7oCAlcQ=3IG>N-i`A!v3K~wX z;UldPgIi^$8F}9^Xo9# zci1zV8jwM~>u4sm&)KT{7LCSDTg&r#V>FX)0if zdBO%Zoj|L=m5w4{jmj~`1Xzh5yGG2Vegq$!`;G@Gyp@{S5l%tT4(E+eX^F~tcbFGV zDu@f;kz{f=SCRZ`-Yuwy_^m#g`>1V9-Nb9|`L$hveh!)JqGiiiu*ZOYX z4O~-q=Q^0YnBB$@983a2yz+t-Qkpe*G;FIz_k<^kGlqErs=K>{V(F~tPM z&)n&_zvoX|2w!Tjkyt+ds4zHTbaBwLM;G_9A1SXU=7;F%$e$_F&zL72wbTe)@XR@{ z@a%)IAl#>MU@)2{?k?7BCYLr1u%Y)WPExGsIFXVce=SpjL{>XESRTb}zyw)jD8$*lUzm=F`uEk0J nV^rS`>`SgQOSth>?Syy7&>`~*MW)F0zyCGX&c&8z{Y%1MX(+Gk diff --git a/tests/lang/ref/linebreaks.png b/tests/lang/ref/linebreaks.png new file mode 100644 index 0000000000000000000000000000000000000000..5268ed64c0c65aaba0358cf706259f9236576fe8 GIT binary patch literal 4161 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 U=~a+W{JR)Uj4Tan_1&WX0&s10CjbBd literal 0 HcmV?d00001 diff --git a/tests/lang/ref/raw.png b/tests/lang/ref/raw.png index f88194c0b07b43c1ed9eb7b47a9c47882f55b612..8b68922a515c5bb03bfff681aa5e3de1cae2760a 100644 GIT binary patch literal 4071 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 J2q@R2{{VWShSdN7 literal 4212 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 literal 0 HcmV?d00001 diff --git a/tests/lang/ref/values.png b/tests/lang/ref/values.png index 762ad64e30f8cd06d9bccc9385c7ca1beb83ff7b..d4411cc808cf6cccdeb7812eb47dc223bafaccbd 100644 GIT binary patch literal 8651 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 literal 8531 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 diff --git a/tests/lang/typ/arrays.typ b/tests/lang/typ/arrays.typ index 0b8fb866a..3c290e50d 100644 --- a/tests/lang/typ/arrays.typ +++ b/tests/lang/typ/arrays.typ @@ -1,6 +1,9 @@ // Empty. {()} +// Not an array, just a parenthesized expression. +{(1)} + // One item and trailing comma. {(-1,)} @@ -13,21 +16,31 @@ , #003 ,)} +// Missing closing paren. // Error: 1:3-1:3 expected closing paren {(} -// Error: 2:4-2:6 expected expression, found end of block comment -// Error: 1:4-1:4 expected comma +// Not an array. +// Error: 1:2-1: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: 1:6-1:8 expected expression, found invalid token {(1, 1u 2)} +// Leading comma is not an expression. // Error: 1:3-1:4 expected expression, found comma {(,1)} +// Missing expression makes named pair incomplete, making this an empty array. // Error: 1:5-1:5 expected expression {(a:)} +// Named pair after this is already identified as an array. // Error: 1:6-1:10 expected expression, found named pair {(1, b: 2)} diff --git a/tests/lang/typ/basics.typ b/tests/lang/typ/basics.typ deleted file mode 100644 index 9220e3765..000000000 --- a/tests/lang/typ/basics.typ +++ /dev/null @@ -1,14 +0,0 @@ -Hello 🌏! - -_Emph_ and *strong*! - -The non-breaking~space does not work. - -// Directly after word. -Line\ Break - -// Spaces around. -Line \ Break - -// Directly before word does not work. -No \Break diff --git a/tests/lang/typ/blocks.typ b/tests/lang/typ/blocks.typ index cadd30dd1..faef0987f 100644 --- a/tests/lang/typ/blocks.typ +++ b/tests/lang/typ/blocks.typ @@ -1,21 +1,26 @@ +// Basic expression. {1} -// Function calls. -{f(1)} -{[[f 1]]} - // Error: 1:2-1:2 expected expression {} +// Bad expression. // Error: 1:2-1:4 expected expression, found invalid token {1u} +// Two expressions are not allowed. +// Error: 1:4-1:5 unexpected integer +{2 3} + +// Missing closing brace in nested block. // Error: 1:5-1:5 expected closing brace {({1) + 2} -// Error: 1:12-1:12 expected closing bracket -{[*] + [ok*} +// Missing closing bracket in template expression. +// Error: 1:11-1:11 expected closing bracket +{[_] + [4_} +// Opening brace is ignored after one expression is parsed. // Error: 2:4-2:5 unexpected hex value // Error: 1:5-1:6 unexpected opening brace -{1 #{} _end_ +{5 #{}*.* diff --git a/tests/lang/typ/comments.typ b/tests/lang/typ/comments.typ index c5b04967b..5118a05e3 100644 --- a/tests/lang/typ/comments.typ +++ b/tests/lang/typ/comments.typ @@ -1,18 +1,19 @@ -// Test whether line comment acts as spacing. +// Line comment acts as spacing. A// you B -// Test whether block comment acts as spacing. +// Block comment does not act as spacing. C/* /* */ */D -// Test in expressions. +// Works in headers. [f /*1*/ a: "b" // , 1] +// End should not appear without start. // Error: 1:7-1:9 unexpected end of block comment /* */ */ -// Unterminated block comment is okay. +// Unterminated is okay. /* diff --git a/tests/lang/typ/dictionaries.typ b/tests/lang/typ/dictionaries.typ index c729b92c5..63d9db9ec 100644 --- a/tests/lang/typ/dictionaries.typ +++ b/tests/lang/typ/dictionaries.typ @@ -4,9 +4,11 @@ // Two pairs. {(one: 1, two: 2)} +// Simple expression after this is already identified as a dictionary. // Error: 1:9-1:10 expected named pair, found expression {(a: 1, b)} +// Identified as dictionary by 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 new file mode 100644 index 000000000..dcd173376 --- /dev/null +++ b/tests/lang/typ/emph-strong.typ @@ -0,0 +1,11 @@ +// 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/escaping.typ b/tests/lang/typ/escaping.typ index cb663612a..abf124ce9 100644 --- a/tests/lang/typ/escaping.typ +++ b/tests/lang/typ/escaping.typ @@ -18,8 +18,10 @@ // Escaped escape sequence. \u{41} vs. \\u\{41\} +// Unicode codepoint does not exist. // Error: 1:1-1:11 invalid unicode escape sequence \u{FFFFFF} +// Unterminated. // Error: 1:6-1:6 expected closing brace \u{41*Bold* diff --git a/tests/lang/typ/expressions.typ b/tests/lang/typ/expressions.typ index 017252892..74150c4bc 100644 --- a/tests/lang/typ/expressions.typ +++ b/tests/lang/typ/expressions.typ @@ -1,37 +1,43 @@ +// Ref: false + #let a = 2; #let b = 4; +// Paren call. +[eq f(1), "f(1)"] +[eq type(1), "integer"] + // Unary operations. -{+1} -{-1} -{--1} +[eq +1, 1] +[eq -1, 1-2] +[eq --1, 1] // Binary operations. -{"a"+"b"} -{1-2} -{a * b} -{12pt/.4} +[eq "a" + "b", "ab"] +[eq 1-4, 3*-1] +[eq a * b, 8] +[eq 12pt/.4, 30pt] // Associativity. -{1+2+3} -{1/2*3} +[eq 1+2+3, 6] +[eq 1/2*3, 1.5] // Precedence. -{1+2*-3} +[eq 1+2*-3, -5] // Parentheses. -{(a)} -{(2)} -{(1+2)*3} +[eq (a), 2] +[eq (2), 2] +[eq (1+2)*3, 9] // Confusion with floating-point literal. -{1e+2-1e-2} +[eq 1e+2-1e-2, 99.99] // Error: 1:3-1:3 expected expression {-} -// Error: 1:4-1:4 expected expression -{1+} +// Error: 1:8-1:8 expected expression +[eq {1+}, 1] -// Error: 1:4-1:4 expected expression -{2*} +// Error: 1:8-1:8 expected expression +[eq {2*}, 2] diff --git a/tests/lang/typ/headings.typ b/tests/lang/typ/headings.typ index f62f6534a..765d03770 100644 --- a/tests/lang/typ/headings.typ +++ b/tests/lang/typ/headings.typ @@ -1,38 +1,48 @@ // Test different numbers of hashtags. +// Valid levels. # One ### Three ###### Six +// Too many hashtags. // Warning: 1:1-1:8 section depth should not exceed 6 ####### Seven --- // Test heading vs. no heading. +// Parsed as headings if at start of the context. /**/ # Heading {[## Heading]} [box][### Heading] -\# No heading - +// Not at the start of the context. Text with # hashtag -Nr#1 +// Escaped. +\# No heading +// Keyword. // Error: 1:1-1:6 unexpected invalid token #nope +// Not parsed as a keyword, but neither as a heading. +Nr#1 + --- // Heading continuation over linebreak. +// Code blocks continue heading. # This { - "works" + "continues" } +// Function call continues heading. # [box][ - This + This, ] too +// Without some kind of block, headings end at a line break. # This -does not +not diff --git a/tests/lang/typ/let.typ b/tests/lang/typ/let.typ index c7bba7478..a966f2434 100644 --- a/tests/lang/typ/let.typ +++ b/tests/lang/typ/let.typ @@ -1,20 +1,53 @@ +// Ref: false + // Automatically initialized with `none`. -#let x; -{(x,)} +#let x +[eq x, none] -// Can start with underscore. -#let _y=1; -{_y} +// Initialized with `1`. +#let y = 1; +[eq y, 1] -// Multiline. -#let z = "world" - + " 🌏"; Hello, {z}! +// Multiple bindings in one line. +#let x = "a"; #let y = "b"; [eq x + y, "ab"] +// No name. // Error: 1:6-1:7 expected identifier, found integer -#let 1; +#let 1 -// Error: 4:1-4:3 unexpected identifier -// Error: 3:4-3:9 unexpected identifier -// Error: 3:1-3:1 expected semicolon -#let x = "" -Hi there +--- +// Terminated with just a line break. +#let v = "a" +First +[eq v, "a"] + +// Terminated with just a semicolon. +#let v = "a"; Second +[eq v, "a"] + +// Terminated with semicolon + line break. +#let v = "a"; +Third +[eq v, "a"] + +// Terminated by semicolon even though we are in a paren group. +// Error: 2:22-2:22 expected expression +// Error: 1:22-1:22 expected closing paren +#let array = (1, 2 + ;Fourth +[eq array, (1, 2)] + +// Not terminated. +// Error: 1:14-1:20 expected semicolon or line break, found identifier +#let v = "a" Unseen Fifth +[eq v, "a"] + +// Not terminated by semicolon in template. +#let v = [Hello; there] + +// Not terminated by line break due to parens. +#let x = ( + 1, + 2, + 3, +) +[eq x, (1, 2, 3)] diff --git a/tests/lang/typ/linebreaks.typ b/tests/lang/typ/linebreaks.typ new file mode 100644 index 000000000..ee2f453ae --- /dev/null +++ b/tests/lang/typ/linebreaks.typ @@ -0,0 +1,19 @@ +// Leading line break. +\ Leading + +// Directly after word. +Line\ Break + +// Spaces around. +Line \ Break + +// Directly before word does not work. +No \Break + +// Trailing before paragraph break. +Paragraph 1 \ + +Paragraph 2 + +// Trailing before end of document. +Paragraph 3 \ diff --git a/tests/lang/typ/nbsp.typ b/tests/lang/typ/nbsp.typ new file mode 100644 index 000000000..b2f099503 --- /dev/null +++ b/tests/lang/typ/nbsp.typ @@ -0,0 +1,2 @@ +// 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 22eda139a..2c0890ba2 100644 --- a/tests/lang/typ/raw.typ +++ b/tests/lang/typ/raw.typ @@ -1,23 +1,28 @@ +[font 8pt] + +// Typst syntax inside. +`#let x = 1``[f 1]` + +// Space between "rust" and "let" is trimmed. The keyword ``rust let``. -`#let x = 1` -`[f 1]` - ---- -[font 6pt] +// Trimming depends on number backticks. +<` untrimmed `> \ +<`` trimmed ``> +// Multiline trimming. ``py import this def say_hi(): - print("Hello World!") + print("Hi!") `` ---- +// Lots of backticks inside. ```` ```backticks``` ```` ---- +// Unterminated. // Error: 2:1-2:1 expected backtick(s) `endless diff --git a/tests/lang/typ/text.typ b/tests/lang/typ/text.typ new file mode 100644 index 000000000..9c1e79770 --- /dev/null +++ b/tests/lang/typ/text.typ @@ -0,0 +1 @@ +Hello 🌏! diff --git a/tests/lang/typ/values.typ b/tests/lang/typ/values.typ index ce41fc433..51d0bd17b 100644 --- a/tests/lang/typ/values.typ +++ b/tests/lang/typ/values.typ @@ -1,13 +1,24 @@ +// Test representation of values in the document. + #let name = "Typst"; #let ke-bab = "Kebab!"; #let α = "Alpha"; +// Variables. {name} \ {ke-bab} \ {α} \ + +// Error: 1:1-1:4 unknown variable +{_} + +// Literal values. {none} (empty) \ {true} \ {false} \ + +// Numerical values. +{1} \ {1.0e-4} \ {3.15} \ {1e-10} \ @@ -17,17 +28,16 @@ {12e1pt} \ {2.5rad} \ {45deg} \ -{"hi"} \ -{"a\n[]\"\u{1F680}string"} \ -{#f7a20500} \ -{[*{"Hi"} [f 1]*]} \ -{{1}} -// Error: 1:1-1:4 unknown variable -{_} \ +// Colors. +{#f7a20500} \ // Error: 1:2-1:5 invalid color {#a5} -// Error: 1:2-1:4 expected expression, found invalid token -{1u} +// Strings and escaping. +{"hi"} \ +{"a\n[]\"\u{1F680}string"} \ + +// Templates. +{[*{"Hi"} [f 1]*]} diff --git a/tests/typeset.rs b/tests/typeset.rs index 10e6231e1..fd5f4c815 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -1,7 +1,9 @@ +use std::cell::RefCell; use std::env; use std::ffi::OsStr; use std::fs; use std::path::Path; +use std::rc::Rc; use fontdock::fs::FsIndex; use image::{GenericImageView, Rgba}; @@ -180,7 +182,8 @@ fn test_part(i: usize, src: &str, env: &mut Env) -> (bool, Vec) { let (compare_ref, ref_diags) = parse_metadata(src, &map); let mut scope = library::new(); - register_helpers(&mut scope); + let panicked = Rc::new(RefCell::new(false)); + register_helpers(&mut scope, Rc::clone(&panicked)); // We want to have "unbounded" pages, so we allow them to be infinitely // large and fit them to match their content. @@ -201,6 +204,10 @@ fn test_part(i: usize, src: &str, env: &mut Env) -> (bool, Vec) { diags.sort_by_key(|d| d.span); let mut ok = true; + if *panicked.borrow() { + ok = false; + } + if diags != ref_diags { println!(" Subtest {} does not match expected diagnostics. ❌", i); ok = false; @@ -259,7 +266,7 @@ fn parse_metadata(src: &str, map: &LineMap) -> (bool, SpanVec) { (compare_ref, diags) } -fn register_helpers(scope: &mut Scope) { +fn register_helpers(scope: &mut Scope, panicked: Rc>) { pub fn f(_: &mut EvalContext, args: &mut Args) -> Value { let (array, dict) = args.drain(); let iter = array @@ -281,7 +288,22 @@ fn register_helpers(scope: &mut Scope) { Value::Str(p.finish()) } + let eq = move |ctx: &mut EvalContext, args: &mut Args| -> Value { + let lhs = args.require::(ctx, "left-hand side"); + let rhs = args.require::(ctx, "right-hand side"); + if lhs != rhs { + *panicked.borrow_mut() = true; + println!(" Assertion failed ❌"); + println!(" left: {:?}", lhs); + println!(" right: {:?}", rhs); + Value::Str(format!("(panic)")) + } else { + Value::None + } + }; + scope.set("f", ValueFunc::new("f", f)); + scope.set("eq", ValueFunc::new("eq", eq)); } fn print_diag(diag: &Spanned, map: &LineMap) {