summaryrefslogtreecommitdiff
path: root/tests/suite/scripting/loop.typ
diff options
context:
space:
mode:
Diffstat (limited to 'tests/suite/scripting/loop.typ')
-rw-r--r--tests/suite/scripting/loop.typ142
1 files changed, 142 insertions, 0 deletions
diff --git a/tests/suite/scripting/loop.typ b/tests/suite/scripting/loop.typ
new file mode 100644
index 00000000..689c1c93
--- /dev/null
+++ b/tests/suite/scripting/loop.typ
@@ -0,0 +1,142 @@
+// Test break and continue in loops.
+
+--- loop-break-basic ---
+// 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)
+
+--- loop-break-join-basic ---
+// Test joining with break.
+
+#let i = 0
+#let x = while true {
+ i += 1
+ str(i)
+ if i >= 5 {
+ "."
+ break
+ }
+}
+
+#test(x, "12345.")
+
+--- loop-continue-basic ---
+// 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)
+
+--- loop-continue-join ---
+// 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")
+
+--- loop-break-outside-of-loop ---
+// Test break outside of loop.
+#let f() = {
+ // Error: 3-8 cannot break outside of loop
+ break
+}
+
+#for i in range(1) {
+ f()
+}
+
+--- loop-break-join-in-last-arg ---
+// Test break in function call.
+#let identity(x) = x
+#let out = for i in range(5) {
+ "A"
+ identity({
+ "B"
+ break
+ })
+ "C"
+}
+
+#test(out, "AB")
+
+--- loop-continue-outside-of-loop-in-block ---
+// Test continue outside of loop.
+
+// Error: 12-20 cannot continue outside of loop
+#let x = { continue }
+
+--- loop-continue-outside-of-loop-in-markup ---
+// Error: 2-10 cannot continue outside of loop
+#continue
+
+--- loop-break-join-in-nested-blocks ---
+// Should output `Hello World 🌎`.
+#for _ in range(10) {
+ [Hello ]
+ [World #{
+ [🌎]
+ break
+ }]
+}
+
+--- loop-break-join-set-and-show ---
+// 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
+ ])
+]
+
+--- loop-break-join-in-set-rule-args ---
+// Test break in set rule.
+// Should output `Hi` in blue.
+#for i in range(10) {
+ [Hello]
+ set text(blue, ..break)
+ [Not happening]
+}
+
+--- loop-break-join-in-first-arg ---
+// Test second block during break flow.
+
+#for i in range(10) {
+ table(
+ { [A]; break },
+ for _ in range(3) [B]
+ )
+}