def test_critico(self): """Verifica se o cálculo de golpes críticos está funcionando OK.""" res = (2 * self.poke1.lvl + 5)/(self.poke1.lvl + 5) chance = self.poke1.spd/512 maior_chance = chance + 0.001 valores_menores = [] valores_maiores = [] # Novamente usamos valores conhecidos para testar a unidade do # batalha.critico que usa números pseudo-aleatórios. Os primeiros # 100 valores serão menores que a chance e os outros 100, maiores. for i in range(100): valores_menores.append(random.uniform(0.0, chance)) valores_maiores.append(random.uniform(maior_chance, 1.0)) valores = valores_menores + valores_maiores a = RandomPoke() ataque = Ataque(a.gera_ataque()) with patch("batalha.random.uniform", side_effect=valores): # Em cada loop, a iteração chamará dano.critico duas # vezes, usando, então, dois valores do side_effect. for i in range(50): self.assertEqual(ataque.critico(self.poke1, 0), 1) self.assertEqual(ataque.critico(self.poke1, random.randint(1, 100)), res) for i in range(50): self.assertEqual(ataque.critico(self.poke1, 0), 1) self.assertEqual(ataque.critico(self.poke1, random.randint(1, 100)), 1) """
def test_efetividade(self): """Verifica se o cálculo de efetividade é feito corretamente.""" # Novamente geramos um novo Pokémon para podermos realizar vários # testes com resultados diferentes. for i in range(100): a = RandomPoke() poke1 = Pokemon(a.gera()) ataque = Ataque(a.gera_ataque()) # Esta é a fórmula para calcular efetividade mult = ataque.typ.get_eff_contra(poke1.tipo1) if poke1.tipo2.nome != "Blank": mult *= ataque.typ.get_eff_contra(poke1.tipo2) self.assertEquals(mult, ataque.efetividade(poke1, False))
def test_realiza_ataque_e_calcula_dano(self): """Verifica se ataque e suas consequências ocorrem sem problemas.""" batalha.input = Mock(return_value="ok") # Geramos novos Pokémons para podermos realizar vários # testes sem acabar com todo o HP deles. for i in range(100): a = RandomPoke() b = RandomPoke() poke3 = poke1 = Pokemon(a.gera()) poke4 = poke2 = Pokemon(b.gera()) # Assumindo que o ataque sempre vai acertar with patch('batalha.random.uniform', return_value=1.0): # Aqui começa o cálculo do dano lvl = poke1.lvl ataque = Ataque(a.gera_ataque()) if ataque.typ.especial: atk = poke1.spc dfs = poke2.spc else: atk = poke1.atk dfs = poke2.dfs pp = ataque.pp hp = poke2.hp base = ataque.pwr eff = efetividade(ataque, poke2, False) dano = (2 * lvl + 10) / 250 * atk / dfs * base + 2 dano *= (stab(ataque, poke1) * critico(poke1, eff) * eff * aleatorio()) dano = int(dano) #Testa o dano.calcula_dano self.assertEqual(dano, calcula_dano(ataque, poke1, poke2)) if (dano > 0): poke1.remove_hp(dano) if ataque == self.struggle: dano //= 2 poke2.remove(hp.dano) # Verficamos se o Pokemon.realiza_ataque está # aplicando corretamente o dano conforme a fórmula. pokemon.input = Mock(return_value="\n") poke3.realiza_ataque(ataque, poke4) self.assertEquals(pp - 1, ataque.pp) self.assertEquals(poke1.hp, poke3.hp) self.assertEquals(poke2.hp, poke4.hp)
def test_realiza_ataque_e_calcula_dano(self): """Verifica se ataque e suas consequências ocorrem sem problemas.""" batalha.input = Mock(return_value="ok") # Geramos novos Pokémons para podermos realizar vários # testes sem acabar com todo o HP deles. for i in range(100): a = RandomPoke() b = RandomPoke() poke3 = poke1 = Pokemon(a.gera()) poke4 = poke2 = Pokemon(b.gera()) # Assumindo que o ataque sempre vai acertar with patch('batalha.random.uniform', return_value=1.0): # Aqui começa o cálculo do dano lvl = poke1.lvl ataque = Ataque(a.gera_ataque()) if ataque.typ.is_especial: atk = poke1.spc dfs = poke2.spc else: atk = poke1.atk dfs = poke2.dfs pp = ataque.pp hp = poke2.hp base = ataque.pwr eff = efetividade(ataque, poke2, False) dano = (2*lvl + 10)/250 * atk/dfs * base + 2 dano *= (stab(ataque, poke1) * critico(poke1, eff) * eff * aleatorio()) dano = int(dano) #Testa o dano.calcula_dano self.assertEqual(dano, calcula_dano(ataque, poke1, poke2)) if (dano > 0): poke1.remove_hp(dano) if ataque == self.struggle: dano //= 2 poke2.remove(hp.dano) # Verficamos se o Pokemon.realiza_ataque está # aplicando corretamente o dano conforme a fórmula. pokemon.input = Mock(return_value="\n") poke3.realiza_ataque(ataque, poke4) self.assertEquals(pp - 1, ataque.pp) self.assertEquals(poke1.hp, poke3.hp) self.assertEquals(poke2.hp, poke4.hp)