package poker.domain

import poker.domain.Valor._
import poker.domain.Naipe._
import org.testng.annotations._
import org.junit.Assert._
import poker.PokerHelperTest._

class MaoTest {

  @Test
  def umaMaoInicialmenteNaoPossuiCartas() {
    var mao = new Mao()
    assertEquals(0, mao.quantidadeDeCartas())
  }

  @Test
  def umaMaoAceitaDuasCartas() {
    var mao = new Mao()
    mao.push(new Carta(4, OUROS))

    assertEquals(1, mao.quantidadeDeCartas())
    assertNotNull(mao(0))
    
    mao.push(new Carta(6, ESPADAS))
    
    assertEquals(2, mao.quantidadeDeCartas())
    assertNotNull(mao(1))
  }
  
  @Test
  def lancaUmErroSeTentarAdicionarUmaTerceiraCartaAMao() {
    var mao = new Mao()
    mao.push(new Carta(4, OUROS))
    mao.push(new Carta(5, OUROS))
    try {
      mao.push(new Carta(6, OUROS))
      fail("ops, nao lancou excecao")
    } catch {
      case e:RuntimeException => assertTrue(true)
      case _ => fail("ops, excecao errada")
    }
  }
  
  @Test
  def listaDeCombinacoesPossiveisOrdenadas() {
    var mao = criaMao((AS, PAUS), (AS, COPAS))
    var mesa = criaMesa((2, PAUS), (4, COPAS), (7, OUROS), (9, ESPADAS), (K, COPAS))
    
    var c1 = c((AS, PAUS), (AS, COPAS), (2, PAUS), (4, COPAS), (7, OUROS))
    var c2 = c((AS, PAUS), (AS, COPAS), (2, PAUS), (4, COPAS), (9, ESPADAS))
    var c4 = c((AS, PAUS), (AS, COPAS), (2, PAUS), (7, OUROS), (9, ESPADAS))
    var c7 = c((AS, PAUS), (AS, COPAS), (4, COPAS), (7, OUROS), (9, ESPADAS))
    var c3 = c((AS, PAUS), (AS, COPAS), (2, PAUS), (4, COPAS), (K, COPAS))
    var c5 = c((AS, PAUS), (AS, COPAS), (2, PAUS), (7, OUROS), (K, COPAS))
    var c8 = c((AS, PAUS), (AS, COPAS), (4, COPAS), (7, OUROS), (K, COPAS))
    var c6 = c((AS, PAUS), (AS, COPAS), (2, PAUS), (9, ESPADAS), (K, COPAS))
    var c9 = c((AS, PAUS), (AS, COPAS), (4, COPAS), (9, COPAS), (K, COPAS))
    var c10 = c((AS, PAUS), (AS, COPAS), (7, PAUS), (9, COPAS), (K, COPAS))
    
    var combinacoes = mao.combinacoes(mesa)

    assertEquals(c1, combinacoes(0))
    assertEquals(c2, combinacoes(1))
    assertEquals(c4, combinacoes(2))
    assertEquals(c7, combinacoes(3))
    assertEquals(c3, combinacoes(4))
    assertEquals(c5, combinacoes(5))
    assertEquals(c8, combinacoes(6))
    assertEquals(c6, combinacoes(7))
    assertEquals(c9, combinacoes(8))
    assertEquals(c10, combinacoes(9))
  }
  
  @Test
  def combinacaoMaisAlta() {
    var mao = criaMao((AS, PAUS), (AS, COPAS))
    var mesa = criaMesa((2, PAUS), (4, COPAS), (7, OUROS), (9, ESPADAS), (K, COPAS))
    
    var c10 = c((AS, PAUS), (AS, COPAS), (7, PAUS), (9, COPAS), (K, COPAS))
    
    assertEquals(c10, mao.melhorCombinacao(mesa))
  }
  
  @Test
  def equals() {
    var mao1 = criaMao((AS, PAUS), (AS, COPAS))
    var mao2 = criaMao((AS, PAUS), (AS, COPAS))
    assertTrue(mao1 == mao2)
    
    mao1 = criaMao((AS, PAUS), (AS, OUROS))
    mao2 = criaMao((AS, PAUS), (AS, COPAS))
    assertTrue(mao1 != mao2)
    
    mao1 = criaMao((AS, PAUS), (2, COPAS))
    mao2 = criaMao((AS, PAUS), (AS, COPAS))
    assertTrue(mao1 != mao2)
  }
  
}
