These tests test whether Mavo functions produce correct results.
Remember, MavoScript doesn't support {} for object literals, either use group()
or $fn.
in front of every function you call.
addition("1", 1) | 2 |
addition("", "") | 0 |
addition("3", "5") | 8 |
addition([1, 2, 3]) | 6 |
addition([1, 2, 3], [4, 5]) | [5, 7, 3] |
subtract(1, 2) | -1 |
subtract(1, -2) | 3 |
subtract(1, 0) | 1 |
minus(1) | -1 |
divide(4, 2) | 2 |
divide([4,2], [2]) | [2,2] |
divide([4], [2,2]) | [2,2] |
and(0, true) | 0 |
and([0, 1, 2, 3], [true, true, false]) | [0, true, false, false] |
and([true, true, false], [0, 1, 2, 3]) | [0, 1, false, false] |
or(true, false, false) | true |
or(false, false, false) | false |
eq(3, 3, 3, 3) | true |
eq("l","l") | true |
gt(3, 2, 1) | true |
lt(1, 2, 3) | true |
lt(1, 2, 1) | false |
gt(3, 2, 3) | false |
gt("2090-06-13", $now) | true |
gt("1990-06-13", $now) | false |
neq(2, 2) | false |
neq(foo, bar) | true |
neq(2, 2, 3) | false |
Unary Functions
ordinal([1,2,3,4]) | ["st","nd","rd","th"] |
len(["foobar", 314]) | [6,3] |
idify(["Foo bar", "BarBaz"]) | ["foo-bar","barbaz"] |
readable(["foo-bar", "BarBaz"]) | ["Foo bar","Bar baz"] |
uppercase(["foobar", "bar baz"]) | ["FOOBAR","BAR BAZ"] |
lowercase(["FOOBAR", "BAR BAZ"]) | ["foobar","bar baz"] |
filename(["mavo.io/foo.html", "mavo.io/bar?q=baz"]) | ["foo.html","bar"] |
Unary Math Functions
abs([-2,3]) | [2,3] |
floor([3.5,4.9]) | [3,4] |
sqrt([16,25]) | [4,5] |
Binary Functions
atan2([0,5], [2,5]) * 180 / PI | [0,45] |
atan2([0,5], [2,5,0]) * 180 / PI | [0,45,0] |
atan2([0,5,0], [2,5]) * 180 / PI | [0,45,0] |
pow([2,3], [3,2]) | [8,9] |
pow([3], [2,2]) | [9,1] |
pow([3,4], [2]) | [9,4] |
imul([2,3], [4,5]) | [8,15] |
imul([2], [4,5]) | [8,5] |
imul([2,3], [4]) | [8,3] |
round([5.85, -5.05], 0) | [6,-5] |
round([5.85, -5.05, 6.5], [1, 0]) | [5.9,-5,7] |
round([5.85, -5.05], [1, 0, 3]) | [5.9,-5,3] |
search([34, "foobar"], [3, bar]) | [0,3] |
search([34, "foobar", "baz"], [3, "bar"]) | [0,3,-1] |
search([34, "foobar"], [3, bar, "baz"]) | [0,3,-1] |
starts([34, "foobar"], [3, bar]) | [true,false] |
starts([34, "foobar", "baz"], [3, "bar"]) | [true,false,false] |
starts([34, "foobar"], [3, bar, "baz"]) | [true,false,false] |
ends([34, "foobar"], [3, bar]) | [false,true] |
ends([34, "foobar", "baz"], [3, "bar"]) | [false,true,false] |
ends([34, "foobar"], [3, bar, "baz"]) | [false,true,false] |
from(["foo.bar", "barbaz"], [".", "b"]) | ["bar","arbaz"] |
from(["foo.bar", "barbaz", "foobar"], [".", "b"]) | ["bar","arbaz","foobar"] |
from(["foo.bar", "barbaz"], [".", "b", "foobar"]) | ["bar","arbaz",""] |
fromlast(["foo.bar", "barbaz"], [".", "b"]) | ["bar","az"] |
fromlast(["foo.bar", "barbaz", "foobar"], [".", "b"]) | ["bar","az","foobar"] |
fromlast(["foo.bar", "barbaz"], [".", "b", "foobar"]) | ["bar","az",""] |
to(["foo.bar", "barbaz"], [".", "a"]) | ["foo","barb"] |
to(["foo.bar", "barbaz", "foobar"], [".", "a"]) | ["foo","barb","foobar"] |
to(["foo.bar", "barbaz"], [".", "a", "foobar"]) | ["foo","barb",""] |
tofirst(["foo.bar", "barbaz"], [".", "a"]) | ["foo","b"] |
tofirst(["foo.bar", "barbaz", "foobar"], [".", "a"]) | ["foo","b","foobar"] |
tofirst(["foo.bar", "barbaz"], [".", "a", "foobar"]) | ["foo","b",""] |
split(["foo.bar", "bar,baz"], [".", ","]) | [["foo", "bar"], ["bar", "baz"]] |
split(["foo.bar", "bar.baz"], ".") | [["foo", "bar"], ["bar", "baz"]] |
split(["foo bar", "bar baz"]) | [["foo", "bar"], ["bar", "baz"]] |
Polynary Functions
random(1, 1, 1) | 1 |
random([1,2,3], [1,2,3], 1) | [1,2,3] |
random([1,2], [1,2,0], 1) | [1,2,0] |
between(["foo.bar!baz", "foo!bar!baz"], [".", "!"], "!") | ["bar","bar"] |
digits([2, 1], [2, 4], 3.1415) | ["03.14", "3.1415"] |
replace(["foobar", "barbaz"], ["oo", "bar"], "aa") | ["faabar", "aabaz"] |
split("afbfc", "f") | ["a", "b", "c"] |
split("a b", " ") | ["a", "b"] |
group(name: 'Lea', age: 32) | {"name":"Lea","age":32} |
list(1, 2, 3) | [1, 2, 3] |
list() | [] |
list(0) | [0] |
list([1, 2], [2, 3]) | [1, 2, 2, 3] |
list([1, 2], 2) | [1, 2, 2] |
list([1, 2]) | [1, 2] |
average() | 0 |
average(1) | 1 |
average(null, 1, 2, 3, null, "") | 2 |
average([null, 1, 2, 3, null, ""]) | 2 |
median() | 0 |
median(1) | 1 |
median([1, 2]) | 1.5 |
median([null, 1, 2, 3, null, ""]) | 2 |
iff(4, 1, 2) | 1 |
iff([1, 0], 1, 2) | [1, 2] |
iff([1, 0], [1, 2], [3, 4]) | [1, 4] |
iff([true, false, 0, 1], 1, [2, 3]) | [1, 3, 3, 1] |
"yolo" & 2 | "yolo2" |
[1, "hello"] & "#" | ["1#", "hello#"] |
[1, 2, 3] & "#" & ["a", "b", "c"] | ["1#a", "2#b", "3#c"] |
$fn.get(bar: 4, "bar") | 4 |
$fn.get(group(), "bar") | null |
$fn.get(null, "bar") | null |
$fn.get(group(foo: 1, foO: 2), "FOO") | 1 |
$fn.get(group(foo: 1, foO: 2), "foO") | 2 |
$fn.get(foo: undefined, "foo") | undefined |
$fn.get(group(foo: undefined, foO: 1), "foo") | undefined |
$fn.get([group(id: "foo", name: "fooname"), group(id: "bar", name: "barname")], "id=foo").name | "fooname" |
$fn.get([group(id: "foo", name: "fooname"), group(id: "bar", name: "barname")], "id=bar").name | "barname" |
$fn.get([group(id: "foo", name: "fooname"), group(id: "bar", name: "barname")], "name=fooname") | [{"id":"foo","name":"fooname"}] |
$fn.get([group(id: "foo", name: "fooname"), group(id: "bar", name: "barname")], "name") | ["fooname", "barname"] |
$fn.get($fn.get([group(id: "foo", name: "fooname"), group(id: "bar", name: "barname")], "name=barname"), "id") | ["bar"] |
from("foo", ".") | "" |
from("foo.bar", ".") | "bar" |
from("foo.bar.baz", ".") | "bar.baz" |
fromlast("foo.bar.baz", ".") | "baz" |
to("foo", ".") | "" |
to("foo.bar", ".") | "foo" |
to("foo.bar.baz", ".") | "foo.bar" |
tofirst("foo.bar.baz", ".") | "foo" |
between("foo.bar.baz", ".", ".") | "bar" |
between("foo.bar.baz", "#", "$") | "" |
$fn.contains(group(name: "Kenneth", work: "MIT", interests: [group(food: "rice", type: "white"), "coding"]), "rice") | true |
$fn.contains(["Lea", "Kenneth", "Amy",], "Kenneth") | [false, true, false] |
$fn.contains(["Kenneth", "Amy", group(name: "Kenneth")], "Kenneth") | [true, false, true] |
$fn.contains(["Kenneth", [6, "Kenneth"], "MIT"], "Kenneth") | [true, true, false] |
$fn.contains(group(name: "Kenneth", work: "MIT", interests: [group(food: "rice"), "coding"]), group(food: "rice")) | true |
$fn.contains(["Kenneth", "MIT", group(food: "rice", type: "white")], group(food: "rice", type: "white")) | [false, false, true] |
$fn.contains("Kenneth", ["Kenneth", "Lea"]) | [true, false] |
$fn.contains(["Kenneth", "Verou"], ["Kenneth", "Lea"]) | [true, false] |
$fn.contains(["Kenneth", "Lea", "Amy"], ["Kenneth", "Lea"]) | [true, true, false] |
contains(["Kenneth", "Lea"], ["Kenneth", "Lea", "Amy"]) | [true, true, false] |
$fn.contains([["Kenneth", "Lea"], "Amy"], ["Kenneth", "Lea"]) | [true, false] |
$fn.contains(group(name: "Kenneth", work: "MIT", interest: ["coding", group(food: "rice", quantity: 6)]), ["Kenneth", "rice"]) | [true, true] |
$fn.contains(["Kenneth", group(food: "rice", quantity: 6), "MIT"], ["Kenneth", "6"]) | [true, true, false] |
contains(null, null) | false |
contains("foo", null) | false |
contains(null, "foo") | false |
contains() | false |
contains("foo") | false |
contains("0", 0) | true |
contains([], "foo") | [] |
filter(42, false) | null |
filter(42, true) | 42 |
filter(42) | 42 |
filter([1, 2]) | [1, 2] |
filter([1, 2, 3], [false, true, false]) | [null, 2, null] |
filter([1, 2, 3], [true, true, false], [false, true, false]) | [null, 2, null] |
filter([1, 2, 3, 2], 2) | [null, 2, null, 2] |
filter([1, 2, 3, 4], [true, false, true]) | [1, null, 3, null] |
filter([1, 2, 3], [true, false, true, true]) | [1, null, 3] |
filter([1, 2, 3, 4], [true, false, true], 3) | [null, null, 3, null] |
filter([1, 2, 3, 4], 3, [true, false, true]) | [null, null, 3, null] |
has(1, [1, 2, 3]) | true |
$fn.has(foo: 1, [foo: 1, 2, 3]) | true |
has(1, 1) | true |
has(1, 2) | false |
has(1, [numberObject1, 2, 3]) | true |
has([1, 4], [1, 2, 3]) | [true, false] |
$fn.has('foo', foo: 1) | true |
$fn.has(['foo', 'bar'], foo: 1) | [true, false] |
replace("foooo", "o", "aa") | "faaaaaaaa" |
replace(["bar", "baz"], "a", "o") | ["bor", "boz"] |
replace("foooo", "oo", "o") | "foo" |
replace("foooo", "oo", "o", 10) | "fo" |
replace("fo", "o", "oo", 2) | "foooo" |
idify(" Foo ^ Bar ") | "foo-bar" |
idify("property ↔ Collection") | "property-collection" |
idify("pâté") | "pate" |
idify("Chicken Liver Pâté! 😋") | "chicken-liver-pate" |
intersects([1], [1]) | true |
intersects([1, 2], [1, 3]) | true |
intersects([1, 2], [3, 4]) | false |
intersection() | null |
intersection(null, null) | null |
intersection([1], null) | null |
intersection(null, [1]) | null |
intersection([1], [1]) | [1] |
intersection([1, 2], [1, 3]) | [1] |
intersection([1, 1, 2], [1, 3, 1]) | [1, 1] |
intersection([1, 2], [3, 4]) | [] |
intersection([], [3, 4]) | [] |
intersection([1, 2], []) | [] |
reverse([1, 2, 3, 4, 5]) | [5, 4, 3, 2, 1] |
reverse([-3, 2, 0, 1, -5, 3]) | [3, -5, 1, 0, 2, -3] |
reverse(["a", "b", "c", "z"]) | ["z", "c", "b", "a"] |
range(1, 10) | [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |
range(3) | [1, 2, 3] |
range(-3) | [-1, -2, -3] |
range(-5, 1) | [-5, -4, -3, -2, -1, 0, 1] |
range(1, 3.5) | [1, 2, 3] |
range(.5, 3) | [.5, 1.5, 2.5] |
range(3, 1) | [3, 2, 1] |
range(.5, 3, .5) | [.5, 1, 1.5, 2, 2.5, 3] |
range(1, 3, 0) | [1] |
range(1, 3, -1) | [1] |
digits(2, 1234.5678) | "34.5678" |
digits(2, 0, 1234.5678) | "34" |
digits(2, 5, 1234.5678) | "34.56780" |
digits(2, 1) | "01" |
digits(2, 2, 0) | "00.00" |
digits(0) | null |
first() | null |
first(3) | 3 |
first([]) | null |
first(null) | null |
first([1, 2, 3]) | 1 |
first(["a", "b", "c"]) | "a" |
$fn.first(["prop": 1, "prop": 2]) | {"prop": 1} |
first(3, [1, 2, 3, 4, 5]) | [1,2,3] |
first([null, null, 1, null, 2, 3]) | 1 |
first([null, null, null]) | null |
first(3, [null, null, 1, null, 2, 3, null, 4, 5, null]) | [1,2,3] |
first(6, [null, null, 1, null, 2, 3, null, 4, 5, null]) | [1,2,3,4,5] |
first(5, [null, null, null]) | [] |
first([0, 1, 2, 3, 0]) | 0 |
first(2, [0, 1, 2, 3, 0]) | [0,1] |
$fn.first(group("prop1": 1, "prop2": 2)) | {"prop1": 1, "prop2": 2} |
first(0, [1, 2, 3]) | [] |
first(1, [1, 2, 3]) | [1] |
first(2.5, [1, null, 2, 3]) | [1,2] |
first(-2.5, [1, 2, 3]) | [3,2] |
first(-0.1, [1, 2, 3]) | [] |
first(0.5, [1, 2, 3]) | [] |
first(1, 5) | [5] |
last() | null |
last(3) | 3 |
last([]) | null |
last(null) | null |
last([1, 2, 3]) | 3 |
last(["a", "b", "c"]) | "c" |
$fn.last(["prop": 1, "prop": 2]) | {"prop": 2} |
last(3, [1, 2, 3, 4, 5]) | [5,4,3] |
last([null, null, 1, null, 2, 3, null, null]) | 3 |
last([null, null, null]) | null |
last(3, [null, null, 1, null, 2, 3, null, 4, 5, null]) | [5,4,3] |
last(6, [null, null, 1, null, 2, 3, null, 4, 5, null]) | [5,4,3,2,1] |
last(5, [null, null, null]) | [] |
last([0, 1, 2, 3, 0]) | 0 |
last(2, [0, 1, 2, 3, 0]) | [0,3] |
$fn.last(group("prop1": 1, "prop2": 2)) | {"prop1": 1, "prop2": 2} |
last(0, [1, 2, 3]) | [] |
last(1, [1, 2, 3]) | [3] |
last(2.5, [1, 2, null, 3]) | [3,2] |
last(-2.5, [1, 2, 3]) | [1,2] |
last(-0.1, [1, 2, 3]) | [] |
last(0.5, [1, 2, 3]) | [] |
last(1, 5) | [5] |
$fn.groupBy([group(n: "a", a: 20), group(n: "a", a: 10), group(n: "a", a: 20), group(n: "a", a: 30)], $fn.as([20, 10, 20, 30], age)) | [{"$value":20,"age":20,"$items":[{"n":"a","a":20},{"n":"a","a":20}]},{"$value":10,"age":10,"$items":[{"n":"a","a":10}]},{"$value":30,"age":30,"$items":[{"n":"a","a":30}]}] |
$fn.groupBy([group(n: "a", a: 20), group(n: "a", a: 10), group(n: "a", a: 20), group(n: "a", a: 30)], $fn.as([20, 10, 20, 30, 40, 50], age)) | [{"$value":20,"age":20,"$items":[{"n":"a","a":20},{"n":"a","a":20}]},{"$value":10,"age":10,"$items":[{"n":"a","a":10}]},{"$value":30,"age":30,"$items":[{"n":"a","a":30}]}] |
$fn.groupBy([group(n: "a", a: 20), group(n: "a", a: 10), group(n: "a", a: 20), group(n: "a", a: 30)], [1,2,3]) | [{"$value":1,"$items":[{"n":"a","a":20}]},{"$value":2,"$items":[{"n":"a","a":10}]},{"$value":3,"$items":[{"n":"a","a":20}]},{"$value":null,"$items":[{"n":"a","a":30}]}] |
$fn.groupBy([group(n: "a", a: 20), group(n: "a", a: 10), group(n: "a", a: 20), group(n: "a", a: 30)], $fn.as([1,2,3],"num")) | [{"$value":1,"num":1,"$items":[{"n":"a","a":20}]},{"$value":2,"num":2,"$items":[{"n":"a","a":10}]},{"$value":3,"num":3,"$items":[{"n":"a","a":20}]},{"$value":null,"num":null,"$items":[{"n":"a","a":30}]}] |
$fn.count( $fn.groupBy([group(n: "a", a: 20), group(n: "a", a: 10), group(n: "a", a: 20), group(n: "a", a: 30)], [20, 10, 20, 30]) ) | [2,1,1] |
$fn.sum( $fn.as([20, 10, 20, 30]) ) | 80 |
duration(0) | "0 ms" |
duration(0, 1) | ["0 ms"] |
duration(0, 2) | ["0 ms"] |
duration(1) | "1 ms" |
duration(999) | "999 ms" |
duration(1000) | "1 second" |
duration(60*60*1000) | "1 hour" |
duration(3*7*24*60*60*1000) | "3 weeks" |
duration(3*7*24*60*60*1000, 1) | ["3 weeks"] |
duration(3*7*24*60*60*1000, 4) | ["3 weeks"] |
duration((3*7*24 + 3) * 60*60*1000, 4) | ["3 weeks"] |
duration(60*60*1000+1, 1) | ["1 hour"] |
duration(60*60*1000+1, 2) | ["1 hour"] |
duration(60*60*1000+1, 5) | ["1 hour"] |
duration(7*24*60*60*1000) | "1 week" |
duration(2*31*24*60*60*1000, "day") | "62 days" |
duration(2*31*24*60*60*1000, "days") | "62 days" |
duration(24*60*60*1000, "day") | "1 day" |
duration(24*60*60*1000, "days") | "1 day" |
duration(7*24*60*60*1000,2) | ["1 week"] |
duration(3*7*24*60*60*1000+4*24*60*60*1000+1000,3) | ["3 weeks", "4 days"] |
duration(2*31*24*60*60*1000) | "2 months" |
duration(2*31*24*60*60*1000, 2) | ["2 months"] |
duration(6*52*7*24*60*60*1000+2*31*24*60*60*1000) | "6 years" |
duration(6*52*7*24*60*60*1000 + 2*31*24*60*60*1000,4) | ["6 years", "2 months"] |
duration(-2*3600*1000) | "-2 hours" |
duration(-72*3600*1000) | "-3 days" |
duration(-72*3600*1000 + -2*3600*1000 + -51*60*1000 + -29*1000 + -81) | "-3 days" |
duration(-72*3600*1000 + -2*3600*1000 + -51*60*1000 + -29*1000 + -81, 5) | ["-3 days", "-2 hours", "-51 minutes", "-29 seconds", "-81 ms"] |
duration(-72*3600*1000 + -2*3600*1000 + -51*60*1000 + -29*1000 + -81, 2) | ["-3 days", "-2 hours"] |
duration(-72*3600*1000 + -2*3600*1000 + -51*60*1000 + -29*1000 + -81, "days") | "-3 days" |
duration(-72*3600*1000 + -2*3600*1000 + -51*60*1000 + -29*1000 + -81, "hours") | "-74 hours" |
pluralize(1, "country", "countries") | "1 country" |
pluralize(2, "country", "countries") | "2 countries" |
pluralize(2, many: "countries", one: "country") | "2 countries" |
pluralize(0.5, "country", "countries") | "0.5 countries" |
pluralize(-1, "country", "countries") | "-1 country" |
pluralize(1, "χώρα", "χώρες", lang: 'el') | "1 χώρα" |
pluralize(2, "χώρα", "χώρες", lang: 'el') | "2 χώρες" |
pluralize(1, one: 'страна', few: 'страны', many: 'стран', lang: 'ru') | "1 страна" |
[pluralize(1, one: 'страна', few: 'страны', many: 'стран')] [pluralize(2, one: 'страна', few: 'страны', many: 'стран')] [pluralize(5, one: 'страна', few: 'страны', many: 'стран')] | 1 страна 2 страны 5 стран |
url("foo", url: "https://mavo.io?foo=bar") | "bar" |
url("bar", url: "https://mavo.io?bar&foo=bar") | "" |
url("foo", url: "https://mavo.io/foo") | "" |
url("foo", url: "https://mavo.io/foo/bar") | "bar" |
url("bar", url: "https://mavo.io/foo/bar/baz") | "baz" |
url("foo", url: "https://mavo.io/foo/bar/baz") | "bar" |
url("foo", url: "https://mavo.io/foo/bar?foo=baz") | "baz" |
url("foo", url: "https://mavo.io/foo/bar?foo=baz", type: "query") | "baz" |
url("foo", url: "https://mavo.io/foo/bar?foo=baz", type: "path") | "bar" |
url("Foo", url: "https://mavo.io/Foo/bar?foo=baz", case_sensitive: true) | "bar" |
url("Foo", url: "https://mavo.io/Foo/bar?Foo=baz", case_sensitive: true) | "baz" |
url("foo", url: "https://mavo.io/foo/bar?foo=baz", multiple: true) | ["baz"] |
url("foo", url: "https://mavo.io/foo/bar?foo=baz", multiple: true, type: "path") | ["bar"] |
url("foo", url: "https://mavo.io/foo/bar?foo=baz&foo=yolo", multiple: true) | ["baz", "yolo"] |
url("foo", url: "https://mavo.io/foo", multiple: true) | [""] |
url("Foo", case_sensitive: true, multiple: true, url: "https://mavo.io/foo/bar?Foo=baz&foo=yolo") | ["baz"] |
url("foo", url: "https://mavo.io/Foo/bar", case_sensitive: true) | null |
url("baz", url: "https://mavo.io/foo/bar?foo=baz", multiple: true) | [] |
url("") | null |
url("", multiple: true) | [] |
url("foo", url: "https://mavo.io?foo=Pâté") | "Pâté" |
url("foo", url: "https://mavo.io?foo=foo%26bar") | "foo&bar" |
url("foo", url: "https://mavo.io?foo=bar", baz: "yolo") | "bar" |
Click here first for these tests to pass.
url() | "https://test.mavo.io/functions.html?foo=bar" |
url("foo") | "bar" |