30-06-2023, 07:22 PM
Fin du tabassage de Métaraigne.
Code:
package com.calculateur.warhammer.calcul.mort.arbre.calcul;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.math3.fraction.Fraction;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import com.calculateur.warhammer.base.exception.FunctionnalExeption;
import com.calculateur.warhammer.calcul.mort.arbre.ENatureNoeud;
import com.calculateur.warhammer.calcul.mort.arbre.INoeudArbre;
import com.calculateur.warhammer.calcul.mort.arbre.calcul.builder.chaos.space.marine.MetaragneDefenseBuilderDefense;
import com.calculateur.warhammer.calcul.mort.arbre.calcul.builder.space.marine.TerminatorBuilderAttaque;
import com.calculateur.warhammer.calcul.mort.arbre.data.DataCalculProbabiliteBuilder;
import com.calculateur.warhammer.calcul.mort.arbre.data.IDataCalculProbabilite;
import com.calculateur.warhammer.calcul.test.utils.FractionCheminBuilder;
import com.calculateur.warhammer.data.action.IContexteAction;
import com.calculateur.warhammer.data.enumeration.EBlessure;
import com.calculateur.warhammer.data.enumeration.EGestionDe;
import com.calculateur.warhammer.data.enumeration.EMouvement;
import com.calculateur.warhammer.data.enumeration.ESimule;
import com.calculateur.warhammer.data.identifiable.batiment.RecordBatiment;
import com.calculateur.warhammer.data.regles.detachement.space.marine.ESermentInstantChoix;
import com.calculateur.warhammer.data.unite.IConstituantAttaquant;
import com.calculateur.warhammer.data.unite.IConstituantDefenseur;
public class TerminatorSpaceMarineVSMataragneTest extends AbstractCalculArbreTest{
@Test
public void testAttaqueGanteletNonSermentInstant() throws FunctionnalExeption {
Fraction probaTouche = new Fraction(2, 3);
Fraction probaBlesse = new Fraction(1,3);
Fraction probaRateSauvegarde = new Fraction(2,3);
Fraction probaAttendu = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
INoeudArbre racine = doTestStandard(getDataTerminatorGanteletEnergetique(ESermentInstantChoix.NON), probaAttendu, 4);
validateBlessuresTerminators(racine, 1);
}
@Test
public void testAttaqueGanteletSermentInstant() throws FunctionnalExeption {
Fraction probaTouche = new Fraction(5, 6);
Fraction probaRateTouche = new Fraction(1,6);
Fraction probaBlesse = new Fraction(1,3);
Fraction probaRateBlesse = new Fraction(2,3);
Fraction probaRateSauvegarde = new Fraction(2,3);
Fraction chemin1 = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin2 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin3 = FractionCheminBuilder.getInstance().addFraction(probaTouche)
.addFraction(probaRateBlesse).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin4 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaRateBlesse).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction probaAttendu = chemin1.add(chemin2).add(chemin3).add(chemin4);
INoeudArbre racine = doTestStandard(getDataTerminatorGanteletEnergetique(ESermentInstantChoix.OUI), probaAttendu, 8);
validateBlessuresTerminators(racine, 4);
}
private IDataCalculProbabilite getDataTerminatorGanteletEnergetique(ESermentInstantChoix sermentInstant) {
IContexteAction context = getContexte();
IConstituantAttaquant attaquant = TerminatorBuilderAttaque.getInstance(context, 9)
.equipeGanteletEnergetique()
.addSermentInstant(sermentInstant)
.build();
IConstituantDefenseur defenseur = MetaragneDefenseBuilderDefense.getInstance(context).build();
return DataCalculProbabiliteBuilder.getInstance().addContextAction(context).addAttaquant(attaquant).addDefenseur(defenseur)
.addGestionJetToucheBlessure(EGestionDe.SIMULATION_OPTIMISTE).addGestionSauvegardeDefenseur(EGestionDe.SIMULATION_OPTIMISTE)
.addGestionNombreAttaque(EGestionDe.MOYENNE_STATISTIQUE_OPTIMISTE).build();
}
@Test
public void testAttaquePoingTronconneurNonSermentInstant() throws FunctionnalExeption {
Fraction probaTouche = new Fraction(1, 2);
Fraction probaBlesse = new Fraction(1,2);
Fraction probaRateSauvegarde = new Fraction(2,3);
Fraction probaAttendu = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
INoeudArbre racine = doTestStandard(getDataTerminatorPoingTronconneur(ESermentInstantChoix.NON), probaAttendu, 1);
validateBlessuresTerminators(racine, 1);
}
@Test
public void testAttaquePoingTronconneurSermentInstant() throws FunctionnalExeption {
Fraction probaTouche = new Fraction(2, 3);
Fraction probaRateTouche = new Fraction(1,3);
Fraction probaBlesse = new Fraction(1,2);
Fraction probaRateBlesse = new Fraction(1,2);
Fraction probaRateSauvegarde = new Fraction(2,3);
Fraction chemin1 = FractionCheminBuilder.getInstance().addFraction(probaTouche).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin2 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin3 = FractionCheminBuilder.getInstance().addFraction(probaTouche)
.addFraction(probaRateBlesse).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction chemin4 = FractionCheminBuilder.getInstance().addFraction(probaRateTouche).addFraction(probaTouche)
.addFraction(probaRateBlesse).addFraction(probaBlesse).addFraction(probaRateSauvegarde).build();
Fraction probaAttendu = chemin1.add(chemin2).add(chemin3).add(chemin4);
INoeudArbre racine = doTestStandard(getDataTerminatorPoingTronconneur(ESermentInstantChoix.OUI), probaAttendu, 1);
validateBlessuresTerminators(racine, 4);
}
private IDataCalculProbabilite getDataTerminatorPoingTronconneur(ESermentInstantChoix sermentInstant) {
IContexteAction context = getContexte();
IConstituantDefenseur defenseur = MetaragneDefenseBuilderDefense.getInstance(context).build();
IConstituantAttaquant attaquant = TerminatorBuilderAttaque.getInstance(context, 2)
.equipePoingTronconneur(defenseur)
.addSermentInstant(sermentInstant)
.build();
return DataCalculProbabiliteBuilder.getInstance().addContextAction(context).addAttaquant(attaquant).addDefenseur(defenseur)
.addGestionJetToucheBlessure(EGestionDe.SIMULATION_OPTIMISTE).addGestionSauvegardeDefenseur(EGestionDe.SIMULATION_OPTIMISTE)
.addGestionNombreAttaque(EGestionDe.MOYENNE_STATISTIQUE_OPTIMISTE).build();
}
private void validateBlessuresTerminators(INoeudArbre racine,int attendu) {
int nombre = 0;
Map<EBlessure, Integer> mapAttendu = new HashMap<>();
mapAttendu.put(EBlessure.NORMALES, 2);
for(INoeudArbre noeud:racine.arbre()) {
if(noeud.getNatureNoeud() == ENatureNoeud.REUSSITE) {
nombre++;
Assertions.assertThat(noeud.mapBlessure()).isEqualTo(mapAttendu);
Assertions.assertThat(noeud.mapBlessuresAleatoires()).isEmpty();
}
}
Assertions.assertThat(nombre).isEqualTo(attendu);
}
private IContexteAction getContexte() {
return ContextActionForTestProbaBuilder.getInstance()
.addSimule(ESimule.CORPS_A_CORPS_APRES_CHARGE)
.addNumeroTour(2)
.addEffectifInitialAttaquant(10)
.addNombreAttaquant(10)
.addMouvementAttaquant(EMouvement.NORMAL)
.addBatimentAttaquant(new RecordBatiment(false, false))
.addNombreDefenseur(1)
.addMouvementDefenseur(EMouvement.NORMAL)
.addBatimentDefenseur(new RecordBatiment(false, false))
.addDistanceEntreBelligerant(0.0)
.build();
}
}