Coding Dojo #19 Kata Poker Detector

Outro encontro utilizando o BDD, metodologia de desenvolvimento que tem causado interessantes discussões no dojo, alguns estão gostando do BDD e outros preferem o TDD.

Kata
O desafio foi fazer um detector de Jogadas de Pocker, consiste em informar um conjunto de 5 cartas para o detector que deverá identificar a maior jogada possível com aquele conjunto e retornar o nome da jogada.
O kata foi retirado do post Relato de um super Dojo Rio, do blog do Dojo Rio.

Código Fonte: https://gist.github.com/742078
features/poker.feature

# language: pt

Funcionalidade: Detectar jogada de Poker
  Para jogar poker
  E com um baralho com um naipe apenas
  Como um jogador
  Eu quero ver as possíveis combinações 

  Cenario: Royal flush
    Dado que estou jogando
    Quando eu tenho as cartas "dez", "valete", "dama", "reis" e "as" 
    Entao eu tenho um "royal flush"
  
  Cenario: Straight flush
    Dado que estou jogando
    Quando eu tenho as cartas "quatro", "cinco", "seis", "sete" e "oito" 
    Entao eu tenho um "straight flush"
  
  Cenario: flush
    Dado que estou jogando
    Quando eu tenho as cartas "as", "dama", "seis", "valete" e "dois" 
    Entao eu tenho um "flush"
  
  Cenario: Royal flush fora de ordem
    Dado que estou jogando
    Quando eu tenho as cartas "valete", "dama", "dez", "reis" e "as" 
    Entao eu tenho um "royal flush"

step_definitions/poker_steps.rb

# encoding: uft-8
# step_definitions/poker_steps.rb


Dado /^que estou jogando$/ do
  @game = Game.new
end

Quando 
/^eu tenho as cartas "([^\"]*)", "([^\"]*)", "([^\"]*)", "([^\"]*)" e "([^\"]*)"$/ 
do |arg1, arg2, arg3, arg4, arg5|
  @game.cards(arg1, arg2, arg3, arg4, arg5)
end

Entao /^eu tenho um "([^\"]*)"$/ do |arg1|
  @game.jogadas_possiveis.should == arg1 
end

game.rb

# lib/game.rb

class Game
	
	def initialize()
		@royal_flush = %w(dez valete dama reis as)
		@straight_flush = %w(quatro cinco seis sete oito)
	end
	
	def cards(*card)
		@card = card
	end
	
	def jogadas_possiveis
		
			
		if @card.sort == @straight_flush.sort
			"straight flush"
		elsif @card.sort == @royal_flush.sort
			"royal flush"
		else
			"flush"
		end
	end
	
end

env.rb

# features/support/env.rb

$:.unshift(File.dirname(__FILE__) + '/../../lib') 
require 'game'

Retrospectiva

O que foi bom ou o que devemos continuar fazendo?

* todos participaram
* kata legal e compreensível
* textamate foi legal
* todos estão tendo o contato com o Mac OS X
* cucumber
* o código ruby ficou legal
* uso de features do ruby
* salomão elogiando o terminal
* projetor

O que foi ruim ou o que devemos fazer de outra maneira ?

* cucumber
* falta de teste unitário
* não utilizando o cucumber para testar o estado
* falta de atenção da platéia
* os pilotos não falarem em voz alta o que estavam fazendo
* menos inibição quando estiver pilotando
* receio de fatorar o cenários de testes (cucumber)

Para os próximos encontros:

* tempo de duração do kata de 2 horas, a contar a partir da escolha do kata, talvez com intervalo de 15 minutos com lanche
* tirar foto do coffee break

Organizadores
O encontro desta semana foi organizado por Patricia Carvalho & Marco Moura

Imagens do encontro