No description
  • Rust 92.7%
  • Shell 7.3%
Find a file
Jonatas Oliveira c8dd5899fe
All checks were successful
ci/woodpecker/push/pipelines Pipeline was successful
test(spider): a propriedade dos dois jogadores exigia nomes distintos
O CI derrubou `partida_aceita_dois_jogadores_e_recusa_o_terceiro` com
`nome1 = "r", nome2 = "r", nome3 = "a"`. Os dois primeiros jogadores
receberam o mesmo id, e o terceiro foi aceito em vez de recusado.

Não é defeito do servidor: entrar com um nome que já está na partida é
reconexão, por desenho. O `join_game` devolve o id que aquele jogador já
tinha e não consome a vaga -- é o que permite fechar o navegador e voltar
para a mesma partida, e é o que os testes de unidade
`test_join_game_reconnection` já afirmavam.

A propriedade é que estava escrita como se três nomes quaisquer fossem
três jogadores. Ganha `prop_assume!` de nomes distintos.

E a regra que o proptest encontrou por acidente passa a ser afirmada de
propósito, em `entrar_com_o_nome_de_quem_ja_esta_e_reconexao`: a
reconexão devolve o mesmo id, não consome a vaga do segundo jogador, vale
também para o segundo, e continua valendo com a partida cheia.

O caso só aparecia quando o proptest sorteava nomes iguais -- raro com
nomes de até 12 letras, e por isso passou despercebido localmente até o
runner tirar a carta.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PhdPjHUuVhXaitwT4mG53t
2026-09-08 12:22:36 +02:00
.cargo refactor: hold only this crate, and stand on its own 2026-09-03 13:28:26 +02:00
.githooks fix(hooks): reprovar quando o teste de mutação não gera mutante nenhum 2026-09-08 06:58:19 +02:00
.woodpecker ci: tirar a mutação do pipeline e rodar o CI inteiro no pre-commit 2026-09-05 07:37:48 +02:00
src refactor: hold only this crate, and stand on its own 2026-09-03 13:28:26 +02:00
tests test(spider): a propriedade dos dois jogadores exigia nomes distintos 2026-09-08 12:22:36 +02:00
.gitignore refactor: hold only this crate, and stand on its own 2026-09-03 13:28:26 +02:00
.mutants-teto refactor: hold only this crate, and stand on its own 2026-09-03 13:28:26 +02:00
Cargo.toml refactor: hold only this crate, and stand on its own 2026-09-03 13:28:26 +02:00
LICENSE docs: add a README and the GPLv3 licence text 2026-09-01 22:20:42 +02:00
README.md ci: tirar a mutação do pipeline e rodar o CI inteiro no pre-commit 2026-09-05 07:37:48 +02:00

battleship-server

Servidor do Batalha Naval: axum com WebSocket, partidas persistidas em sled.

cargo run
cargo test

As regras não moram aqui. Elas vêm de battleship-common, declarada como dependência git — é o que permite compilar este repositório sozinho, sem o diretório irmão por perto.

Onde ele se encaixa

Este repositório contém só o servidor. Ele também entra como submódulo no repositório battleship, que junta os três crates num workspace; lá o [patch] da raiz redireciona battleship-common para a cópia local, e a compilação integrada usa o código do diretório ao lado em vez da ponta de main.

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 90%) e auditoria de dependências.

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.