- Rust 97.3%
- Shell 2.7%
Duas correções no `mutacao()`, ambas descobertas rodando o hook nos quinze repositórios. `--output .`: o cargo-mutants grava o `mutants.out` na raiz do WORKSPACE, não no diretório de onde foi chamado. Nos repositórios que também são membros de um workspace maior o relatório ia parar um nível acima, fora do repositório, e a checagem do teto não achava o arquivo -- reprovando um crate que não tinha deixado nenhum mutante escapar (o battleship-common foi reprovado assim, com 65 mutantes e 0 sobreviventes). TMPDIR no disco: o cargo-mutants copia a árvore e compila a cópia no TMPDIR, que aqui é /tmp em tmpfs -- memória. Uma árvore de build do `iced` dentro dele esgotou a RAM da máquina. O scratch passa a ficar em ~/.cache/cargo-mutants, com CARGO_MUTANTS_TMPDIR para quem quiser outro lugar. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PhdPjHUuVhXaitwT4mG53t |
||
|---|---|---|
| .cargo | ||
| .githooks | ||
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| .mutants-teto | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Labirinto
Jogo de labirinto em terminal com interface ratatui, escrito como
protótipo de curso de Rust.
Um labirinto é gerado a cada partida e você o percorre com WASD ou as
setas até a saída. H abre a ajuda, ESPAÇO pausa, R recomeça e Q
sai.
cargo run
O que este projeto exercita
- Padrão observador:
EventManagere o traitGameObserverdesacoplam o jogo de quem reage a ele.GameStatseConsoleLoggersão observadores; a interface não precisa saber que existem. - Geração e busca: o labirinto é gerado com garantia de solução, e
find_pathfaz busca em largura — que devolve o caminho mais curto e é verificada por propriedade. - Tipos que impedem erro:
Positionsó existe com coordenadas não negativas, emove_in_directiondevolveOptionem vez de estourar umusizena borda. - Interface testável:
App::uidesenha numFramequalquer, então os testes renderizam numTestBackende conferem o que saiu.
Testes
cargo test # 480 testes
cargo test --test spider # propriedades (proptest)
cargo test --test mutantes # testes nascidos do cargo-mutants
cargo mutants # teto de 35 sobreviventes, todos documentados
O teto de mutação não é zero de propósito: os sobreviventes restantes
estão listados no fim de tests/mutantes/main.rs com o motivo de cada
um — mutantes equivalentes, código inalcançável e uma função que exige
terminal de verdade. Dois deles são achado sobre o próprio código: as
comparações de dy dentro do ramo dx == 0 de hint_direction nunca
são alcançadas.
Verificações antes do commit
O .githooks/pre-commit roda aqui o que o Woodpecker roda no servidor. Ele
é gerado a partir do .woodpecker/pipelines.yml deste repositório, então os
comandos não podem divergir do CI. Ative uma vez por clone -- o hook é
versionado, a configuração que aponta para ele não é:
git config core.hooksPath .githooks
Roda tudo a cada git commit, do mais barato ao mais caro, e para no
primeiro que falhar: lint do pipeline, cargo fmt --check, clippy com -D warnings, build, testes, documentação sem buracos, build release, cobertura
(piso 95%), auditoria de dependências e a perna MSRV 1.90.
O teste de mutação só existe aqui. Ele saiu do pipeline: mutação
recompila o crate uma vez por mutante, e no runner isso eram dezenas de
minutos por push, num passo que ninguém acompanha enquanto espera. O teto
continua em .mutants-teto, versionado -- a regra não afrouxou, mudou de
lugar. É de longe a etapa mais lenta; para pular só ela:
PRE_COMMIT_SEM_MUTACAO=1 git commit ...
Para pular tudo, git commit --no-verify. Um hook que não se pode pular é
um hook que todo mundo desativa.
Licença
GPL-3.0-or-later. Veja LICENSE.