24-10-2022, 01:08 PM
Finit les Orks. Et avec la dernière FAQ.
J'ai même innové. Pour les règles, j'ai fait les tests avant l'implémentation (TDD).
Pour Brinquebalant:
Pour Alpagueur:
Un peu plus difficile, il y en a en défense et en attaque.
Pour la WAAAGH:
Là, ça a été complexe. J'ai même innové en utilisant les classes scellé, qui énumèrent les classes filles attendues.
Il n'y a que la WAAAGH et la ZYWAAAGH.
Pour l'attaque:
Heuresement qu'en défense, il n'y a que WAAAGH:
Soit la Factory:
Et le test suivant:
J'ai même innové. Pour les règles, j'ai fait les tests avant l'implémentation (TDD).
Code:
curl -XPOST -v -d '{"langage":"fr","idCamp":"3","idFaction":"8","idSousFaction":"1","idSousSousFaction":"1"}' -H "Content-type: application/json" http://localhost:8080/regles/parRecherche
Code:
[
{
"factory":"com.calculateur.warhammer.data.regles.factory.ork.RegleAttaqueOrkFactory",
"ressource":{
"id":38000,
"ressource":"com.calculateur.warhammer.dto.regles.faction.ork.ork"
},
"donnees":[
{
"url":"/ork/attaque",
"ressources":{
"id":38000,
"ressource":"com.calculateur.warhammer.dto.regles.faction.ork.ork"
},
"description":"A choisir entre WAAAAGH,ZIWAAAGH et rien.",
"id":38000,
"nom":"attaque.ork",
"cleTraduction":"donnee.attaque.ork",
"libelle":"Le type d\u0027attaque Ork en cours"
},
{
"url":"/ork/attaque",
"ressources":{
"id":38000,
"ressource":"com.calculateur.warhammer.dto.regles.faction.ork.ork"
},
"description":"A choisir entre le stade 1 ou 2.",
"id":38001,
"nom":"phase.attaque.ork",
"cleTraduction":"donnee.phase.attaque.ork",
"libelle":"Stade de l\u0027attaque Ork."
}
],
"description":"A choisir entre WAAAAGH,ZIWAAAGH et rien.",
"id":38000,
"nom":"WAAAGH/ZYWAAAGH Ork",
"cleTraduction":"regle.attaque.ork",
"libelle":"Le type d\u0027attaque Ork en cours"
},
{
"factory":"com.calculateur.warhammer.data.regles.factory.ork.RegleBrinquebalantFactory",
"ressource":{
"id":38000,
"ressource":"com.calculateur.warhammer.dto.regles.faction.ork.ork"
},
"donnees":[
],
"description":"Les véhicule Ork réduisent les dégâts de 1 (minimum 1).",
"id":38001,
"nom":"Brinquelant",
"cleTraduction":"regle.brinquebalant",
"libelle":"Brinquebalant"
},
{
"factory":"com.calculateur.warhammer.data.regles.factory.ork.RegleAlpagueurFactory",
"ressource":{
"id":38000,
"ressource":"com.calculateur.warhammer.dto.regles.faction.ork.ork"
},
"donnees":[
],
"description":"Ajoutez 1 au jet de touche contre les véhicule ou les monstres. Sauvegarde invulnérable de 6+.",
"id":38002,
"nom":"Alpagueur",
"cleTraduction":"regle.alpagueur",
"libelle":"Alpagueur"
}
]
Pour Brinquebalant:
Code:
package com.calculateur.warhammer.data.regles.regle.ork;
import java.util.Set;
import com.calculateur.warhammer.data.enumeration.EProfil;
import com.calculateur.warhammer.data.regles.IRegleDefense;
/**
* Implémentation règle Brinquebalant (-1 aux dégâts pour les véhicule non titanesque)
* @author phili
*
*/
public class RegleBrinquebalant implements IRegleDefense{
private final Set<EProfil> typesProfils;
public RegleBrinquebalant(Set<EProfil> typesProfils) {
super();
this.typesProfils = typesProfils;
}
@Override
public Integer getMalusDegat() {
return (typesProfils.contains(EProfil.VEHICULE) && !typesProfils.contains(EProfil.TITANESQUE))?-1:0 ;
}
}
Code:
package com.calculateur.warhammer.data.regles.factory.ork;
import com.calculateur.warhammer.base.exception.FunctionnalExeption;
import com.calculateur.warhammer.data.regles.IRegleAttaque;
import com.calculateur.warhammer.data.regles.IRegleDefense;
import com.calculateur.warhammer.data.regles.factory.donnees.IDonneeFactory;
import com.calculateur.warhammer.data.regles.factory.regle.IFactoryRegle;
import com.calculateur.warhammer.data.regles.regle.ork.RegleBrinquebalant;
/**
* Factory de la règle Brinquelant
* @author phili
*
*/
public class RegleBrinquebalantFactory implements IFactoryRegle{
@Override
public IRegleAttaque getRegleAttaque(IDonneeFactory donnees) throws FunctionnalExeption {
return null;
}
@Override
public IRegleDefense getRegleDefense(IDonneeFactory donnees) throws FunctionnalExeption {
return new RegleBrinquebalant(donnees.getDefenseur().getProfil().getTypesProfils());
}
@Override
public boolean isRegleApplicableAttaque() {
return false;
}
@Override
public boolean isRegleApplicableDefense() {
return true;
}
}
Code:
package com.calculateur.warhammer.data.regles.factory.ork;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import com.calculateur.warhammer.base.exception.FunctionnalExeption;
import com.calculateur.warhammer.data.enumeration.EProfil;
import com.calculateur.warhammer.data.regles.IRegleDefense;
import com.calculateur.warhammer.data.regles.factory.regle.AbstractFactoryRegleTest;
@Execution(ExecutionMode.SAME_THREAD)
@ExtendWith(MockitoExtension.class)
public class RegleBrinquebalantFactoryTest extends AbstractFactoryRegleTest{
public RegleBrinquebalantFactoryTest() {
super(new RegleBrinquebalantFactory());
}
@Override
protected boolean isRegleAttaqueAttendu() {
return false;
}
@Override
protected boolean isRegleDefenseAttendu() {
return true;
}
@Test
public void testRegleInfanterie() {
testRegleDefense(Arrays.asList(EProfil.INFANTERIE));
}
@Test
public void testRegleVehicule() {
testRegleDefense(Arrays.asList(EProfil.VEHICULE));
}
@Test
public void testRegleVehiculeTitanesque() {
testRegleDefense(Arrays.asList(EProfil.VEHICULE,EProfil.TITANESQUE));
}
private void testRegleDefense(List<EProfil> typesProfils) {
try {
initMockDefense(typesProfils);
IRegleDefense regle = factoryRegle.getRegleDefense(donnees);
validateRegleDefense(regle, typesProfils);
}catch(FunctionnalExeption e) {
fail(e);
}
}
private void initMockDefense(List<EProfil> typesProfils) {
Mockito.when(donnees.getDefenseur()).thenReturn(defenseur);
Mockito.when(defenseur.getProfil()).thenReturn(profil);
Mockito.when(profil.getTypesProfils()).thenReturn(new HashSet<>(typesProfils));
}
private void validateRegleDefense(IRegleDefense regle,List<EProfil> typesProfils) {
Integer reductionDegats = (typesProfils.contains(EProfil.VEHICULE) && !typesProfils.contains(EProfil.TITANESQUE))?
-1:0;
Assertions.assertThat(regle.getMalusDegat()).isEqualTo(reductionDegats);
}
}
Pour Alpagueur:
Un peu plus difficile, il y en a en défense et en attaque.
Code:
package com.calculateur.warhammer.data.regles.regle.ork;
import com.calculateur.warhammer.data.regles.IRegleAttaque;
/**
* La règle Alpagueur en Attaque. En l'occurence, +1 au jet de touche si la cible est un véhicule ou un monstre
* @author phili
*
*/
public class RegleAlpagueurAttaque implements IRegleAttaque{
private final boolean isRegleApplicable;
public RegleAlpagueurAttaque(boolean isAlpagueur,boolean isVehiculeOuMonstre) {
isRegleApplicable = isAlpagueur && isVehiculeOuMonstre;
}
@Override
public Integer getBonusJetTouche() {
return isRegleApplicable?-1:0;
}
}
Code:
package com.calculateur.warhammer.data.regles.regle.ork;
import com.calculateur.warhammer.data.regles.IRegleDefense;
/**
* Règle Alpagueur en défense, à savoir sauvegarde invulnérable à 6+.
* @author phili
*
*/
public class RegleAlpagueurDefense implements IRegleDefense{
private final boolean isAlpagueur;
public RegleAlpagueurDefense(boolean isAlpagueur) {
this.isAlpagueur = isAlpagueur;
}
@Override
public Integer getSauvegardeInvulnerable() {
return isAlpagueur?6:0;
}
}
Code:
package com.calculateur.warhammer.data.regles.factory.ork;
import java.util.Set;
import com.calculateur.warhammer.base.exception.FunctionnalExeption;
import com.calculateur.warhammer.data.enumeration.EProfil;
import com.calculateur.warhammer.data.enumeration.EProfilMotCle;
import com.calculateur.warhammer.data.regles.IRegleAttaque;
import com.calculateur.warhammer.data.regles.IRegleDefense;
import com.calculateur.warhammer.data.regles.factory.donnees.IDonneeFactory;
import com.calculateur.warhammer.data.regles.factory.regle.IFactoryRegle;
import com.calculateur.warhammer.data.regles.regle.ork.RegleAlpagueurAttaque;
import com.calculateur.warhammer.data.regles.regle.ork.RegleAlpagueurDefense;
/**
* Factory de la règle Alpagueur
* @author phili
*
*/
public class RegleAlpagueurFactory implements IFactoryRegle{
@Override
public IRegleAttaque getRegleAttaque(IDonneeFactory donnees) throws FunctionnalExeption {
return new RegleAlpagueurAttaque(
isAlpagueur(donnees.getAttaquant().getProfil().getMotsCles()),
isVehiculeOuMonstre(donnees.getDefenseur().getProfil().getTypesProfils()));
}
@Override
public IRegleDefense getRegleDefense(IDonneeFactory donnees) throws FunctionnalExeption {
return new RegleAlpagueurDefense(isAlpagueur(donnees.getDefenseur().getProfil().getMotsCles()));
}
@Override
public boolean isRegleApplicableAttaque() {
return true;
}
@Override
public boolean isRegleApplicableDefense() {
return true;
}
private boolean isAlpagueur(Set<EProfilMotCle> motsCles) {
return motsCles.contains(EProfilMotCle.ALPAGUEUR);
}
private boolean isVehiculeOuMonstre(Set<EProfil> types) {
return types.contains(EProfil.VEHICULE) || types.contains(EProfil.MONSTRE);
}
}
Pour la WAAAGH:
Là, ça a été complexe. J'ai même innové en utilisant les classes scellé, qui énumèrent les classes filles attendues.
Il n'y a que la WAAAGH et la ZYWAAAGH.
Pour l'attaque:
Code:
package com.calculateur.warhammer.data.regles.regle.ork;
import com.calculateur.warhammer.data.regles.IRegleAttaque;
/**
* Une classe pour touts les assauts Orks
* @author phili
*
*/
public sealed class RegleAttaqueOrkAttaque implements IRegleAttaque permits RegleWaaaghAttaque,RegleZywaaaghAttaque{
protected final EPhaseAttaqueOrk stade;
public RegleAttaqueOrkAttaque(EPhaseAttaqueOrk stade) {
this.stade = stade;
}
}
Code:
package com.calculateur.warhammer.data.regles.regle.ork;
import com.calculateur.warhammer.data.enumeration.EMouvement;
/**
* Règle d'attaque pour une WAAAGH Ork
* @author phili
*
*/
public final class RegleWaaaghAttaque extends RegleAttaqueOrkAttaque{
private final boolean isBaseOuPersonnage;
public RegleWaaaghAttaque(EPhaseAttaqueOrk stade,boolean isBaseOuPersonnage) {
super(stade);
this.isBaseOuPersonnage = isBaseOuPersonnage;
}
@Override
public boolean isChargeApresTypeMouvement(EMouvement mouvement) {
return super.isChargeApresTypeMouvement(mouvement)
|| (stade == EPhaseAttaqueOrk.PHASE_1 && mouvement == EMouvement.ADVANCE && isBaseOuPersonnage);
}
@Override
public Integer getBonusForce() {
return 1;
}
@Override
public Integer getBonusNombreAttaque() {
return 1;
}
}
Code:
package com.calculateur.warhammer.data.regles.regle.ork;
import com.calculateur.warhammer.data.enumeration.EArme;
import com.calculateur.warhammer.data.enumeration.EMouvement;
/**
* Classe pour la règle Zywaaagh
* @author phili
*
*/
public final class RegleZywaaaghAttaque extends RegleAttaqueOrkAttaque{
private final boolean isVehiculeOuMoto;
private final EArme typeArme;
public RegleZywaaaghAttaque(EPhaseAttaqueOrk stade,boolean isVehiculeOuMoto,EArme typeArme) {
super(stade);
this.isVehiculeOuMoto = isVehiculeOuMoto;
this.typeArme = typeArme;
}
@Override
public boolean isIgnoreMalusMouvementAuTir(EMouvement mouvement) {
return super.isIgnoreMalusMouvementAuTir(mouvement) ||
(mouvement == EMouvement.ADVANCE && stade == EPhaseAttaqueOrk.PHASE_1 && typeArme == EArme.ASSAUT);
}
@Override
public Integer getBonusAttaqueArme(EArme aTypeArme) {
return (stade == EPhaseAttaqueOrk.PHASE_1 && isVehiculeOuMoto && aTypeArme == EArme.DAKA)?1:0;
}
@Override
public Integer getBonusPA() {
return (isVehiculeOuMoto && typeArme != EArme.CORPS_A_CORPS)?-1:0;
}
}
Code:
package com.calculateur.warhammer.data.regles.regle.ork;
import com.calculateur.warhammer.data.regles.IRegleDefense;
/**
* Règle Waaagh en défense
* @author phili
*
*/
public class RegleWaaaghDefense implements IRegleDefense{
private final EPhaseAttaqueOrk stade;
public RegleWaaaghDefense(EPhaseAttaqueOrk stade) {
super();
this.stade = stade;
}
@Override
public Integer getSauvegardeInvulnerable() {
return stade == EPhaseAttaqueOrk.PHASE_1?5:6;
}
}
Code:
package com.calculateur.warhammer.data.regles.factory.ork;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import com.calculateur.warhammer.base.exception.FunctionnalExeption;
import com.calculateur.warhammer.data.enumeration.EProfil;
import com.calculateur.warhammer.data.regles.IRegleAttaque;
import com.calculateur.warhammer.data.regles.IRegleDefense;
import com.calculateur.warhammer.data.regles.factory.donnees.IDonneeFactory;
import com.calculateur.warhammer.data.regles.factory.regle.IFactoryRegle;
import com.calculateur.warhammer.data.regles.regle.ork.EAttaqueOrk;
import com.calculateur.warhammer.data.regles.regle.ork.EPhaseAttaqueOrk;
import com.calculateur.warhammer.data.regles.regle.ork.RegleWaaaghAttaque;
import com.calculateur.warhammer.data.regles.regle.ork.RegleWaaaghDefense;
import com.calculateur.warhammer.data.regles.regle.ork.RegleZywaaaghAttaque;
/**
* Une factory pour les différentes WAAAGH des orks
* @author phili
*
*/
public class RegleAttaqueOrkFactory implements IFactoryRegle{
private static final String RES = "com.calculateur.warhammer.data.regles.factory.regle.ork.ork";
private static final String KEY_ERROR_ATTAQUE_NULL = "attaque.ork.null";
private static final String KEY_ERROR_ATTAQUE_INEXISTANT = "attaque.ork.inexistant";
private static final String KEY_ERROR_PHASE_ATTAQUE_NULL = "phase.attaque.ork.null";
private static final String KEY_ERROR_PHASE_ATTAQUE_INEXISTANT = "phase.attaque.ork.inexistant";
@Override
public IRegleAttaque getRegleAttaque(IDonneeFactory donnees) throws FunctionnalExeption {
Map<String,Integer> map = donnees.getDonneesAttaquant();
EAttaqueOrk typeWaaagh = getAttaqueOrk(map);
EPhaseAttaqueOrk stade = getStade(map);
Set<EProfil> profils = donnees.getAttaquant().getProfil().getTypesProfils();
boolean isBaseOuPersonnage = profils.contains(EProfil.BASE) || profils.contains(EProfil.PERSONNAGE);
boolean isVehiculeOuMoto = profils.contains(EProfil.VEHICULE) || profils.contains(EProfil.MOTO);
return switch (typeWaaagh) {
case WAAAGH: yield new RegleWaaaghAttaque(stade, isBaseOuPersonnage);
case ZYWAAAGH: yield new RegleZywaaaghAttaque(stade, isVehiculeOuMoto, donnees.getAttaquant().getArme().getType());
default: yield new IRegleAttaque() {};
};
}
@Override
public IRegleDefense getRegleDefense(IDonneeFactory donnees) throws FunctionnalExeption {
Map<String,Integer> map = donnees.getDonneesDefenseur();
EAttaqueOrk typeWaaagh = getAttaqueOrk(map);
EPhaseAttaqueOrk stade = getStade(map);
return switch (typeWaaagh) {
case WAAAGH: yield new RegleWaaaghDefense(stade);
default: yield new IRegleDefense() {};
};
}
@Override
public boolean isRegleApplicableAttaque() {
return true;
}
@Override
public boolean isRegleApplicableDefense() {
return true;
}
private EAttaqueOrk getAttaqueOrk(Map<String,Integer> map) throws FunctionnalExeption{
if(!map.containsKey(EAttaqueOrk.ID_MAP_ATTAQUE_ORK)) {
throw new FunctionnalExeption(Arrays.asList(KEY_ERROR_ATTAQUE_NULL), RES);
}
EAttaqueOrk aReturn = EAttaqueOrk.getById(map.get(EAttaqueOrk.ID_MAP_ATTAQUE_ORK));
if(aReturn == null) {
throw new FunctionnalExeption(Arrays.asList(KEY_ERROR_ATTAQUE_INEXISTANT), RES);
}
return aReturn;
}
private EPhaseAttaqueOrk getStade(Map<String,Integer> map)throws FunctionnalExeption{
if(!map.containsKey(EPhaseAttaqueOrk.ID_MAP_PHASE_ATTAQUE_ORK)) {
throw new FunctionnalExeption(Arrays.asList(KEY_ERROR_PHASE_ATTAQUE_NULL), RES);
}
EPhaseAttaqueOrk sReturn = EPhaseAttaqueOrk.getById(map.get(EPhaseAttaqueOrk.ID_MAP_PHASE_ATTAQUE_ORK));
if(sReturn == null) {
throw new FunctionnalExeption(Arrays.asList(KEY_ERROR_PHASE_ATTAQUE_INEXISTANT), RES);
}
return sReturn;
}
}
Code:
package com.calculateur.warhammer.data.regles.factory.ork;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import com.calculateur.warhammer.base.exception.FunctionnalExeption;
import com.calculateur.warhammer.data.enumeration.EArme;
import com.calculateur.warhammer.data.enumeration.EMouvement;
import com.calculateur.warhammer.data.enumeration.EProfil;
import com.calculateur.warhammer.data.regles.IRegleAttaque;
import com.calculateur.warhammer.data.regles.IRegleDefense;
import com.calculateur.warhammer.data.regles.factory.regle.AbstractFactoryRegleTest;
import com.calculateur.warhammer.data.regles.regle.ork.EAttaqueOrk;
import com.calculateur.warhammer.data.regles.regle.ork.EPhaseAttaqueOrk;
@Execution(ExecutionMode.SAME_THREAD)
@ExtendWith(MockitoExtension.class)
public class RegleAttaqueOrkFactoryTest extends AbstractFactoryRegleTest{
public RegleAttaqueOrkFactoryTest() {
super(new RegleAttaqueOrkFactory());
}
@Override
protected boolean isRegleAttaqueAttendu() {
return true;
}
@Override
protected boolean isRegleDefenseAttendu() {
return true;
}
@Test
public void testAttaqueOrkAbsentPourAttaque() {
try {
parameters.clear();
Mockito.when(donnees.getDonneesAttaquant()).thenReturn(parameters);
factoryRegle.getRegleAttaque(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testAttaqueOrkInexistantePourAttaque() {
try {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, -1);
Mockito.when(donnees.getDonneesAttaquant()).thenReturn(parameters);
factoryRegle.getRegleAttaque(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testStadeAttaqueOrkAbsentEnAttaque() {
try {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, EAttaqueOrk.WAAAGH.getIdAttaqueOrk());
Mockito.when(donnees.getDonneesAttaquant()).thenReturn(parameters);
factoryRegle.getRegleAttaque(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testStadeAttaqueOrkInexistantEnAttaque() {
try {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, EAttaqueOrk.WAAAGH.getIdAttaqueOrk());
parameters.put(EPhaseAttaqueOrk.ID_MAP_PHASE_ATTAQUE_ORK, -1);
Mockito.when(donnees.getDonneesAttaquant()).thenReturn(parameters);
factoryRegle.getRegleAttaque(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testAttaqueOrkAbsentPourDefense() {
try {
parameters.clear();
Mockito.when(donnees.getDonneesDefenseur()).thenReturn(parameters);
factoryRegle.getRegleDefense(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testAttaqueOrkInexistantePourDefense() {
try {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, -1);
Mockito.when(donnees.getDonneesDefenseur()).thenReturn(parameters);
factoryRegle.getRegleDefense(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testStadeAttaqueOrkAbsentEnDefense() {
try {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, EAttaqueOrk.WAAAGH.getIdAttaqueOrk());
Mockito.when(donnees.getDonneesDefenseur()).thenReturn(parameters);
factoryRegle.getRegleDefense(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testStadeAttaqueOrkInexistantEnDefense() {
try {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, EAttaqueOrk.WAAAGH.getIdAttaqueOrk());
parameters.put(EPhaseAttaqueOrk.ID_MAP_PHASE_ATTAQUE_ORK, -1);
Mockito.when(donnees.getDonneesDefenseur()).thenReturn(parameters);
factoryRegle.getRegleDefense(donnees);
fail();
}catch(FunctionnalExeption e) {
validateFunctionnalException(e);
}
}
@Test
public void testRegleAttaqueChargeApresMouvement() throws FunctionnalExeption{
for(EMouvement mouvement:EMouvement.values()) {
for(EProfil typeProfil:EProfil.values()) {
testRegleAttaqueChargeApresMouvement(mouvement, typeProfil);
}
}
}
private void testRegleAttaqueChargeApresMouvement(EMouvement mouvement,EProfil typeProfil) throws FunctionnalExeption{
boolean isChargeApresMouvement = Arrays.asList(EMouvement.IMMOBILE,EMouvement.NORMAL).contains(mouvement);
boolean isChargeApresAdvance;
IRegleAttaque regle;
for(EAttaqueOrk typeWaaagh:EAttaqueOrk.values()) {
for(EPhaseAttaqueOrk stade:EPhaseAttaqueOrk.values()) {
initMockAttaque(typeWaaagh, stade, typeProfil);
regle = factoryRegle.getRegleAttaque(donnees);
isChargeApresAdvance = typeWaaagh == EAttaqueOrk.WAAAGH
&& stade == EPhaseAttaqueOrk.PHASE_1
&&mouvement == EMouvement.ADVANCE
&& Arrays.asList(EProfil.BASE,EProfil.PERSONNAGE).contains(typeProfil);
Assertions.assertThat(regle.isChargeApresTypeMouvement(mouvement)).isEqualTo(
isChargeApresMouvement || isChargeApresAdvance);
}
}
}
@Test
public void testBonusAttaqueEtForce() throws FunctionnalExeption{
for(EProfil typeProfil:EProfil.values()) {
testBonusAttaqueEtForce(typeProfil);
}
}
private void testBonusAttaqueEtForce(EProfil typeProfil) throws FunctionnalExeption{
boolean isBonus;
Integer bonus;
IRegleAttaque regle;
for(EAttaqueOrk typeWaaagh:EAttaqueOrk.values()) {
for(EPhaseAttaqueOrk stade:EPhaseAttaqueOrk.values()) {
initMockAttaque(typeWaaagh, stade, typeProfil);
regle = factoryRegle.getRegleAttaque(donnees);
isBonus = typeWaaagh == EAttaqueOrk.WAAAGH;
bonus = isBonus?1:0;
Assertions.assertThat(regle.getBonusNombreAttaque()).isEqualTo(bonus);
Assertions.assertThat(regle.getBonusForce()).isEqualTo(bonus);
}
}
}
@Test
public void testRegleIgnoreMalusAvecArmeAssaut()throws FunctionnalExeption{
for(EArme typeArme:EArme.values()) {
for(EProfil typeProfil: EProfil.values()) {
testRegleIgnoreMalusAvecArmeAssaut(typeArme, typeProfil);
}
}
}
private void testRegleIgnoreMalusAvecArmeAssaut(EArme typeArme,EProfil typeProfil)throws FunctionnalExeption{
IRegleAttaque regle;
boolean isIgnoreMalusAdvance;
for(EAttaqueOrk typeWaaagh:EAttaqueOrk.values()) {
for(EPhaseAttaqueOrk stade:EPhaseAttaqueOrk.values()) {
initMockAttaque(typeWaaagh, stade, typeProfil);
if(typeWaaagh == EAttaqueOrk.ZYWAAAGH) {
Mockito.when(arme.getType()).thenReturn(typeArme);
}
regle = factoryRegle.getRegleAttaque(donnees);
isIgnoreMalusAdvance = typeWaaagh == EAttaqueOrk.ZYWAAAGH
&& stade == EPhaseAttaqueOrk.PHASE_1
&& typeArme == EArme.ASSAUT;
Assertions.assertThat(regle.isIgnoreMalusMouvementAuTir(EMouvement.ADVANCE)).isEqualTo(isIgnoreMalusAdvance);
}
}
}
@Test
public void testRegleBonusAttaque() throws FunctionnalExeption{
for(EArme typeArme:EArme.values()) {
for(EProfil typeProfil:EProfil.values()) {
testRegleBonusAttaque(typeArme, typeProfil);
}
}
}
private void testRegleBonusAttaque(EArme typeArme,EProfil typeProfil) throws FunctionnalExeption{
IRegleAttaque regle;
boolean isBonus;
Integer bonus;
for(EAttaqueOrk typeWaaagh:EAttaqueOrk.values()) {
for(EPhaseAttaqueOrk stade:EPhaseAttaqueOrk.values()) {
initMockAttaque(typeWaaagh, stade, typeProfil);
if(typeWaaagh == EAttaqueOrk.ZYWAAAGH) {
Mockito.when(arme.getType()).thenReturn(typeArme);
}
regle = factoryRegle.getRegleAttaque(donnees);
isBonus = typeWaaagh == EAttaqueOrk.ZYWAAAGH
&& stade == EPhaseAttaqueOrk.PHASE_1
&& typeArme == EArme.DAKA
&& Arrays.asList(EProfil.VEHICULE,EProfil.MOTO).contains(typeProfil);
bonus = isBonus?1:0;
Assertions.assertThat(regle.getBonusAttaqueArme(typeArme)).isEqualTo(bonus);
}
}
}
@Test
public void testRegleBonusPA() throws FunctionnalExeption{
for(EArme typeArme:EArme.values()) {
for(EProfil typeProfil:EProfil.values()) {
testRegleBonusPA(typeArme, typeProfil);
}
}
}
private void testRegleBonusPA(EArme typeArme,EProfil typeProfil) throws FunctionnalExeption{
IRegleAttaque regle;
boolean isBonus;
Integer bonus;
for(EAttaqueOrk typeWaaagh:EAttaqueOrk.values()) {
for(EPhaseAttaqueOrk stade:EPhaseAttaqueOrk.values()) {
initMockAttaque(typeWaaagh, stade, typeProfil);
if(typeWaaagh == EAttaqueOrk.ZYWAAAGH) {
Mockito.when(arme.getType()).thenReturn(typeArme);
}
regle = factoryRegle.getRegleAttaque(donnees);
isBonus = typeWaaagh == EAttaqueOrk.ZYWAAAGH
&& typeArme != EArme.CORPS_A_CORPS
&& Arrays.asList(EProfil.VEHICULE,EProfil.MOTO).contains(typeProfil);
bonus = isBonus?-1:0;
Assertions.assertThat(regle.getBonusPA()).isEqualTo(bonus);
}
}
}
private void initMockAttaque(EAttaqueOrk typeWaaagh,EPhaseAttaqueOrk stade,EProfil typeProfil) {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, typeWaaagh.getIdAttaqueOrk());
parameters.put(EPhaseAttaqueOrk.ID_MAP_PHASE_ATTAQUE_ORK, stade.getIdPhase());
Mockito.when(donnees.getDonneesAttaquant()).thenReturn(parameters);
Mockito.when(donnees.getAttaquant()).thenReturn(attaquant);
Mockito.when(attaquant.getProfil()).thenReturn(profil);
Set<EProfil> types = new HashSet<>(Arrays.asList(typeProfil));
Mockito.when(profil.getTypesProfils()).thenReturn(types);
if(typeWaaagh != EAttaqueOrk.AUCUN) {
Mockito.when(attaquant.getArme()).thenReturn(arme);
}
}
@Test
public void testSauvegardeInvulnerable() throws FunctionnalExeption{
for(EAttaqueOrk typeWaaagh:EAttaqueOrk.values()) {
for(EPhaseAttaqueOrk stade:EPhaseAttaqueOrk.values()) {
testSauvegardeInvulnerable(typeWaaagh, stade);
}
}
}
private void testSauvegardeInvulnerable(EAttaqueOrk typeWaaagh,EPhaseAttaqueOrk stade) throws FunctionnalExeption{
initMockDefense(typeWaaagh, stade);
IRegleDefense regle = factoryRegle.getRegleDefense(donnees);
Integer sauvegarde;
if(typeWaaagh == EAttaqueOrk.WAAAGH) {
sauvegarde = stade == EPhaseAttaqueOrk.PHASE_1?5:6;
}else {
sauvegarde = 0;
}
Assertions.assertThat(regle.getSauvegardeInvulnerable()).isEqualTo(sauvegarde);
}
private void initMockDefense(EAttaqueOrk typeWaaagh,EPhaseAttaqueOrk stade) {
parameters.clear();
parameters.put(EAttaqueOrk.ID_MAP_ATTAQUE_ORK, typeWaaagh.getIdAttaqueOrk());
parameters.put(EPhaseAttaqueOrk.ID_MAP_PHASE_ATTAQUE_ORK, stade.getIdPhase());
Mockito.when(donnees.getDonneesDefenseur()).thenReturn(parameters);
}
}