Custom types
During testing, custom types may be involved - that is, values that are not one of the Godot built-in types. These types can be best used with vest by implementing specific methods.
Assertions
.equals(other)- When checking for equality, vest will use this method if implemented. Its
only argument is the value it's being compared to. It should return
trueif the object equals the parameter. - Used in:
expect_equal(),expect_not_equal(),assert_that().is_equal_to(),assert_that().is_not_equal_to() .is_empty()- When checking for emptiness, vest will use this method if implemented. It should return true if the object is considered empty.
- Used in:
expect_empty(),expect_not_empty(),assert_that().is_empty(),assert_that().is_not_empty() .has(item)- When checking if an object contains an item, vest will use this method if
implemented. It should return
trueif the object contains theitem. - Used in:
expect_contains(),expect_does_not_contain(),assert_that().contains(),assert_that().does_not_contain()
Serialization
Running tests with custom types can result in reports such as below:

When running a test, vest spins up a separate Godot process to do so. Once the tests have ran, the report is serialized to simple Godot types ( dictionaries, arrays, etc. ), and then sent over to the editor.
This also means that for custom types, vest uses a safe fallback for serialization, in some cases resulting in reports that are difficult to read.
Implementing _to_vest() bridges this gap - vest will call this method to
serialize the object. Note that this method may return anything - including
other custom types. Vest will try and recursively serialize those.
Let's take a value-holder class for example:
class CustomData:
var _value: Variant
func _init(p_value: Variant):
_value = p_value
func equals(other):
if other == null:
return false
if not (other is CustomData):
return false
return other._value == _value
func _to_vest():
return { "value": _value }
And use it in a test:
extends VestTest
func get_suite_name():
return "Custom data types"
func suite():
test("Custom type", func():
var a := CustomData.new(2)
var b := CustomData.new("foo")
# Test report will contain a proper representation, instead of RefData<#...>
expect_equal(a, b)
)
extends VestTest
func get_suite_name():
return "Custom data types"
func test_custom_type():
var a := CustomData.new(2)
var b := CustomData.new("foo")
# Test report will contain a proper representation, instead of RefData<#...>
expect_equal(a, b)
Running the test will fail with a readable report.