package commons

import org.testng.annotations._
import org.junit.Assert._

class GeradorDeCombinacaoTest {

//  @Test
//  def combinacao1Escolhe1() {
//    assertEquals(List(List(0)), GeradorDeCombinacao.gera(1, 1))
//  }
//  
//  @Test
//  def combinacaoNescolheN() {
//    assertEquals(List(List(0), List(1), List(2), List(3), List(4)), GeradorDeCombinacao.gera(5, 5))
//  }
//  
//  @Test
//  def combinacao2escolhe1() {
//    assertEquals(List(List(0), List(1)), GeradorDeCombinacao.gera(2, 1))
//  }
//  
//  @Test{ val enabled = false }
//  def combinacao3escolhe2() {
//    assertEquals(List(List(0, 1), List(0, 2), List(1, 2)), GeradorDeCombinacao.gera(3, 2))
//  }
  
  // instance
  
  @Test
  def combinacao1Escolhe1() {
    assertEquals(List(0), new GeradorDeCombinacao(1, 1).next)
  }
  
  @Test
  def combinacaoNEscolheN() {
    assertEquals(List(0, 1, 2), new GeradorDeCombinacao(3, 3).next)
  }
  
  @Test
  def combinacao2Escolhe1() {
    var g = new GeradorDeCombinacao(2, 1)
    assertEquals(List(0), g.next)
    assertEquals(List(1), g.next)
  }
  
  @Test
  def combinacao3Escolhe1() {
    var g = new GeradorDeCombinacao(3, 1)
    assertEquals(List(0), g.next)
    assertEquals(List(1), g.next)
    assertEquals(List(2), g.next)
  }
  
  @Test
  def combinacao3Escolhe2() {
    // (3,2) 012 -> 01, 02, 12
    var g = new GeradorDeCombinacao(3, 2)
    assertEquals(List(0, 1), g.next)
    assertEquals(List(0, 2), g.next)
    assertEquals(List(1, 2), g.next)
  }
  
  @Test
  def combinacao4Escolhe2() {
    var g = new GeradorDeCombinacao(4, 2)
    assertEquals(List(0, 1), g.next)
    assertEquals(List(0, 2), g.next)
    assertEquals(List(0, 3), g.next)
    assertEquals(List(1, 2), g.next)
    assertEquals(List(1, 3), g.next)
    assertEquals(List(2, 3), g.next)
  }
  
  @Test
  def combinacao4Escolhe3() {
    var g = new GeradorDeCombinacao(4, 3)
    assertEquals(List(0, 1, 2), g.next)
    assertEquals(List(0, 1, 3), g.next)
    assertEquals(List(0, 2, 3), g.next)
  }
  
  @Test
  def combinacao5Escolhe3() {
    var g = new GeradorDeCombinacao(5, 3)
    assertEquals(List(0, 1, 2), g.next)
    assertEquals(List(0, 1, 3), g.next)
    assertEquals(List(0, 1, 4), g.next)
    assertEquals(List(0, 2, 3), g.next)
    assertEquals(List(0, 2, 4), g.next)
    assertEquals(List(0, 3, 4), g.next)
  }
  
  @Test
  def combinacao10Escolhe6() {
    var g = new GeradorDeCombinacao(10, 6)
    assertEquals(List(0, 1, 2, 3, 4, 5), g.next)
    assertEquals(List(0, 1, 2, 3, 4, 6), g.next)
    assertEquals(List(0, 1, 2, 3, 4, 7), g.next)
    assertEquals(List(0, 1, 2, 3, 4, 8), g.next)
    assertEquals(List(0, 1, 2, 3, 4, 9), g.next)
    assertEquals(List(0, 1, 2, 3, 5, 6), g.next)
    assertEquals(List(0, 1, 2, 3, 5, 7), g.next)
    assertEquals(List(0, 1, 2, 3, 5, 8), g.next)
    assertEquals(List(0, 1, 2, 3, 5, 9), g.next)
    assertEquals(List(0, 1, 2, 3, 6, 7), g.next)
    (0 until 4).foreach { i => g.next }
    assertEquals(List(0, 1, 2, 3, 8, 9), g.next)
    assertEquals(List(0, 1, 2, 4, 5, 6), g.next)
  }
  
  @Test 
  def aposUltimaCombinacaoRetornaNull() {
    var g = new GeradorDeCombinacao(2, 1)
    g.next
    g.next
    assertEquals(null, g.next)
  }
  
  @Test 
  def hasNext() {
    var g = new GeradorDeCombinacao(2, 1)
    assertTrue(g.hasNext)
    assertTrue(g.hasNext)
    g.next
    assertTrue(g.hasNext)
    g.next
    assertFalse(g.hasNext)
    g.reset()
    assertTrue(g.hasNext)
  }
  
  @Test 
  def aposUltimaCombinacaoResetVoltaParaPrimeira() {
    var g = new GeradorDeCombinacao(2, 1)
    g.next
    g.next
    assertEquals(null, g.next)
    g.reset()
    assertEquals(List(0), g.next)
  }
  
  @Test
  def testeDeSanidadeCombinacao15Escolhe4() {
    var g = new GeradorDeCombinacao(15, 4)
    (0 until 30).foreach { i =>
      var combinacao = g.next
	    assertEquals(4, combinacao.length)
      assertTrue(combinacao.toString, combinacao.forall { e => e >= 0 && e < 15 })
    }
  }
  
  @Test
  def testeDeSanidadeCombinacao50Escolhe10() {
    var g = new GeradorDeCombinacao(50, 7)
    (0 until 100).foreach { i =>
      var combinacao = g.next
	    assertEquals(7, combinacao.length) 
      assertTrue(combinacao.toString, combinacao.forall { e => e >= 0 && e < 50 })
    }
  }
}
