summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-12-30 15:13:28 +0100
committerLaurenz <laurmaedje@gmail.com>2022-12-30 16:45:41 +0100
commitf70cea508cd30fa40770ea989fe2a19e715a357b (patch)
tree731bb96b375dc8fd0f7e5a2a7e1d1fe5cb2a600e /tests
parentfe1f4400693690b68db5a7ec0976ba998624a740 (diff)
Remove index syntax in favor of accessor methods
Diffstat (limited to 'tests')
-rw-r--r--tests/ref/compiler/array.pngbin6191 -> 9140 bytes
-rw-r--r--tests/ref/compiler/color.png (renamed from tests/ref/compiler/methods-color.png)bin506 -> 506 bytes
-rw-r--r--tests/ref/compiler/methods-collection.pngbin1384 -> 0 bytes
-rw-r--r--tests/typ/basics/enum.typ13
-rw-r--r--tests/typ/basics/terms.typ2
-rw-r--r--tests/typ/compiler/array.typ168
-rw-r--r--tests/typ/compiler/call.typ8
-rw-r--r--tests/typ/compiler/color.typ (renamed from tests/typ/compiler/methods-color.typ)0
-rw-r--r--tests/typ/compiler/dict.typ26
-rw-r--r--tests/typ/compiler/methods-collection.typ115
-rw-r--r--tests/typ/compiler/methods.typ2
-rw-r--r--tests/typ/compiler/ops-invalid.typ13
-rw-r--r--tests/typ/compiler/ops-prec.typ4
-rw-r--r--tests/typ/compiler/set.typ2
-rw-r--r--tests/typ/compiler/string.typ (renamed from tests/typ/compiler/methods-str.typ)31
-rw-r--r--tests/typ/compute/data.typ8
-rw-r--r--tests/typ/layout/repeat.typ2
17 files changed, 235 insertions, 159 deletions
diff --git a/tests/ref/compiler/array.png b/tests/ref/compiler/array.png
index cbda8aee..d41e2cbb 100644
--- a/tests/ref/compiler/array.png
+++ b/tests/ref/compiler/array.png
Binary files differ
diff --git a/tests/ref/compiler/methods-color.png b/tests/ref/compiler/color.png
index 9b65c16d..9b65c16d 100644
--- a/tests/ref/compiler/methods-color.png
+++ b/tests/ref/compiler/color.png
Binary files differ
diff --git a/tests/ref/compiler/methods-collection.png b/tests/ref/compiler/methods-collection.png
deleted file mode 100644
index e93e2beb..00000000
--- a/tests/ref/compiler/methods-collection.png
+++ /dev/null
Binary files differ
diff --git a/tests/typ/basics/enum.typ b/tests/typ/basics/enum.typ
index e651ca31..c1ce17b7 100644
--- a/tests/typ/basics/enum.typ
+++ b/tests/typ/basics/enum.typ
@@ -39,11 +39,14 @@
---
// Test numbering with closure.
#enum(
- start: 4,
- spacing: 0.65em - 3pt,
- tight: false,
- numbering: n => text(fill: (red, green, blue)(mod(n, 3)), numbering("A", n)),
- [Red], [Green], [Blue],
+ start: 4,
+ spacing: 0.65em - 3pt,
+ tight: false,
+ numbering: n => text(
+ fill: (red, green, blue).at(mod(n, 3)),
+ numbering("A", n),
+ ),
+ [Red], [Green], [Blue],
)
---
diff --git a/tests/typ/basics/terms.typ b/tests/typ/basics/terms.typ
index ba23f909..204defbf 100644
--- a/tests/typ/basics/terms.typ
+++ b/tests/typ/basics/terms.typ
@@ -40,7 +40,7 @@ No: list \
#show terms: it => table(
columns: 2,
inset: 3pt,
- ..it.items.map(item => (emph(item(0)), item(1))).flatten(),
+ ..it.items.map(item => (emph(item.at(0)), item.at(1))).flatten(),
)
/ A: One letter
diff --git a/tests/typ/compiler/array.typ b/tests/typ/compiler/array.typ
index cb8433cb..ccde8598 100644
--- a/tests/typ/compiler/array.typ
+++ b/tests/typ/compiler/array.typ
@@ -24,51 +24,187 @@
,)}
---
+// Test the `len` method.
+#test(().len(), 0)
+#test(("A", "B", "C").len(), 3)
+
+---
// Test lvalue and rvalue access.
{
let array = (1, 2)
- array(1) += 5 + array(0)
+ array.at(1) += 5 + array.at(0)
test(array, (1, 8))
}
---
+// Test different lvalue method.
+{
+ let array = (1, 2, 3)
+ array.first() = 7
+ array.at(1) *= 8
+ test(array, (7, 16, 3))
+}
+
+---
// Test rvalue out of bounds.
-// Error: 2-14 array index out of bounds (index: 5, len: 3)
-{(1, 2, 3)(5)}
+// Error: 2-17 array index out of bounds (index: 5, len: 3)
+{(1, 2, 3).at(5)}
---
// Test lvalue out of bounds.
{
let array = (1, 2, 3)
- // Error: 3-11 array index out of bounds (index: 3, len: 3)
- array(3) = 5
+ // Error: 3-14 array index out of bounds (index: 3, len: 3)
+ array.at(3) = 5
}
---
+// Test bad lvalue.
+// Error: 2:3-2:14 cannot mutate a temporary value
+#let array = (1, 2, 3)
+{ array.len() = 4 }
+
+---
+// Test bad lvalue.
+// Error: 2:3-2:15 type array has no method `yolo`
+#let array = (1, 2, 3)
+{ array.yolo() = 4 }
+
+---
// Test negative indices.
{
let array = (1, 2, 3, 4)
- test(array(0), 1)
- test(array(-1), 4)
- test(array(-2), 3)
- test(array(-3), 2)
- test(array(-4), 1)
+ test(array.at(0), 1)
+ test(array.at(-1), 4)
+ test(array.at(-2), 3)
+ test(array.at(-3), 2)
+ test(array.at(-4), 1)
}
---
-// Error: 2-15 array index out of bounds (index: -4, len: 3)
-{(1, 2, 3)(-4)}
+// The the `first` and `last` methods.
+#test((1,).first(), 1)
+#test((2,).last(), 2)
+#test((1, 2, 3).first(), 1)
+#test((1, 2, 3).last(), 3)
+
+---
+// Error: 3-13 array is empty
+{ ().first() }
---
-// Test non-collection indexing.
+// Error: 3-12 array is empty
+{ ().last() }
+---
+// Test the `push` and `pop` methods.
{
- let x = 10pt
- // Error: 3-4 expected collection, found length
- x() = 1
+ let tasks = (a: (1, 2, 3), b: (4, 5, 6))
+ tasks.at("a").pop()
+ tasks.b.push(7)
+ test(tasks.a, (1, 2))
+ test(tasks.at("b"), (4, 5, 6, 7))
}
---
+// Test the `insert` and `remove` methods.
+{
+ let array = (0, 1, 2, 4, 5)
+ array.insert(3, 3)
+ test(array, range(6))
+ array.remove(1)
+ test(array, (0, 2, 3, 4, 5))
+}
+
+---
+// Error: 2:17-2:19 missing argument: index
+#let numbers = ()
+{ numbers.insert() }
+---
+// Test the `slice` method.
+#test((1, 2, 3, 4).slice(2), (3, 4))
+#test(range(10).slice(2, 6), (2, 3, 4, 5))
+#test(range(10).slice(4, count: 3), (4, 5, 6))
+#test(range(10).slice(-5, count: 2), (5, 6))
+#test((1, 2, 3).slice(2, -2), ())
+#test((1, 2, 3).slice(-2, 2), (2,))
+#test((1, 2, 3).slice(-3, 2), (1, 2))
+#test("ABCD".split("").slice(1, -1).join("-"), "A-B-C-D")
+
+---
+// Error: 3-31 array index out of bounds (index: 12, len: 10)
+{ range(10).slice(9, count: 3) }
+
+---
+// Error: 3-25 array index out of bounds (index: -4, len: 3)
+{ (1, 2, 3).slice(0, -4) }
+
+---
+// Test the `position` method.
+#test(("Hi", "❀️", "Love").position(s => s == "❀️"), 1)
+#test(("Bye", "πŸ’˜", "Apart").position(s => s == "❀️"), none)
+#test(("A", "B", "CDEF", "G").position(v => v.len() > 2), 2)
+
+---
+// Test the `filter` method.
+#test(().filter(even), ())
+#test((1, 2, 3, 4).filter(even), (2, 4))
+#test((7, 3, 2, 5, 1).filter(x => x < 5), (3, 2, 1))
+
+---
+// Test the `map` method.
+#test(().map(x => x * 2), ())
+#test((2, 3).map(x => x * 2), (4, 6))
+
+---
+// Test the `fold` method.
+#test(().fold("hi", grid), "hi")
+#test((1, 2, 3, 4).fold(0, (s, x) => s + x), 10)
+
+---
+// Error: 21-31 function must have exactly two parameters
+{ (1, 2, 3).fold(0, () => none) }
+
+---
+// Test the `rev` method.
+#test(range(3).rev(), (2, 1, 0))
+
+---
+// Test the `join` method.
+#test(().join(), none)
+#test((1,).join(), 1)
+#test(("a", "b", "c").join(), "abc")
+#test("(" + ("a", "b", "c").join(", ") + ")", "(a, b, c)")
+
+---
+// Error: 2-22 cannot join boolean with boolean
+{(true, false).join()}
+
+---
+// Error: 2-20 cannot join string with integer
+{("a", "b").join(1)}
+
+---
+// Test joining content.
+// Ref: true
+{([One], [Two], [Three]).join([, ], last: [ and ])}.
+
+---
+// Test the `sorted` method.
+#test(().sorted(), ())
+#test(((true, false) * 10).sorted(), (false,) * 10 + (true,) * 10)
+#test(("it", "the", "hi", "text").sorted(), ("hi", "it", "text", "the"))
+#test((2, 1, 3, 10, 5, 8, 6, -7, 2).sorted(), (-7, 1, 2, 2, 3, 5, 6, 8, 10))
+
+---
+// Error: 2-26 cannot order content and content
+{([Hi], [There]).sorted()}
+
+---
+// Error: 2-18 array index out of bounds (index: -4, len: 3)
+{(1, 2, 3).at(-4)}
+
+---
// Error: 3 expected closing paren
{(}
diff --git a/tests/typ/compiler/call.typ b/tests/typ/compiler/call.typ
index dc582c9c..7ea0a998 100644
--- a/tests/typ/compiler/call.typ
+++ b/tests/typ/compiler/call.typ
@@ -48,25 +48,25 @@
#set text(family: "Arial", family: "Helvetica")
---
-// Error: 2-6 expected callable or collection, found boolean
+// Error: 2-6 expected function, found boolean
{true()}
---
#let x = "x"
-// Error: 1-3 expected callable or collection, found string
+// Error: 1-3 expected function, found string
#x()
---
#let f(x) = x
-// Error: 1-6 expected callable or collection, found integer
+// Error: 1-6 expected function, found integer
#f(1)(2)
---
#let f(x) = x
-// Error: 1-6 expected callable or collection, found content
+// Error: 1-6 expected function, found content
#f[1](2)
---
diff --git a/tests/typ/compiler/methods-color.typ b/tests/typ/compiler/color.typ
index 3b165d14..3b165d14 100644
--- a/tests/typ/compiler/methods-color.typ
+++ b/tests/typ/compiler/color.typ
diff --git a/tests/typ/compiler/dict.typ b/tests/typ/compiler/dict.typ
index d791f77b..0170cb8b 100644
--- a/tests/typ/compiler/dict.typ
+++ b/tests/typ/compiler/dict.typ
@@ -12,17 +12,17 @@
#dict
#test(dict.normal, 1)
-#test(dict("spacy key"), 2)
+#test(dict.at("spacy key"), 2)
---
// Test lvalue and rvalue access.
{
let dict = (a: 1, "b b": 1)
- dict("b b") += 1
+ dict.at("b b") += 1
dict.state = (ok: true, err: false)
test(dict, (a: 1, "b b": 2, state: (ok: true, err: false)))
test(dict.state.ok, true)
- dict("state").ok = false
+ dict.at("state").ok = false
test(dict.state.ok, false)
test(dict.state.err, false)
}
@@ -31,19 +31,31 @@
// Test rvalue missing key.
{
let dict = (a: 1, b: 2)
- // Error: 11-20 dictionary does not contain key "c"
- let x = dict("c")
+ // Error: 11-23 dictionary does not contain key "c"
+ let x = dict.at("c")
}
---
// Missing lvalue is automatically none-initialized.
{
let dict = (:)
- dict("b") += 1
+ dict.at("b") += 1
test(dict, (b: 1))
}
---
+// Test dictionary methods.
+#let dict = (a: 3, c: 2, b: 1)
+#test("c" in dict, true)
+#test(dict.len(), 3)
+#test(dict.values(), (3, 1, 2))
+#test(dict.pairs((k, v) => k + str(v)).join(), "a3b1c2")
+
+{ dict.remove("c") }
+#test("c" in dict, false)
+#test(dict, (a: 3, b: 1))
+
+---
// Error: 24-32 pair has duplicate key
{(first: 1, second: 2, first: 3)}
@@ -65,7 +77,7 @@
---
// Error: 3-15 cannot mutate a temporary value
-{ (key: value).other = "some" }
+{ (key: "val").other = "some" }
---
{
diff --git a/tests/typ/compiler/methods-collection.typ b/tests/typ/compiler/methods-collection.typ
deleted file mode 100644
index fcebf640..00000000
--- a/tests/typ/compiler/methods-collection.typ
+++ /dev/null
@@ -1,115 +0,0 @@
-// Test the collection methods.
-// Ref: false
-
----
-// Test the `len` method.
-#test(().len(), 0)
-#test(("A", "B", "C").len(), 3)
-#test("Hello World!".len(), 12)
-#test((a: 1, b: 2).len(), 2)
-
----
-// The the `first` and `last` methods.
-#test(().first(), none)
-#test(().last(), none)
-#test((1,).first(), 1)
-#test((2,).last(), 2)
-#test((1, 2, 3).first(), 1)
-#test((1, 2, 3).last(), 3)
-
----
-// Test the `push` and `pop` methods.
-{
- let tasks = (a: (1, 2, 3), b: (4, 5, 6))
- tasks("a").pop()
- tasks("b").push(7)
- test(tasks("a"), (1, 2))
- test(tasks("b"), (4, 5, 6, 7))
-}
-
----
-// Test the `insert` and `remove` methods.
-{
- let array = (0, 1, 2, 4, 5)
- array.insert(3, 3)
- test(array, range(6))
- array.remove(1)
- test(array, (0, 2, 3, 4, 5))
-}
-
----
-// Error: 2:17-2:19 missing argument: index
-#let numbers = ()
-{ numbers.insert() }
-
----
-// Test the `slice` method.
-#test((1, 2, 3, 4).slice(2), (3, 4))
-#test(range(10).slice(2, 6), (2, 3, 4, 5))
-#test(range(10).slice(4, count: 3), (4, 5, 6))
-#test(range(10).slice(-5, count: 2), (5, 6))
-#test((1, 2, 3).slice(2, -2), ())
-#test((1, 2, 3).slice(-2, 2), (2,))
-#test((1, 2, 3).slice(-3, 2), (1, 2))
-#test("ABCD".split("").slice(1, -1).join("-"), "A-B-C-D")
-
----
-// Error: 3-31 array index out of bounds (index: 12, len: 10)
-{ range(10).slice(9, count: 3) }
-
----
-// Error: 3-25 array index out of bounds (index: -4, len: 3)
-{ (1, 2, 3).slice(0, -4) }
-
----
-// Test the `position` method.
-#test(("Hi", "❀️", "Love").position(s => s == "❀️"), 1)
-#test(("Bye", "πŸ’˜", "Apart").position(s => s == "❀️"), none)
-#test(("A", "B", "CDEF", "G").position(v => v.len() > 2), 2)
-
----
-// Test the `rev` method.
-#test(range(3).rev(), (2, 1, 0))
-
----
-// Test the `join` method.
-#test(().join(), none)
-#test((1,).join(), 1)
-#test(("a", "b", "c").join(), "abc")
-#test("(" + ("a", "b", "c").join(", ") + ")", "(a, b, c)")
-
----
-// Error: 2-22 cannot join boolean with boolean
-{(true, false).join()}
-
----
-// Error: 2-20 cannot join string with integer
-{("a", "b").join(1)}
-
----
-// Test joining content.
-// Ref: true
-{([One], [Two], [Three]).join([, ], last: [ and ])}.
-
----
-// Test the `sorted` method.
-#test(().sorted(), ())
-#test(((true, false) * 10).sorted(), (false,) * 10 + (true,) * 10)
-#test(("it", "the", "hi", "text").sorted(), ("hi", "it", "text", "the"))
-#test((2, 1, 3, 10, 5, 8, 6, -7, 2).sorted(), (-7, 1, 2, 2, 3, 5, 6, 8, 10))
-
----
-// Error: 2-26 cannot order content and content
-{([Hi], [There]).sorted()}
-
----
-// Test dictionary methods.
-#let dict = (a: 3, c: 2, b: 1)
-#test("c" in dict, true)
-#test(dict.len(), 3)
-#test(dict.values(), (3, 1, 2))
-#test(dict.pairs((k, v) => k + str(v)).join(), "a3b1c2")
-
-{ dict.remove("c") }
-#test("c" in dict, false)
-#test(dict, (a: 3, b: 1))
diff --git a/tests/typ/compiler/methods.typ b/tests/typ/compiler/methods.typ
index 07f6e410..f468320b 100644
--- a/tests/typ/compiler/methods.typ
+++ b/tests/typ/compiler/methods.typ
@@ -9,7 +9,7 @@
// Test mutating indexed value.
{
let matrix = (((1,), (2,)), ((3,), (4,)))
- matrix(1)(0).push(5)
+ matrix.at(1).at(0).push(5)
test(matrix, (((1,), (2,)), ((3, 5), (4,))))
}
diff --git a/tests/typ/compiler/ops-invalid.typ b/tests/typ/compiler/ops-invalid.typ
index 3d41a3d1..d51e42fb 100644
--- a/tests/typ/compiler/ops-invalid.typ
+++ b/tests/typ/compiler/ops-invalid.typ
@@ -90,14 +90,14 @@
{
let x = 2
for _ in range(61) {
- x *= 2
+ (x) *= 2
}
// Error: 4-18 cannot repeat this string 4611686018427387904 times
{x * "abcdefgh"}
}
---
-// Error: 3-6 cannot mutate a temporary value
+// Error: 4-5 unknown variable
{ (x) = "" }
---
@@ -105,6 +105,15 @@
{ 1 + 2 += 3 }
---
+// Error: 2:2-2:7 cannot apply 'not' to string
+#let x = "Hey"
+{not x = "a"}
+
+---
+// Error: 7-8 unknown variable
+{ 1 + x += 3 }
+
+---
// Error: 3-4 unknown variable
{ z = 1 }
diff --git a/tests/typ/compiler/ops-prec.typ b/tests/typ/compiler/ops-prec.typ
index 23afcc5f..eba0c8a9 100644
--- a/tests/typ/compiler/ops-prec.typ
+++ b/tests/typ/compiler/ops-prec.typ
@@ -12,8 +12,10 @@
#test("a" == "a" and 2 < 3, true)
#test(not "b" == "b", false)
+---
// Assignment binds stronger than boolean operations.
-// Error: 2-7 cannot mutate a temporary value
+// Error: 2:2-2:7 cannot mutate a temporary value
+#let x = false
{not x = "a"}
---
diff --git a/tests/typ/compiler/set.typ b/tests/typ/compiler/set.typ
index 7414ad5e..034bfab8 100644
--- a/tests/typ/compiler/set.typ
+++ b/tests/typ/compiler/set.typ
@@ -40,7 +40,7 @@ Hello *{x}*
// Test relative path resolving in layout phase.
#let choice = ("monkey.svg", "rhino.png", "tiger.jpg")
#set enum(numbering: n => {
- let path = "../../res/" + choice(n - 1)
+ let path = "../../res/" + choice.at(n - 1)
move(dy: -0.15em, image(path, width: 1em, height: 1em))
})
diff --git a/tests/typ/compiler/methods-str.typ b/tests/typ/compiler/string.typ
index aead4aa4..8ac515a5 100644
--- a/tests/typ/compiler/methods-str.typ
+++ b/tests/typ/compiler/string.typ
@@ -2,6 +2,35 @@
// Ref: false
---
+// Test the `len` method.
+#test("Hello World!".len(), 12)
+
+---
+// Test the `first` and `last` methods.
+#test("Hello".first(), "H")
+#test("Hello".last(), "o")
+#test("πŸ³οΈβ€πŸŒˆAπŸ³οΈβ€βš§οΈ".first(), "πŸ³οΈβ€πŸŒˆ")
+#test("πŸ³οΈβ€πŸŒˆAπŸ³οΈβ€βš§οΈ".last(), "πŸ³οΈβ€βš§οΈ")
+
+---
+// Error: 3-13 string is empty
+{ "".first() }
+
+---
+// Error: 3-12 string is empty
+{ "".last() }
+
+---
+// Test the `at` method.
+#test("Hello".at(1), "e")
+#test("Hello".at(4), "o")
+#test("Hey: πŸ³οΈβ€πŸŒˆ there!".at(5), "πŸ³οΈβ€πŸŒˆ")
+
+---
+// Error: 3-16 string index out of bounds (index: 5, len: 5)
+{ "Hello".at(5) }
+
+---
// Test the `slice` method.
#test("abc".slice(1, 2), "b")
#test("abc🏑def".slice(2, 7), "c🏑")
@@ -57,7 +86,7 @@
let time = 0
for match in text.matches(regex("(\d+):(\d+)")) {
let caps = match.captures
- time += 60 * int(caps(0)) + int(caps(1))
+ time += 60 * int(caps.at(0)) + int(caps.at(1))
}
str(int(time / 60)) + ":" + str(mod(time, 60))
}
diff --git a/tests/typ/compute/data.typ b/tests/typ/compute/data.typ
index 5a0f76c6..dc563022 100644
--- a/tests/typ/compute/data.typ
+++ b/tests/typ/compute/data.typ
@@ -19,8 +19,8 @@
// Ref: true
#set page(width: auto)
#let data = csv("/res/zoo.csv")
-#let cells = data(0).map(strong) + data.slice(1).flatten()
-#table(columns: data(0).len(), ..cells)
+#let cells = data.at(0).map(strong) + data.slice(1).flatten()
+#table(columns: data.at(0).len(), ..cells)
---
// Error: 6-16 file not found (searched at typ/compute/nope.csv)
@@ -34,8 +34,8 @@
// Test reading JSON data.
#let data = json("/res/zoo.json")
#test(data.len(), 3)
-#test(data(0).name, "Debby")
-#test(data(2).weight, 150)
+#test(data.at(0).name, "Debby")
+#test(data.at(2).weight, 150)
---
// Error: 7-22 failed to parse json file: syntax error in line 3
diff --git a/tests/typ/layout/repeat.typ b/tests/typ/layout/repeat.typ
index 3b5459c9..82d64b94 100644
--- a/tests/typ/layout/repeat.typ
+++ b/tests/typ/layout/repeat.typ
@@ -12,7 +12,7 @@
)
#for section in sections [
- #section(0) #repeat[.] #section(1) \
+ {section.at(0)} #repeat[.] {section.at(1)} \
]
---