typst/tests/typ/code/block.typ
Laurenz 1ee1d078e2 Fatal errors
- Makes errors fatal, so that a phase is only reached when all previous phases were error-free
- Parsing still recovers and can produce multiple errors
- Evaluation fails fast and can thus produce only a single error (except for parse errors due to an import)
- The single error that could occur during execution is removed for now
- Removes Value::Error variant
2021-07-30 18:49:19 +02:00

136 lines
2.0 KiB
Typst

// Test code blocks.
// Ref: false
---
// Ref: true
// Evaluates to join of none, [My ] and the two loop bodies.
{
let parts = ("my fri", "end.")
[Hello, ]
for s in parts [{s}]
}
// Evaluates to join of the templates and strings.
{
[How]
if true {
" are"
}
[ ]
if false [Nope]
[you] + "?"
}
---
// Nothing evaluates to none.
#test({}, none)
// Let evaluates to none.
#test({ let v = 0 }, none)
// Evaluates to single expression.
#test({ "hello" }, "hello")
// Evaluates to string.
#test({ let x = "m"; x + "y" }, "my")
// Evaluated to int.
#test({
let x = 1
let y = 2
x + y
}, 3)
// String is joined with trailing none, evaluates to string.
#test({
type("")
none
}, "string")
---
// Some things can't be joined.
{
[A]
// Error: 5-6 cannot join template with integer
1
[B]
}
---
// 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}
---
// Double block creates a scope.
{{
import b from "target.typ"
test(b, 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")
}
---
// Multiple unseparated expressions in one line.
// Error: 2-4 expected expression, found invalid token
{1u}
// Should output `1`.
// Error: 3 expected semicolon or line break
{1 2}
// Should output `2`.
// Error: 12 expected semicolon or line break
// Error: 22 expected semicolon or line break
{let x = -1 let y = 3 x + y}
// Should output `3`.
{
// Error: 9-12 expected identifier, found string
for "v"
// Error: 10 expected keyword `in`
for v let z = 1 + 2
z
}
---
// Error: 2:1 expected closing brace
{
---
// Error: 1-2 unexpected closing brace
}