From 020294fca9a7065d4b9cf4e677f606ebaaa29b00 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sat, 13 Apr 2024 10:39:45 +0200 Subject: Better test runner (#3922) --- tests/suite/scripting/for.typ | 135 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 tests/suite/scripting/for.typ (limited to 'tests/suite/scripting/for.typ') diff --git a/tests/suite/scripting/for.typ b/tests/suite/scripting/for.typ new file mode 100644 index 00000000..e98b3c72 --- /dev/null +++ b/tests/suite/scripting/for.typ @@ -0,0 +1,135 @@ +// Test for loops. + +--- for-loop-basic --- + +// Empty array. +#for x in () [Nope] + +// Dictionary is traversed in insertion order. +// Should output `Name: Typst. Age: 2.`. +#for (k, v) in (Name: "Typst", Age: 2) [ + #k: #v. +] + +// Block body. +// Should output `[1st, 2nd, 3rd, 4th]`. +#{ + "[" + for v in (1, 2, 3, 4) { + if v > 1 [, ] + [#v] + if v == 1 [st] + if v == 2 [nd] + if v == 3 [rd] + if v >= 4 [th] + } + "]" +} + +// Content block body. +// Should output `2345`. +#for v in (1, 2, 3, 4, 5, 6, 7) [#if v >= 2 and v <= 5 { repr(v) }] + +// Map captured arguments. +#let f1(..args) = args.pos().map(repr) +#let f2(..args) = args.named().pairs().map(p => repr(p.first()) + ": " + repr(p.last())) +#let f(..args) = (f1(..args) + f2(..args)).join(", ") +#f(1, a: 2) + +--- for-loop-integrated --- +#let out = () + +// Values of array. +#for v in (1, 2, 3) { + out += (v,) +} + +// Indices and values of array. +#for (i, v) in ("1", "2", "3").enumerate() { + test(repr(i + 1), v) +} + +// Pairs 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, ("a", 4), ("b", 5), "a", 6, "b", 7)) + +// Grapheme clusters of string. +#let first = true +#let joined = for c in "abc👩‍👩‍👦‍👦" { + if not first { ", " } + first = false + c +} + +#test(joined, "a, b, c, 👩‍👩‍👦‍👦") + +// Return value. +#test(for v in "" [], none) +#test(type(for v in "1" []), content) + +--- for-loop-over-bool --- +// Uniterable expression. +// Error: 11-15 cannot loop over boolean +#for v in true {} + +--- for-loop-over-string --- +// Keys and values of strings. +// Error: 6-12 cannot destructure values of string +#for (k, v) in "hi" { + dont-care +} + +--- for-loop-destructuring-without-parentheses --- +// Destructuring without parentheses. +// Error: 7-8 unexpected comma +// Hint: 7-8 destructuring patterns must be wrapped in parentheses +#for k, v in (a: 4, b: 5) { + dont-care +} + +--- for-loop-destructuring-half --- +// Error: 7-8 unexpected comma +// Hint: 7-8 destructuring patterns must be wrapped in parentheses +#for k, in () {} + +--- for-loop-incomplete --- +// Error: 5 expected pattern +#for + +// Error: 5 expected pattern +#for// + +// Error: 6 expected pattern +#{for} + +// Error: 7 expected keyword `in` +#for v + +// Error: 10 expected expression +#for v in + +// Error: 15 expected block +#for v in iter + +// Error: 5 expected pattern +#for +v in iter {} + +// Error: 7-10 expected pattern, found string +// Error: 16 expected block +A#for "v" thing + +// Error: 6-9 expected pattern, found string +#for "v" in iter {} + +// Error: 7 expected keyword `in` +#for a + b in iter {} -- cgit v1.2.3