Guia 15 de 53
Deriving e testes nomeados
Produtores de derive compartilhados e títulos preservados pelo runner.
Nesta página
Produtores de derive compartilhados e títulos preservados pelo runner.
Deriving uniforme¶
Adicione um sufixo deriving a structs e enums para solicitar os produtores existentes. O sufixo usa a mesma validação e implementação gerada dos decorators de derive. Traits não suportados e tipos de campos incompatíveis geram diagnóstico, sem criar implementações não verificadas.
Pratique na By Example · Programa fonte
// 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)Testes com nomes legíveis¶
Uma declaração test usa um título entre aspas e o runner existente. Descoberta, filtros, relatórios e navegação do editor preservam esse título. Atributos e suites existentes continuam disponíveis. Executar o arquivo normalmente não roda seus testes: use zolo test.
Pratique na By Example · Programa fonte
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") }Execute este exemplo com zolo test localmente ou use o botão de testes no playground do navegador. A execução comum não roda as declarações test.
Execute os testes no playground do navegador
Continue aprendendo¶
DOCS / OPINIÃO
Esta página deixou alguma pergunta?
Conte onde a explicação perdeu você. A documentação também faz parte da experiência da linguagem.