diff options
Diffstat (limited to 'tests/typ/code/closure.typ')
| -rw-r--r-- | tests/typ/code/closure.typ | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/typ/code/closure.typ b/tests/typ/code/closure.typ new file mode 100644 index 00000000..86a6f632 --- /dev/null +++ b/tests/typ/code/closure.typ @@ -0,0 +1,64 @@ +// Test closures. +// Ref: false + +--- + +// Basic closure without captures. +{ + let adder = (x, y) => x + y + test(adder(2, 3), 5) +} + +// Pass closure as argument and return closure. +// Also uses shorthand syntax for a single argument. +{ + let chain = (f, g) => (x) => f(g(x)) + let f = x => x + 1 + let g = x => 2 * x + let h = chain(f, g) + test(h(2), 5) +} + +// Capture environment. +{ + let mark = "?" + let greet = { + let hi = "Hi" + name => { + hi + ", " + name + mark + } + } + + test(greet("Typst"), "Hi, Typst?") + + mark = "!" + test(greet("Typst"), "Hi, Typst!") +} + +// Don't leak environment. +{ + // Error: 18-19 unknown variable + let func() = x + let x = "hi" + + test(func(), error) +} + +--- +// Too few arguments. +{ + let types(x, y) = "[" + type(x) + ", " + type(y) + "]" + test(types(14%, 12pt), "[relative, length]") + + // Error: 16-22 missing argument: y + test(types("nope"), "[string, none]") +} + +// Too many arguments. +{ + let f(x) = x + 1 + + // Error: 2:10-2:15 unexpected argument + // Error: 1:17-1:24 unexpected argument + f(1, "two", () => x) +} |
