Arrays
An array is classified as a table of incrementing number keys that start at 1
, and without any holes.
In typescript, the distinction between an object
and an array
is pretty black and white, while in lua, this
distinction is usually lost.
@rbxts/expect
attempts to rectify this by providing helper methods for checking arrays.
API
Is an Array
You can use the array method to check if a provided value is actually an array.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.be.an.array();
Example error
Expected '{"name": "Daymon"}' to be an array, but it had a non number key 'name' (string)
Array type
You can use an overload on the array method to check if an array contains elements all of a certain type.
This includes support for checkable types, t checks, and even user-defined callbacks.
import { expect, TypeCheckCallback } from "@rbxts/expect";
import t from "@rbxts/t";
const isNumber: TypeCheckCallback = (value) => {
return typeOf(value) === "number";
};
expect([1, 2, 3]).to.be.an.arrayOf("number");
expect([1, 2, 3]).to.be.an.arrayOf(t.number);
expect([1, 2, 3]).to.be.an.arrayOf(isNumber);
Example error
Expected '[1,2,3]' to be an array of type 'string', but there was an element that was a 'number'
Index: 1
Value: 1
Includes
You can use the includes method to check if a value is present in the array.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.include(4);
Example error
Expected '[1,2,3]' to include '4', but it was missing
Empty
You can use the empty method to check if an array contains any elements.
import { expect } from "@rbxts/expect";
expect([]).to.be.empty();
Example error
Expected '[1,2,3]' to be empty, but it had 3 elements
Length
You can use the length method to check if an array has a certain amount of elements.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.have.a.lengthOf(3);
Example error
Expected '[1,2]' to have exactly '3' element(s), but it actually had '2'
Deep equal
You can use the deepEqual method to check if two arrays are deeply equal to one another.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.deepEqual([1, 2, 3]);
Example error
Expected '[1,2]' to deep equal '[1]', but there were extra elements
Expected: '[1]'
Actual: '[1,2]'
Extra Elements: '[2]'
Starts with
You can use the startsWith method to check if an array starts with another array.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.startWith([1, 2]);
Example error
Expected '[1,2,3]' to be an array that starts with '[1,4,5]', but it was missing 2 elements
Missing: '[4,5]'
Ends with
You can use the endsWith method to check if an array ends with another array.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.endWith([2, 3]);
Example error
Expected '[1,2,3,4]' to be an array that ends with '[1,2,4]', but it was missing 2 elements
Missing: '[1,2]'
All
You can use the all method to check if all the elments in an array pass some condition.
import { expect } from "@rbxts/expect";
expect([2, 4, 6]).to.all((it) => it % 2 === 0);
expect(["Bryce", "Bryan"]).to.all(`start with "Bry"`, (it) => startsWith(it, "Bry"));
Example error
Expected '["Bryce", "Bryan", "Daymon"]' to all start with "Bry", but there was an element that failed the check
Index: 3
Value: "Daymon"
Some
You can use the some method to check if an array passes some condition.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.have.some((it) => it % 2 === 0);
expect(["Daymon", "Bryan"]).to.have.some(`starts with "Bry"`, (it) => startsWith(it, "Bry"));
Example error
Expected '["Byron", "Bryan"]' to have atleast one element that starts with "Day"
Contain exactly
You can use the containsExactly method to check if an array deeply contains all of the elements in another array, with no regard for order and without any extra elements.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.containExactly([3, 2, 1]);
Example error
Expected '[1,2]' to contain exactly '[1,2,3]', but it was missing elements
Missing elements: '[3]'
Contain exactly in order
You can use the containsExactlyInOrder method to check if an array deeply contains all of the elements in another array, without any extra elements and in the same order.
import { expect } from "@rbxts/expect";
expect([1, 2, 3]).to.containsExactlyInOrder([1, 2, 3]);
Example error
Expected '[1,2,3]' to contain exactly '[1,3,2]', but it had a different value for the element at '[1]'
Expected [1]: '3'
Actual [1]: '2'