typst/tests/typ/compiler/break-continue.typ

148 lines
1.9 KiB
Typst

// Test break and continue in loops.
// Ref: false
---
// Test break.
#let var = 0
#let error = false
#for i in range(10) {
var += i
if i > 5 {
break
error = true
}
}
#test(var, 21)
#test(error, false)
---
// Test joining with break.
#let i = 0
#let x = while true {
i += 1
str(i)
if i >= 5 {
"."
break
}
}
#test(x, "12345.")
---
// Test continue.
#let i = 0
#let x = 0
#while x < 8 {
i += 1
if calc.rem(i, 3) == 0 {
continue
}
x += i
}
// If continue did not work, this would equal 10.
#test(x, 12)
---
// Test joining with continue.
#let x = for i in range(5) {
"a"
if calc.rem(i, 3) == 0 {
"_"
continue
}
str(i)
}
#test(x, "a_a1a2a_a4")
---
// Test break outside of loop.
#let f() = {
// Error: 3-8 cannot break outside of loop
break
}
#for i in range(1) {
f()
}
---
// Test break in function call.
#let identity(x) = x
#let out = for i in range(5) {
"A"
identity({
"B"
break
})
"C"
}
#test(out, "AB")
---
// Test continue outside of loop.
// Error: 12-20 cannot continue outside of loop
#let x = { continue }
---
// Error: 2-10 cannot continue outside of loop
#continue
---
// Ref: true
// Should output `Hello World 🌎`.
#for _ in range(10) {
[Hello ]
[World #{
[🌎]
break
}]
}
---
// Ref: true
// Should output `Some` in red, `Some` in blue and `Last` in green.
// Everything should be in smallcaps.
#for color in (red, blue, green, yellow) [
#set text(font: "Roboto")
#show: it => text(fill: color, it)
#smallcaps(if color != green [
Some
] else [
Last
#break
])
]
---
// Ref: true
// Test break in set rule.
// Should output `Hi` in blue.
#for i in range(10) {
[Hello]
set text(blue, ..break)
[Not happening]
}
---
// Test second block during break flow.
// Ref: true
#for i in range(10) {
table(
{ [A]; break },
for _ in range(3) [B]
)
}