Guide 15 of 53
Deriving and named tests
Shared derive producers and test titles preserved by the runner.
On this page
Shared derive producers and test titles preserved by the runner.
Uniform deriving¶
Add a deriving suffix to structs and enums to request existing derive producers. The suffix uses the same validation and generated implementations as derive decorators. Unsupported traits or incompatible field types are diagnosed rather than synthesizing an unchecked implementation.
Practice in By Example · Source program
// Uniform requests use the existing producer registry and real builtins.
@derive_for(Marker)
fn marker(info) -> Syntax<.Items> {
return quote items { impl ${info.ref} { fn marker(self) -> int { 37 } } }
}
@derive(Clone)
struct User { id: int, name: str } deriving Eq, Hash
let user = User { id: 1, name: "Ada" }
print(user.eq(User { id: 1, name: "Ada" }))
print(user.eq(User { id: 1, name: "Bea" }))
print(user.clone().name)
print(user.hash())
print(user.eq(User { id: 1, name: "Ada" }) && user.hash() == User { id: 1, name: "Ada" }.hash())
print(user.hash() != User { id: 2, name: "Ada" }.hash())
struct Counter(value: int) { fn read(self) -> int { self.value } } deriving Clone
print(Counter.new(7).clone().read())
enum State(Ready, Busy) deriving Eq, Marker
let state: State = .Ready
print(state.marker())
print(state.eq(State::Ready))
print(state.eq(State::Busy))
enum Shape { Empty, Point(int), Pair(int, str), Rect { width: int, height: int } } deriving Eq
print(Shape::Pair(7, "Ada").eq(Shape::Pair(7, "Ada")))
print(Shape::Pair(7, "Ada").eq(Shape::Pair(7, "Bea")))
print(Shape::Rect { width: 2, height: 3 }.eq(Shape::Rect { width: 2, height: 4 }))
struct Envelope<T: core::cmp::Eq + core::hash::Hash> { value: T } deriving Eq, Hash
let nested = Envelope { value: user }
print(nested.hash())
print(nested.eq(Envelope { value: User { id: 1, name: "Ada" } }))
struct Empty {} deriving Eq, Hash
print(Empty {}.hash())
struct Text { value: str } deriving Eq, Hash
print(Text { value: "ação" }.hash())
print(Text { value: "" }.hash())
newtype Id(int) deriving Eq, Hash
print(Id.new(8).hash())
print(Id.new(8).eq(Id.new(9)))
struct Defaults { count: int } deriving Default
print(Defaults.default().count)Human-readable tests¶
A test declaration uses a quoted human title and the existing test runner. Discovery, filtering, reports and editor navigation keep that title. Existing test attributes and suites remain available. Running the file normally does not execute its tests: use zolo test.
Practice in By Example · Source program
fn total(values: [int]) -> int {
var sum = 0
for value in values { sum += value }
return sum
}
@test(tag: "cart")
test "empty cart has zero total" { assert_eq(total([]), 0) }
@suite("cart suite")
mod cart {
test "empty cart" { assert_eq(0, 0) }
@test(skip: "example of existing attributes")
test "pending cart rule" { assert_eq(1, 1) }
}
fn main() { print("run preserves ordinary test behavior") }Run this example with zolo test locally, or use the test button in the browser playground. Ordinary Run does not execute test declarations.
Run tests in the browser playground
Continue learning¶
DOCS / FEEDBACK
Did this page leave a question?
Tell us where the explanation lost you. Documentation is part of the language experience.