• Rust 83.6%
  • Shell 16.4%
Find a file
Jonatas Oliveira a53c9be75b
All checks were successful
ci/woodpecker/push/pipelines/2 Pipeline was successful
ci/woodpecker/push/pipelines/1 Pipeline was successful
ci/woodpecker/cron/pipelines/1 Pipeline was successful
ci/woodpecker/cron/pipelines/2 Pipeline was successful
fix(hooks): reprovar quando o teste de mutação não gera mutante nenhum
Um teto sobre zero mutantes aprova sem medir. Foi o que aconteceu no
battleship-client: as exclusões do .cargo/mutants.toml cobriam o crate
inteiro, o cargo-mutants dizia "Found 0 mutants" e a checagem imprimia
`sobreviventes=0 teto=0` -- que se lê como perfeição e significa silêncio.
O hook levava 2 segundos e não verificava nada.

Agora, se a soma de caught, missed, unviable e timeout for zero, a etapa
falha e diz o que fazer: encolher as exclusões ou remover o
.mutants-teto. Um portão que aprova sem medir é pior do que portão
nenhum, porque dá a impressão de cobertura que não existe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhdPjHUuVhXaitwT4mG53t
2026-09-08 06:35:29 +02:00
.cargo test: add property-based and mutation-guard suites 2026-09-01 21:10:27 +02:00
.githooks fix(hooks): reprovar quando o teste de mutação não gera mutante nenhum 2026-09-08 06:35:29 +02:00
.woodpecker ci: tirar a mutação do pipeline e rodar o CI inteiro no pre-commit 2026-09-05 06:21:41 +02:00
src build(deps): upgrade to Rust 1.98, edition 2024 and latest crates 2026-09-01 21:10:27 +02:00
tests test: add property-based and mutation-guard suites 2026-09-01 21:10:27 +02:00
.gitignore test: add property-based and mutation-guard suites 2026-09-01 21:10:27 +02:00
.mutants-teto test: add property-based and mutation-guard suites 2026-09-01 21:10:27 +02:00
Cargo.lock build(deps): upgrade to Rust 1.98, edition 2024 and latest crates 2026-09-01 21:10:27 +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:05 +02:00
README.md ci: tirar a mutação do pipeline e rodar o CI inteiro no pre-commit 2026-09-05 06:21:41 +02:00

Blackjack

Blackjack de terminal, escrito como protótipo de curso de Rust.

O jogo distribui duas cartas para você e duas para a banca, mostrando só uma das dela. Você pede carta (h) enquanto quiser, ou para (s). A banca então compra até chegar a 17. Quem chegar mais perto de 21 sem estourar, ganha.

cargo run

O que este projeto exercita

  • Enums com comportamento: Suit, Rank e GameResult carregam métodos em vez de virarem match espalhados pelo código.
  • Ás flexível: Hand::value soma o ás como 11 e o rebaixa para 1 enquanto a mão estiver estourada — o laço em value() é o coração da regra.
  • Injeção de dependência para testar: run_game_with_deck recebe o baralho pronto, e play_game recebe leitor e escritor genéricos. É o que torna possível testar uma partida inteira sem terminal e sem sorte.
  • Erros de domínio: BlackjackError::DeckVazio em vez de unwrap num pop() que pode falhar.

Testes

cargo test                    # 108 testes
cargo test --test spider      # propriedades (proptest)
cargo test --test mutantes    # testes nascidos do cargo-mutants
cargo mutants                 # índice de mutação: 0 sobreviventes

As duas suítes em tests/ estão documentadas no cabeçalho de cada arquivo e valem a leitura: spider varre o espaço de entradas em vez de fixar casos, e mutantes existe porque cobertura de 98% não impedia que o corpo de clear_terminal fosse trocado por um Ok(()) mudo sem quebrar nenhum teste.

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, cobertura (piso 98%), 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.