No description
  • Rust 97.3%
  • Shell 2.7%
Find a file
Jonatas Oliveira 7cede2fddf
All checks were successful
ci/woodpecker/push/pipelines/1 Pipeline was successful
ci/woodpecker/push/pipelines/2 Pipeline was successful
fix(hooks): consertar onde o teste de mutação grava e onde ele compila
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
2026-09-05 12:23:43 +02:00
.cargo test: add property-based and mutation-guard suites 2026-09-01 21:10:41 +02:00
.githooks fix(hooks): consertar onde o teste de mutação grava e onde ele compila 2026-09-05 12:23:43 +02:00
.woodpecker ci: tirar a mutação do pipeline e rodar o CI inteiro no pre-commit 2026-09-05 06:23:46 +02:00
src fix: tie the debug-info field to the builds that read it 2026-09-03 08:43:44 +02:00
tests test: add property-based and mutation-guard suites 2026-09-01 21:10:41 +02:00
.gitignore test: add property-based and mutation-guard suites 2026-09-01 21:10:41 +02:00
.mutants-teto test: add property-based and mutation-guard suites 2026-09-01 21:10:41 +02:00
Cargo.lock build(deps): upgrade to Rust 1.98 and ratatui 0.30 2026-09-01 21:10:41 +02:00
Cargo.toml fix(build): declare the real minimum toolchain, not the local one 2026-09-02 15:33:44 +02:00
LICENSE docs: add a README and the GPLv3 licence text 2026-09-01 22:20:29 +02:00
README.md ci: tirar a mutação do pipeline e rodar o CI inteiro no pre-commit 2026-09-05 06:23:46 +02:00

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: EventManager e o trait GameObserver desacoplam o jogo de quem reage a ele. GameStats e ConsoleLogger são observadores; a interface não precisa saber que existem.
  • Geração e busca: o labirinto é gerado com garantia de solução, e find_path faz busca em largura — que devolve o caminho mais curto e é verificada por propriedade.
  • Tipos que impedem erro: Position só existe com coordenadas não negativas, e move_in_direction devolve Option em vez de estourar um usize na borda.
  • Interface testável: App::ui desenha num Frame qualquer, então os testes renderizam num TestBackend e 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.