Ruth venceu
. A intenção é eventualmente criar uma ferramenta para ajudar usuários a jogar pôquer.liga
atualize de acordo com as vitórias gravadas nessa nova aplicação.main.go
que inicia um servidor HTTP. O servidor HTTP não é nosso interesse neste exercício mas a abstração usada é. Ele depende de ArmazenamentoJogador
.SistemaDeArquivoArmazenamentoJogador
que implementa essa mesma interface. Temos que poder reutilizar parte dela para a nossa nova aplicação.$GOPATH/src/github.com/seu-nome/meu-app
main
dentro de um package main
. Até agora todo nosso código viveu dentro de package main
e a função func main
pode referenciar tudo.cmd
com uma chamada webserver
dentro dela (ex: mkdir -p cmd/webserver
).main.go
para dentro dessa pasta.tree
instalado você pode executar sua estrutura de pastas tem que parecermain
.poquer
.main.go
para utilizá-lo na criação de nosso servidor web. Então podemos usar nossa biblioteca chamando poquer.NomeDaFunção
.go get
.go test
e valide que ainda está passandocmd/webserver
e rode go run main.go
http://localhost:5000/liga
e veja que ainda está funcionandocmd
chamado cli
(command line interface) e adicione um arquivo main.go
com{NomeDoJogador} venceu
.CLI
que vai nos permitir Jogar
poquer. Isso vai precisar ler o que o usuário digita e então gravar a vitória no armazenamento ArmazenamentoJogador
.ArmazenamentoJogador
funciona como gostaríamos.CLI_test.go
(no diretório raiz do projeto, não dentro de cmd
)EsbocoArmazenamentoJogador
de outros testesCLI
JogarPoquer
CLI
struct (estrutura de dados) com os respectivos campos necessários para nossa dependência e adicionar um método.Stdin
(o que o usuário digita) para que fique registrado vitórias para jogadores específicos.os.Stdin
é o que vamos usar no main
para capturar o que for digitado pelo usuário. Ele é um *File
por trás dos panos o que siginifica que implementa io.Reader
o qual sabemos ser um jeito útil de capturar texto.io.Reader
no nosso teste usando strings.NewReader
, preenchendo ele com o que esperamos que o usuário digite../CLI_test.go:12:32: too many values in struct initializer
CLI
.server_test
anteriormente fizemos validações para saber se uma vitória é armazenada assim como temos aqui. Vamos mover essa validação para dentro de um helper e manter o código DRY.server_test.go
e CLI_test.go
.O pacote bufio implementa [buffered](https://pt.wikipedia.org/wiki/Buffer_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)) I/O. Ele encapsula um objeto io.Reader ou io.Writer, criando um outro objeto (Reader ou Writer) que também implementa a interface mas prover buffering e ajuda com entradas/saídas de textos.
Scanner.Scan()
vai ler até o carácter de nova linha.Scanner.Text()
para returnar a string
lida pelo scanner.main
. Lembre-se que devemos sempre almejar ter o código funcionando totalmente integrado o mais rápido que pudermos.main.go
adicione o seguinte e execute. (você pode ter que ajustar o caminho da segunda dependência para refletir o que tem no seu computador)armazenamentoJogador
e in
na CLI
. Eles são campos não exportados(privados). Nós podemos fazer isso nos nossos testes porque o teste está no mesmo pacote da CLI
(poquer
). Mas nosso main
é um pacote main
portanto não tem acesso.CLI
como privada (porque não queremos expô-las para os usuários da CLI
) mas não criamos uma forma para os usuário construí-las.package mypackage_test
main
)?_test
. Fazendo isso você somente ter acesso aos tipos públicos no seu pacote. Isso ajuda nesse caso especificamente mas também ajuda a disciplinar o teste somente de APIs públicas. Se ainda assim você precisar testar coisa interna você pode criar um teste separado com o nome de pacote igual ao do que você quer testar.package foo_test
vai forçar você à testar seu código como se você estivesse importando ele como vão fazer aqueles que importarem o seu pacote.main
vamos mudar o nome de pacote do nosso teste dentro de CLI_test.go
para poquer_test
.CLI_test
porque eles foram definidos somente nos arquivos com _test.go
no pacote poquer
.poquer
não tem que criar seus próprios ArmazenamentoJogador
emulados se eles quiserem usar nosso código.testing.go
e adicionar nossos cógidos auxiliares nele.CLI
você precisa chamar o código como se fosse usando de um pacote diferente.main
CLI
para que ele armazene a bufio.Scanner
ao invés do leitor pois ele vai ser automaticamente encapsulado no momento da construção.main.go
e usar o construtor que acabamos de criarArmazenamentoSistemaArquivo
a partir do seu conteúdo. Isso parece uma pequena fraqueza no desenho do nosso pacote então deveríamos fazer uma função nele para encapsular a abertura de arquivos dado um caminho e retornar a ArmazenamentoJogador
.ArmazenamentoSistemaDeArquivoJogadorAPartirDeArquivo
retorna uma função close
(fechar), que podemos encerrar o arquivo fundamental assim que terminarmos de usar o armazenamento.main
s.mypackage_test
ajudou a criar um ambiente de testes que prover a mesma experiência de outros pacotes integrando com nosso código, assim ajudando você a pegar problemas de integração e ver o quão fácil (ou não) é de usar seu código.os.Stdin
é muito fácil de usar pois ele implementa o io.Reader
. Nós usamos bufio.Scanner
para facilitar a leitura linha à linha do que o usuário digita.ArmazenamentoJogador
na nossa aplicação (assim que fizemos alguns ajustes no pacode) e subsequente testar foi muito fácil tambem porque nós decidimos também expor a versão emulada.