summaryrefslogtreecommitdiff
path: root/tests/suite/scripting/blocks.typ
diff options
context:
space:
mode:
Diffstat (limited to 'tests/suite/scripting/blocks.typ')
-rw-r--r--tests/suite/scripting/blocks.typ143
1 files changed, 143 insertions, 0 deletions
diff --git a/tests/suite/scripting/blocks.typ b/tests/suite/scripting/blocks.typ
new file mode 100644
index 00000000..f139b8c6
--- /dev/null
+++ b/tests/suite/scripting/blocks.typ
@@ -0,0 +1,143 @@
+// Test code blocks.
+
+--- code-block-basic-syntax ---
+
+// 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 content and strings.
+#{
+ [How]
+ if true {
+ " are"
+ }
+ [ ]
+ if false [Nope]
+ [you] + "?"
+}
+
+--- code-block-empty ---
+// Nothing evaluates to none.
+#test({}, none)
+
+--- code-block-let ---
+// Let evaluates to none.
+#test({ let v = 0 }, none)
+
+--- code-block-single-expression ---
+// Evaluates to single expression.
+#test({ "hello" }, "hello")
+
+--- code-block-multiple-expressions-single-line ---
+// Evaluates to string.
+#test({ let x = "m"; x + "y" }, "my")
+
+--- code-block-join-let-with-expression ---
+// Evaluated to int.
+#test({
+ let x = 1
+ let y = 2
+ x + y
+}, 3)
+
+--- code-block-join-expression-with-none ---
+// String is joined with trailing none, evaluates to string.
+#test({
+ type("")
+ none
+}, str)
+
+--- code-block-join-int-with-content ---
+// Some things can't be joined.
+#{
+ [A]
+ // Error: 3-4 cannot join content with integer
+ 1
+ [B]
+}
+
+--- code-block-scope-in-markup ---
+// Block directly in markup also creates a scope.
+#{ let x = 1 }
+
+// Error: 7-8 unknown variable: x
+#test(x, 1)
+
+--- code-block-scope-in-let ---
+// Block in expression does create a scope.
+#let a = {
+ let b = 1
+ b
+}
+
+#test(a, 1)
+
+// Error: 3-4 unknown variable: b
+#{b}
+
+--- code-block-double-scope ---
+// Double block creates a scope.
+#{{
+ import "module.typ": b
+ test(b, 1)
+}}
+
+// Error: 2-3 unknown variable: b
+#b
+
+--- code-block-nested-scopes ---
+// Multiple nested scopes.
+#{
+ let a = "a1"
+ {
+ let a = "a2"
+ {
+ test(a, "a2")
+ let a = "a3"
+ test(a, "a3")
+ }
+ test(a, "a2")
+ }
+ test(a, "a1")
+}
+
+--- code-block-multiple-literals-without-semicolon ---
+// Multiple unseparated expressions in one line.
+// Error: 4 expected semicolon or line break
+#{1 2}
+
+--- code-block-multiple-expressions-without-semicolon ---
+// Error: 13 expected semicolon or line break
+// Error: 23 expected semicolon or line break
+#{let x = -1 let y = 3 x + y}
+
+--- code-block-incomplete-expressions ---
+#{
+ // Error: 7-10 expected pattern, found string
+ for "v"
+
+ // Error: 8 expected keyword `in`
+ // Error: 22 expected block
+ for v let z = 1 + 2
+
+ z
+}
+
+--- code-block-unclosed ---
+// Error: 2-3 unclosed delimiter
+#{
+
+--- code-block-unopened ---
+// Error: 2-3 unexpected closing brace
+#}
+
+--- content-block-in-markup-scope ---
+// Content blocks also create a scope.
+#[#let x = 1]
+
+// Error: 2-3 unknown variable: x
+#x