typst/tests/lang/typ/expr-binary.typ
2021-02-12 22:55:26 +01:00

132 lines
2.7 KiB
Typst

// Test binary expressions.
// Ref: false
---
// Test template addition.
// Ref: true
{[*Hello ] + [world!*]}
---
// Test math operators.
// Addition.
#[test 2 + 4, 6]
#[test "a" + "b", "ab"]
#[test (1, 2) + (3, 4), (1, 2, 3, 4)]
#[test (a: 1) + (b: 2, c: 3), (a: 1, b: 2, c: 3)]
// Subtraction.
#[test 1-4, 3*-1]
#[test 4cm - 2cm, 2cm]
#[test 1e+2-1e-2, 99.99]
// Multiplication.
#[test 2 * 4, 8]
// Division.
#[test 12pt/.4, 30pt]
#[test 7 / 2, 3.5]
// Combination.
#[test 3-4 * 5 < -10, true]
#[test { #let x; x = 1 + 4*5 >= 21 and { x = "a"; x + "b" == "ab" }; x }, true]
// Mathematical identities.
#let nums = (1, 3.14, 12pt, 45deg, 90%, 13% + 10pt)
#for v #in nums {
// Test plus and minus.
test(v + v - v, v)
test(v - v - v, -v)
// Test plus/minus and multiplication.
test(v - v, 0 * v)
test(v + v, 2 * v)
// Integer addition does not give a float.
#if type(v) != "integer" {
test(v + v, 2.0 * v)
}
// Linears cannot be divided by themselves.
#if type(v) != "linear" {
test(v / v, 1.0)
test(v / v == 1, true)
}
}
// Make sure length, relative and linear
// - can all be added to / subtracted from each other,
// - multiplied with integers and floats,
// - divided by floats.
#let dims = (10pt, 30%, 50% + 3cm)
#for a #in dims {
#for b #in dims {
test(type(a + b), type(a - b))
}
#for b #in (7, 3.14) {
test(type(a * b), type(a))
test(type(b * a), type(a))
test(type(a / b), type(a))
}
}
---
// Test boolean operators.
// And.
#[test false and false, false]
#[test false and true, false]
#[test true and false, false]
#[test true and true, true]
// Or.
#[test false or false, false]
#[test false or true, true]
#[test true or false, true]
#[test true or true, true]
// Short-circuiting.
#[test false and dont-care, false]
#[test true or dont-care, true]
---
// Test equality operators.
#[test 1 == "hi", false]
#[test 1 == 1.0, true]
#[test 30% == 30% + 0cm, true]
#[test 1in == 0% + 72pt, true]
#[test 30% == 30% + 1cm, false]
#[test "ab" == "a" + "b", true]
#[test () == (1,), false]
#[test (1, 2, 3) == (1, 2.0) + (3,), true]
#[test (:) == (a: 1), false]
#[test (a: 2 - 1.0, b: 2) == (b: 2, a: 1), true]
#[test [*Hi*] == [*Hi*], true]
#[test "a" != "a", false]
#[test [*] != [_], true]
---
// Test comparison operators.
#[test 13 * 3 < 14 * 4, true]
#[test 5 < 10, true]
#[test 5 > 5, false]
#[test 5 <= 5, true]
#[test 5 <= 4, false]
#[test 45deg < 1rad, true]
---
// Test assignment operators.
#let x = 0
{ x = 10 } #[test x, 10]
{ x -= 5 } #[test x, 5]
{ x += 1 } #[test x, 6]
{ x *= x } #[test x, 36]
{ x /= 2.0 } #[test x, 18.0]
{ x = "some" } #[test x, "some"]
{ x += "thing" } #[test x, "something"]