Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Blabla@40K
(05-05-2022, 10:53 PM)Darth Nico Wrote: On voit qu'ils beaucoup progressé dans le design de figurines.
Easy Rider Dwarf, la classe américaine  pasmal

Bon, maintenant, tu te mets à 40K et tu joue les Squats Boidleau
Reply
(06-05-2022, 08:46 AM)Philou Wrote:
(05-05-2022, 10:53 PM)Darth Nico Wrote: On voit qu'ils beaucoup progressé dans le design de figurines.
Easy Rider Dwarf, la classe américaine  pasmal

Bon, maintenant, tu te mets à 40K et tu joue les Squats Boidleau

La réalité:

Laporte
Reply
Pendant ce temps, mon projet pour le CNAM avance.

Après avoir eu une embrouille sur les arbres (on s'y perd), mais avoir trouvé une astuce pour ne plus m'y perdre, j'ai enfin finit l'ensemble des tests unitaires.

Soit:
Code:
package com.calculateur.warhammer.calcul.calcul;

import java.util.Arrays;

import org.apache.commons.math3.fraction.Fraction;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import com.calculateur.warhammer.data.ContexteActionImplementationBuilder;
import com.calculateur.warhammer.data.ContexteBatiment;
import com.calculateur.warhammer.data.ContexteFactionnaireNecron;
import com.calculateur.warhammer.data.ContexteGardienEldar;
import com.calculateur.warhammer.data.ContexteGorgones;
import com.calculateur.warhammer.data.ContexteGuerrierNecron;
import com.calculateur.warhammer.data.ContexteImmortelNecron;
import com.calculateur.warhammer.data.ContexteMarinePeste;
import com.calculateur.warhammer.data.ContexteSoeurBataille;
import com.calculateur.warhammer.data.ContexteSoeurRepentia;
import com.calculateur.warhammer.data.ContexteSpaceMarineIntersessorAssaut;
import com.calculateur.warhammer.data.ContexteTerminatorDeathwing;
import com.calculateur.warhammer.data.IArmeCorpsACorps;
import com.calculateur.warhammer.data.IBatiment;
import com.calculateur.warhammer.data.IContexteAction;
import com.calculateur.warhammer.data.IProfil;
import com.calculateur.warhammer.data.IReglesSpeciales;

public class CalculMortPhaseCorpACorpTest {

    private final ICalculMort<IArmeCorpsACorps> calculMort;

    public CalculMortPhaseCorpACorpTest() {
        calculMort = new CalculMortPhaseCorpACorp();
    }

    @Test
    public void testSpaceMarineInterssessorAssautAttaqueGuerrierNecronBase() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IArmeCorpsACorps epeeTronconneuse = ContexteSpaceMarineIntersessorAssaut.getEpeeTronconneuseAstartes();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessorAssaut.getRegleAttaqueBase();

        IProfil necron = ContexteGuerrierNecron.getGuerrierNecron();
        IReglesSpeciales regleBaseNecron = ContexteGuerrierNecron.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine)
                .addArmeAttaquant(epeeTronconneuse).addProfilDefenseur(necron).addReglesDefenseur(regleBaseNecron)
                .addBatiment(aucun).build();
        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateSauvegarde = new Fraction(2, 3);
        Fraction probaNecronNESeRelevePasDef1 = new Fraction(1, 2);
        Fraction probaNecronNESeRelevePasDef2 = new Fraction(2, 3);
        Fraction probaNecronNeSeRelevePasMaisRelance = new Fraction(1, 6);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNeSeRelevePasMaisRelance)
                .addEvent(probaNecronNESeRelevePasDef2).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNESeRelevePasDef1).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorAssautDarkAngelRiposteGuerrierNecronBase() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IArmeCorpsACorps epeeTronconneuse = ContexteSpaceMarineIntersessorAssaut.getEpeeTronconneuseAstartes();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessorAssaut.getAttaqueDarkAngelHorsDoctrine();

        IProfil necron = ContexteGuerrierNecron.getGuerrierNecron();
        IReglesSpeciales regleBaseNecron = ContexteGuerrierNecron.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine)
                .addArmeAttaquant(epeeTronconneuse).addProfilDefenseur(necron).addReglesDefenseur(regleBaseNecron)
                .addBatiment(aucun).build();
        Fraction probaTouche = new Fraction(5, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateSauvegarde = new Fraction(2, 3);
        Fraction probaNecronNESeRelevePasDef1 = new Fraction(1, 2);
        Fraction probaNecronNESeRelevePasDef2 = new Fraction(2, 3);
        Fraction probaNecronNeSeRelevePasMaisRelance = new Fraction(1, 6);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNeSeRelevePasMaisRelance)
                .addEvent(probaNecronNESeRelevePasDef2).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNESeRelevePasDef1).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineIntersessorAssautAttqueimmortelNecron() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IArmeCorpsACorps epeeTronconneuse = ContexteSpaceMarineIntersessorAssaut.getEpeeTronconneuseAstartes();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessorAssaut.getRegleAttaqueBase();

        IProfil immortel = ContexteImmortelNecron.getImmortelNecron();
        IReglesSpeciales regleDefense = ContexteImmortelNecron.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine)
                .addArmeAttaquant(epeeTronconneuse).addProfilDefenseur(immortel).addReglesDefenseur(regleDefense)
                .addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSave = new Fraction(1, 2);
        Fraction probaNeSeRelevePas = new Fraction(2, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSave).addEvent(probaNeSeRelevePas).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorAssautACoteDeCommandantTirentSurGardienEldar() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IArmeCorpsACorps epeeTronconneuse = ContexteSpaceMarineIntersessorAssaut.getEpeeTronconneuseAstartes();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessorAssaut.getDoctrineEtCommandant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine)
                .addArmeAttaquant(epeeTronconneuse).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaRateTirMaisRelance = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);
        // Marine rate tir
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaTouche)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Marine réussi tir
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorAssautACoteDeLieutenantAttaqueGardienEldar() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IArmeCorpsACorps epeeTronconneuse = ContexteSpaceMarineIntersessorAssaut.getEpeeTronconneuseAstartes();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessorAssaut.getDoctrineEtCommandant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine)
                .addArmeAttaquant(epeeTronconneuse).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateBlessureMaisRetente = new Fraction(1, 6);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);
        // Marine rate blessure
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaRateBlessureMaisRetente)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Marine réussi blessure
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorAssautACoteDeCommandantEtLieutenantAttaqueGardienEldar()
            throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IArmeCorpsACorps epeeTronconneuse = ContexteSpaceMarineIntersessorAssaut.getEpeeTronconneuseAstartes();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessorAssaut.getDoctrineEtCommandantEtLieutenant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine)
                .addArmeAttaquant(epeeTronconneuse).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaRateTirMaisRelance = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateBlesseMaisRelance = new Fraction(1, 6);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);

        // Touche ratée et Blesse réussie
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaTouche)
                .addEvent(probaRateBlesseMaisRelance).addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Touche ratée mais blesse réussie
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaTouche)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Touche réussie mais blesse ratée
        Fraction ch3 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaRateBlesseMaisRelance)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Tout réussie
        Fraction ch4 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2, ch3, ch4));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testGardienEldarRiposteSpaceMarineIntersessorDansBatimentDefendableApresCharge()
            throws CalculException {
        IProfil gardienEldar = ContexteGardienEldar.getGardienEldar();
        IArmeCorpsACorps base = ContexteGardienEldar.getArmeBase();
        IReglesSpeciales regleAttaque = ContexteGardienEldar.getRegleAttaque();

        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IReglesSpeciales regleDefense = ContexteSpaceMarineIntersessorAssaut.getRegleDefense();

        IBatiment batiment = ContexteBatiment.getBatiment(false, false, false, true, false);

        IContexteAction<IArmeCorpsACorps> contexte = ContexteActionImplementationBuilder.getInstanceDefenseurObstacle()
                .addProfilAttaquant(gardienEldar).addReglesAttaquant(regleAttaque).addArmeAttaquant(base)
                .addProfilDefenseur(spaceMarine).addReglesDefenseur(regleDefense).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(5, 6);
        Fraction probaBlesse = new Fraction(1, 3);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testGardienEldarRiposteSpaceMarineIntersessorDansBatiment() throws CalculException {
        IProfil gardienEldar = ContexteGardienEldar.getGardienEldar();
        IArmeCorpsACorps base = ContexteGardienEldar.getArmeBase();
        IReglesSpeciales regleAttaque = ContexteGardienEldar.getRegleAttaque();

        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IReglesSpeciales regleDefense = ContexteSpaceMarineIntersessorAssaut.getRegleDefense();

        IBatiment batiment = ContexteBatiment.getBatiment(false, false, false, false, true);

        IContexteAction<IArmeCorpsACorps> contexte = ContexteActionImplementationBuilder.getInstancePhaseCorpsACorps()
                .addProfilAttaquant(gardienEldar).addReglesAttaquant(regleAttaque).addArmeAttaquant(base)
                .addProfilDefenseur(spaceMarine).addReglesDefenseur(regleDefense).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(5, 6);
        Fraction probaBlesse = new Fraction(1, 3);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testTerminatorDeathwingAttaquegGardienEldar() throws CalculException {
        IProfil terminator = ContexteTerminatorDeathwing.getTerminatorDeathwing();
        IArmeCorpsACorps ganteletEnergetique = ContexteTerminatorDeathwing.getGanteletEnergetique();
        IReglesSpeciales doctrineTactiqueImmobile = ContexteTerminatorDeathwing.getRegleAttaqueDoctrineImmobile();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(terminator)
                .addReglesAttaquant(doctrineTactiqueImmobile).addArmeAttaquant(ganteletEnergetique)
                .addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(5, 6);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testFactionnaireAttaqueTerminatorDeathwing() throws CalculException {
        IProfil factionnaire = ContexteFactionnaireNecron.getFactionnaireNecron();
        IArmeCorpsACorps fauchard = ContexteFactionnaireNecron.getFauchard();
        IReglesSpeciales regleAttaque = ContexteFactionnaireNecron.getRegleAttaque();

        IProfil terminator = ContexteTerminatorDeathwing.getTerminatorDeathwing();
        IReglesSpeciales regleDefense = ContexteTerminatorDeathwing.getRegleDefense();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexteAction = ContexteActionImplementationBuilder
                .getInstancePhaseCorpsACorps().addProfilAttaquant(factionnaire).addReglesAttaquant(regleAttaque)
                .addArmeAttaquant(fauchard).addProfilDefenseur(terminator).addReglesDefenseur(regleDefense)
                .addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(2, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testGogonneAttaqueSpaceMarineIntersessor() throws CalculException {
        IProfil gorgonne = ContexteGorgones.getGorgonne();
        IArmeCorpsACorps lame = ContexteGorgones.getLameGorgonne();
        IReglesSpeciales regleAttaque = ContexteGorgones.getRegleAttaque();

        IProfil spaceMarine = ContexteSpaceMarineIntersessorAssaut.getSpaceMarineIntersessorAssaut();
        IReglesSpeciales regleDefense = ContexteSpaceMarineIntersessorAssaut.getRegleDefense();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexte = ContexteActionImplementationBuilder.getInstancePhaseCorpsACorps()
                .addReglesAttaquant(regleAttaque).addProfilAttaquant(gorgonne).addArmeAttaquant(lame)
                .addProfilDefenseur(spaceMarine).addReglesDefenseur(regleDefense).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testMarinePesteAttaqueSoeur() throws CalculException {
        IProfil marinePeste = ContexteMarinePeste.getMarinePeste();
        IArmeCorpsACorps base = ContexteMarinePeste.getArmeDeBase();
        IReglesSpeciales regleAttaque = ContexteMarinePeste.getRegleAttaque();

        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IReglesSpeciales regleDefense = ContexteSoeurBataille.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexte = ContexteActionImplementationBuilder.getInstancePhaseCorpsACorps()
                .addProfilAttaquant(marinePeste).addArmeAttaquant(base).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(soeur).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(5, 6);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testMarinePesteAttaqueSoeurRepentia() throws CalculException {
        IProfil marinePeste = ContexteMarinePeste.getMarinePeste();
        IArmeCorpsACorps base = ContexteMarinePeste.getArmeDeBase();
        IReglesSpeciales regleAttaque = ContexteMarinePeste.getRegleAttaque();

        IProfil repentia = ContexteSoeurRepentia.getSoeurRepentia();
        IReglesSpeciales regleDefense = ContexteSoeurRepentia.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeCorpsACorps> contexte = ContexteActionImplementationBuilder.getInstancePhaseCorpsACorps()
                .addProfilAttaquant(marinePeste).addArmeAttaquant(base).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(repentia).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(5, 6);
        Fraction probaRateSauvegarde = new Fraction(5, 6);
        Fraction probaNePasIgnorerBlessure = new Fraction(2, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNePasIgnorerBlessure).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }
}

Code:
package com.calculateur.warhammer.calcul.calcul;

import java.util.Arrays;

import org.apache.commons.math3.fraction.Fraction;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import com.calculateur.warhammer.data.ContexteActionImplementationBuilder;
import com.calculateur.warhammer.data.ContexteBatiment;
import com.calculateur.warhammer.data.ContexteChenilleCrachepeste;
import com.calculateur.warhammer.data.ContexteChevalierNoirRavenwing;
import com.calculateur.warhammer.data.ContexteGardienEldar;
import com.calculateur.warhammer.data.ContexteGuerrierKabalite;
import com.calculateur.warhammer.data.ContexteGuerrierNecron;
import com.calculateur.warhammer.data.ContexteImmortelNecron;
import com.calculateur.warhammer.data.ContexteMarinePeste;
import com.calculateur.warhammer.data.ContexteRangerEldar;
import com.calculateur.warhammer.data.ContexteSoeurBataille;
import com.calculateur.warhammer.data.ContexteSoeurRepentia;
import com.calculateur.warhammer.data.ContexteSpaceMarineIntersessor;
import com.calculateur.warhammer.data.ContexteTerminatorDeathwing;
import com.calculateur.warhammer.data.IArmeDeTir;
import com.calculateur.warhammer.data.IBatiment;
import com.calculateur.warhammer.data.IContexteAction;
import com.calculateur.warhammer.data.IProfil;
import com.calculateur.warhammer.data.IReglesSpeciales;

public class CalculMortPhaseTirTest {

    private final ICalculMort<IArmeDeTir> calculMort;

    public CalculMortPhaseTirTest() {
        calculMort = new CalculMortPhaseTir();
    }

    @Test
    public void testSpaceMarineInterssessorTirentSurGuerrierNecronBase() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessor.getRegleAttaqueBase();

        IProfil necron = ContexteGuerrierNecron.getGuerrierNecron();
        IReglesSpeciales regleBaseNecron = ContexteGuerrierNecron.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine).addArmeAttaquant(bolter)
                .addProfilDefenseur(necron).addReglesDefenseur(regleBaseNecron).addBatiment(aucun).build();
        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(2, 3);
        Fraction probaNecronNESeRelevePasDef1 = new Fraction(1, 2);
        Fraction probaNecronNESeRelevePasDef2 = new Fraction(2, 3);
        Fraction probaNecronNeSeRelevePasMaisRelance = new Fraction(1, 6);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNeSeRelevePasMaisRelance)
                .addEvent(probaNecronNESeRelevePasDef2).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNESeRelevePasDef1).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineIntersessorTirentSurimmortelNecron() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessor.getRegleAttaqueBase();

        IProfil immortel = ContexteImmortelNecron.getImmortelNecron();
        IReglesSpeciales regleDefense = ContexteImmortelNecron.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine).addArmeAttaquant(bolter)
                .addProfilDefenseur(immortel).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 3);
        Fraction probaRateSave = new Fraction(1, 2);
        Fraction probaNeSeRelevePas = new Fraction(2, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSave).addEvent(probaNeSeRelevePas).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorACoteDeCommandantTirentSurGardienEldar() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales doctrineTactiqueEtCommandantEtLieutenant = ContexteSpaceMarineIntersessor
                .getDoctrineEtCommandant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(doctrineTactiqueEtCommandantEtLieutenant)
                .addArmeAttaquant(bolter).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaToucheTir = new Fraction(2, 3);
        Fraction probaRateTirMaisRelance = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);
        // Marine rate tir
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaToucheTir)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Marine réussi tir
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorACoteDeLieutenantTirentSurGardienEldar() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales doctrineTactiqueEtCommandantEtLieutenant = ContexteSpaceMarineIntersessor
                .getDoctrineEtLieutenant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(doctrineTactiqueEtCommandantEtLieutenant)
                .addArmeAttaquant(bolter).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaToucheTir = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateBlessureMaisRetente = new Fraction(1, 6);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);
        // Marine rate blessure
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaRateBlessureMaisRetente)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Marine réussi blessure
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorACoteDeCommandantEtLieutenantTirentSurGardienEldarDansBatiment()
            throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales doctrineTactiqueEtCommandantEtLieutenant = ContexteSpaceMarineIntersessor
                .getDoctrineEtCommandantEtLieutenant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getBatiment(true, true, false, false, false);

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(doctrineTactiqueEtCommandantEtLieutenant)
                .addArmeAttaquant(bolter).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaToucheTir = new Fraction(1, 2);
        Fraction probaRateTirMaisRelance = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateBlesseMaisRelance = new Fraction(1, 6);
        Fraction probaEldarRateSauvegarde = new Fraction(2, 3);

        // Touche ratée et Blesse réussie
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaToucheTir)
                .addEvent(probaRateBlesseMaisRelance).addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Touche ratée mais blesse réussie
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaToucheTir)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Touche réussie mais blesse ratée
        Fraction ch3 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaRateBlesseMaisRelance)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Tout réussie
        Fraction ch4 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2, ch3, ch4));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testTerminatorDeathwingTirentSurGardienEldar() throws CalculException {
        IProfil terminator = ContexteTerminatorDeathwing.getTerminatorDeathwing();
        IArmeDeTir stormBolt = ContexteTerminatorDeathwing.getFulguant();
        IReglesSpeciales doctrineTactiqueImmobile = ContexteTerminatorDeathwing.getRegleAttaqueDoctrineImmobile();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(terminator).addReglesAttaquant(doctrineTactiqueImmobile).addArmeAttaquant(stormBolt)
                .addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(5, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateSauvegarde = new Fraction(2, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testImmortelNecronTireSurTerminatorDeathwing() throws CalculException {
        IProfil immortel = ContexteImmortelNecron.getImmortelNecron();
        IArmeDeTir eclateurGauss = ContexteImmortelNecron.getEclateurGauss();
        IReglesSpeciales regleImmortel = ContexteImmortelNecron.getRegleAttaque();

        IProfil terminator = ContexteTerminatorDeathwing.getTerminatorDeathwing();
        IReglesSpeciales regleDefense = ContexteTerminatorDeathwing.getRegleDefense();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(immortel).addReglesAttaquant(regleImmortel).addArmeAttaquant(eclateurGauss)
                .addProfilDefenseur(terminator).addReglesDefenseur(regleDefense).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testimmortelNecronTireSurChevalierNoirRavenwing() throws CalculException {
        IProfil immortel = ContexteImmortelNecron.getImmortelNecron();
        IArmeDeTir eclateurGauss = ContexteImmortelNecron.getEclateurGauss();
        IReglesSpeciales regleImmortel = ContexteImmortelNecron.getRegleAttaque();

        IProfil chevalierRavenwing = ContexteChevalierNoirRavenwing.getChevalierNoirRavenwing();
        IReglesSpeciales regleDefense = ContexteChevalierNoirRavenwing.getRavenwingSalome();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(immortel).addReglesAttaquant(regleImmortel).addArmeAttaquant(eclateurGauss)
                .addProfilDefenseur(chevalierRavenwing).addReglesDefenseur(regleDefense).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(1, 2);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testChenilleCrachePesteTirIndirectSoeurCouvert() throws CalculException {
        IProfil ChenilleCrachePeste = ContexteChenilleCrachepeste.getChenilleCrachepeste();
        IArmeDeTir mortierCrachePeste = ContexteChenilleCrachepeste.getMortierCrachePeste();
        IReglesSpeciales regleAttaque = ContexteChenilleCrachepeste.getRegleAttaque();

        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IReglesSpeciales regleDefense = ContexteSoeurBataille.getRegleDefense();

        IBatiment batiment = ContexteBatiment.getBatiment(true, true, false, false, false);

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(ChenilleCrachePeste).addReglesAttaquant(regleAttaque)
                .addArmeAttaquant(mortierCrachePeste).addProfilDefenseur(soeur).addReglesDefenseur(regleDefense)
                .addBatiment(batiment).addIsTirIndirect(true).build();

        Fraction probaTouche = new Fraction(1, 2);
        Fraction probaBlesse = new Fraction(5, 6);
        Fraction probaRateBlessure = new Fraction(1, 6);
        Fraction probaRateSauvegarde = new Fraction(1, 6);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaRateBlessure)
                .addEvent(probaBlesse).addEvent(probaRateSauvegarde).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSoeursTirentSurGardienBolter() throws CalculException {
        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IArmeDeTir bolter = ContexteSoeurBataille.getBolter();
        IReglesSpeciales regleAttaque = ContexteSoeurBataille.getAttaqueRiteDirectionDivine();

        IProfil eldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleDefense = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(soeur).addArmeAttaquant(bolter).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(eldar).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlessePANormal = new Fraction(1, 2);
        Fraction probaBlesseAmeliorationPA = new Fraction(1, 6);
        Fraction probaRateSauvegarceCas1 = new Fraction(1, 2);
        Fraction probaRateSauvegardeCas2 = new Fraction(2, 3);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlessePANormal)
                .addEvent(probaRateSauvegarceCas1).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesseAmeliorationPA)
                .addEvent(probaRateSauvegardeCas2).build();

        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSoeursTirentSurGardienLanceFlammeLourd() throws CalculException {
        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IArmeDeTir lanceFlammeLourd = ContexteSoeurBataille.getLanceFlammeLourd();
        IReglesSpeciales regleAttaque = ContexteSoeurBataille.getAttaqueRiteDirectionDivine();

        IProfil eldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleDefense = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(soeur).addArmeAttaquant(lanceFlammeLourd).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(eldar).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaBlessePANormal = new Fraction(5, 6);
        Fraction probaBlesseAmeliorationPA = new Fraction(1, 6);
        Fraction probaRateSauvegarceCas1 = new Fraction(2, 3);
        Fraction probaRateSauvegardeCas2 = new Fraction(1, 6);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaBlessePANormal).addEvent(probaRateSauvegarceCas1)
                .build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaBlesseAmeliorationPA).addEvent(probaRateSauvegardeCas2)
                .build();

        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSoeursTirentSurMarineDeLaPeste() throws CalculException {
        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IArmeDeTir bolter = ContexteSoeurBataille.getBolter();
        IReglesSpeciales regleAttaque = ContexteSoeurBataille.getAttaqueRiteDirectionDivine();

        IProfil marinePeste = ContexteMarinePeste.getMarinePeste();
        IReglesSpeciales regleDefense = ContexteMarinePeste.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(soeur).addArmeAttaquant(bolter).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(marinePeste).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 3);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testMarinePesteTirentSurSoeur() throws CalculException {
        IProfil marinePeste = ContexteMarinePeste.getMarinePeste();
        IArmeDeTir bolter = ContexteMarinePeste.getBolter();
        IReglesSpeciales regleAttaque = ContexteMarinePeste.getRegleAttaque();

        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IReglesSpeciales regleDefense = ContexteSoeurBataille.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(marinePeste).addArmeAttaquant(bolter).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(soeur).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(5, 6);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testGuerrierKabalitePesteTirentSurSoeur() throws CalculException {
        IProfil guerrierKabalite = ContexteGuerrierKabalite.getGuerrierKabalite();
        IArmeDeTir fusil = ContexteGuerrierKabalite.getFusilEclateur();
        IReglesSpeciales regleAttaque = ContexteGuerrierKabalite.getRegleAttaque();

        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IReglesSpeciales regleDefense = ContexteSoeurBataille.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(guerrierKabalite).addArmeAttaquant(fusil).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(soeur).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(2, 3);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testRangerEldarTirentSoeursRepentia() throws CalculException {
        IProfil ranger = ContexteRangerEldar.getRanger();
        IArmeDeTir longFusil = ContexteRangerEldar.getLongFusilRanger();
        IReglesSpeciales regleAttaquant = ContexteRangerEldar.getRegleAttaque();

        IProfil soeurRepentia = ContexteSoeurRepentia.getSoeurRepentia();
        IReglesSpeciales regleDefense = ContexteSoeurRepentia.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(ranger).addArmeAttaquant(longFusil).addReglesAttaquant(regleAttaquant)
                .addProfilDefenseur(soeurRepentia).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaToucheSansBM = new Fraction(2, 3);
        Fraction probaToucheAvecBM = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateSauvegarde = new Fraction(5, 6);
        Fraction probaNePasIgnorerBlessure = new Fraction(2, 3);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaToucheSansBM).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNePasIgnorerBlessure).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaToucheAvecBM).addEvent(probaNePasIgnorerBlessure)
                .build();

        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }
}


Code:
package com.calculateur.warhammer.calcul.calcul;

import java.util.Arrays;

import org.apache.commons.math3.fraction.Fraction;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import com.calculateur.warhammer.data.ContexteActionImplementationBuilder;
import com.calculateur.warhammer.data.ContexteBatiment;
import com.calculateur.warhammer.data.ContexteGardienEldar;
import com.calculateur.warhammer.data.ContexteGuerrierNecron;
import com.calculateur.warhammer.data.ContexteImmortelNecron;
import com.calculateur.warhammer.data.ContexteMarinePeste;
import com.calculateur.warhammer.data.ContexteRangerEldar;
import com.calculateur.warhammer.data.ContexteSoeurBataille;
import com.calculateur.warhammer.data.ContexteSoeurRepentia;
import com.calculateur.warhammer.data.ContexteSpaceMarineIntersessor;
import com.calculateur.warhammer.data.ContexteTerminatorDeathwing;
import com.calculateur.warhammer.data.IArmeDeTir;
import com.calculateur.warhammer.data.IBatiment;
import com.calculateur.warhammer.data.IContexteAction;
import com.calculateur.warhammer.data.IProfil;
import com.calculateur.warhammer.data.IReglesSpeciales;

public class CalculMortTirContreChargeTest {

    private final ICalculMort<IArmeDeTir> calculMort;

    public CalculMortTirContreChargeTest() {
        calculMort = new CalculMortTirContreCharge();
    }

    @Test
    public void testSpaceMarineInterssessorTirentSurGuerrierNecronContreCharge() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessor.getRegleAttaqueBase();

        IProfil necron = ContexteGuerrierNecron.getGuerrierNecron();
        IReglesSpeciales regleBaseNecron = ContexteGuerrierNecron.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine).addArmeAttaquant(bolter)
                .addProfilDefenseur(necron).addReglesDefenseur(regleBaseNecron).addBatiment(aucun).build();
        Fraction probaTouche = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(2, 3);
        Fraction probaNecronNESeRelevePasDef1 = new Fraction(1, 2);
        Fraction probaNecronNESeRelevePasDef2 = new Fraction(2, 3);
        Fraction probaNecronNeSeRelevePasMaisRelance = new Fraction(1, 6);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNeSeRelevePasMaisRelance)
                .addEvent(probaNecronNESeRelevePasDef2).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).addEvent(probaNecronNESeRelevePasDef1).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineIntersessorTirentSurimmortelNecronContreCharge() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales regleBaseMarine = ContexteSpaceMarineIntersessor.getRegleAttaqueBase();

        IProfil immortel = ContexteImmortelNecron.getImmortelNecron();
        IReglesSpeciales regleDefense = ContexteImmortelNecron.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(regleBaseMarine).addArmeAttaquant(bolter)
                .addProfilDefenseur(immortel).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(1, 3);
        Fraction probaRateSave = new Fraction(1, 2);
        Fraction probaNeSeRelevePas = new Fraction(2, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSave).addEvent(probaNeSeRelevePas).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorACoteDeCommandantTirentSurGardienEldarContreCharge() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales doctrineTactiqueEtCommandantEtLieutenant = ContexteSpaceMarineIntersessor
                .getDoctrineEtCommandant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(doctrineTactiqueEtCommandantEtLieutenant)
                .addArmeAttaquant(bolter).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaToucheTir = new Fraction(1, 6);
        Fraction probaRateTirMaisRelance = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);
        // Marine rate tir
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaToucheTir)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Marine réussi tir
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorACoteDeLieutenantTirentSurGardienEldarContreCharge() throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales doctrineTactiqueEtCommandantEtLieutenant = ContexteSpaceMarineIntersessor
                .getDoctrineEtLieutenant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(doctrineTactiqueEtCommandantEtLieutenant)
                .addArmeAttaquant(bolter).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaToucheTir = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateBlessureMaisRetente = new Fraction(1, 6);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);
        // Marine rate blessure
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaRateBlessureMaisRetente)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Marine réussi blessure
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSpaceMarineInterssessorACoteDeCommandantEtLieutenantDansCouvertTirentSurGardienEldarContreCharge()
            throws CalculException {
        IProfil spaceMarine = ContexteSpaceMarineIntersessor.getProfilSpaceMarineIntersessor();
        IArmeDeTir bolter = ContexteSpaceMarineIntersessor.getFusilBolter();
        IReglesSpeciales doctrineTactiqueEtCommandantEtLieutenant = ContexteSpaceMarineIntersessor
                .getDoctrineEtCommandantEtLieutenant();

        IProfil GardienEldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleGardien = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment batiment = ContexteBatiment.getBatiment(false, false, true, false, false);

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(spaceMarine).addReglesAttaquant(doctrineTactiqueEtCommandantEtLieutenant)
                .addArmeAttaquant(bolter).addProfilDefenseur(GardienEldar).addReglesDefenseur(regleGardien)
                .addBatiment(batiment).build();

        Fraction probaToucheTir = new Fraction(1, 3);
        Fraction probaRateTirMaisRelance = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(2, 3);
        Fraction probaRateBlesseMaisRelance = new Fraction(1, 6);
        Fraction probaEldarRateSauvegarde = new Fraction(5, 6);

        // Touche ratée et Blesse réussie
        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaToucheTir)
                .addEvent(probaRateBlesseMaisRelance).addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Touche ratée mais blesse réussie
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaRateTirMaisRelance).addEvent(probaToucheTir)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Touche réussie mais blesse ratée
        Fraction ch3 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaRateBlesseMaisRelance)
                .addEvent(probaBlesse).addEvent(probaEldarRateSauvegarde).build();
        // Tout réussie
        Fraction ch4 = CheminBuilder.getInstance().addEvent(probaToucheTir).addEvent(probaBlesse)
                .addEvent(probaEldarRateSauvegarde).build();
        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2, ch3, ch4));

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testImmortelNecronTireSurTerminatorDeathwingContreCharge() throws CalculException {
        IProfil immortel = ContexteImmortelNecron.getImmortelNecron();
        IArmeDeTir eclateurGauss = ContexteImmortelNecron.getEclateurGauss();
        IReglesSpeciales regleImmortel = ContexteImmortelNecron.getRegleAttaque();

        IProfil terminator = ContexteTerminatorDeathwing.getTerminatorDeathwing();
        IReglesSpeciales regleDefense = ContexteTerminatorDeathwing.getRegleDefense();

        IBatiment batiment = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexteAction = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(immortel).addReglesAttaquant(regleImmortel).addArmeAttaquant(eclateurGauss)
                .addProfilDefenseur(terminator).addReglesDefenseur(regleDefense).addBatiment(batiment).build();

        Fraction probaTouche = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(1, 2);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexteAction);
        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSoeursTirentSurGardienBolterContreCharge() throws CalculException {
        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IArmeDeTir bolter = ContexteSoeurBataille.getBolter();
        IReglesSpeciales regleAttaque = ContexteSoeurBataille.getAttaqueRiteDirectionDivine();

        IProfil eldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleDefense = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(soeur).addArmeAttaquant(bolter).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(eldar).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(1, 6);
        Fraction probaBlessePANormal = new Fraction(1, 2);
        Fraction probaBlesseAmeliorationPA = new Fraction(1, 6);
        Fraction probaRateSauvegarceCas1 = new Fraction(1, 2);
        Fraction probaRateSauvegardeCas2 = new Fraction(2, 3);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlessePANormal)
                .addEvent(probaRateSauvegarceCas1).build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesseAmeliorationPA)
                .addEvent(probaRateSauvegardeCas2).build();

        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSoeursTirentSurGardienLanceFlammeLourdContreCharge() throws CalculException {
        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IArmeDeTir lanceFlammeLourd = ContexteSoeurBataille.getLanceFlammeLourd();
        IReglesSpeciales regleAttaque = ContexteSoeurBataille.getAttaqueRiteDirectionDivine();

        IProfil eldar = ContexteGardienEldar.getGardienEldar();
        IReglesSpeciales regleDefense = ContexteGardienEldar.getRegleDefenseGardien();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(soeur).addArmeAttaquant(lanceFlammeLourd).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(eldar).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaBlessePANormal = new Fraction(5, 6);
        Fraction probaBlesseAmeliorationPA = new Fraction(1, 6);
        Fraction probaRateSauvegarceCas1 = new Fraction(2, 3);
        Fraction probaRateSauvegardeCas2 = new Fraction(1, 6);

        Fraction ch1 = CheminBuilder.getInstance().addEvent(probaBlessePANormal).addEvent(probaRateSauvegarceCas1)
                .build();
        Fraction ch2 = CheminBuilder.getInstance().addEvent(probaBlesseAmeliorationPA).addEvent(probaRateSauvegardeCas2)
                .build();

        Fraction attendu = CheminBuilder.doSomme(Arrays.asList(ch1, ch2));

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testSoeursTirentSurMarineDeLaPesteContreCharge() throws CalculException {
        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IArmeDeTir bolter = ContexteSoeurBataille.getBolter();
        IReglesSpeciales regleAttaque = ContexteSoeurBataille.getAttaqueRiteDirectionDivine();

        IProfil marinePeste = ContexteMarinePeste.getMarinePeste();
        IReglesSpeciales regleDefense = ContexteMarinePeste.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(soeur).addArmeAttaquant(bolter).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(marinePeste).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(1, 3);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testMarinePesteTirentSurSoeurContreCharge() throws CalculException {
        IProfil marinePeste = ContexteMarinePeste.getMarinePeste();
        IArmeDeTir bolter = ContexteMarinePeste.getBolter();
        IReglesSpeciales regleAttaque = ContexteMarinePeste.getRegleAttaque();

        IProfil soeur = ContexteSoeurBataille.getSoeurBataille();
        IReglesSpeciales regleDefense = ContexteSoeurBataille.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(marinePeste).addArmeAttaquant(bolter).addReglesAttaquant(regleAttaque)
                .addProfilDefenseur(soeur).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(1, 6);
        Fraction probaBlesse = new Fraction(5, 6);
        Fraction probaRateSauvegarde = new Fraction(1, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaBlesse)
                .addEvent(probaRateSauvegarde).build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }

    @Test
    public void testRangerEldarTirentSoeursRepentiaContreCharge() throws CalculException {
        IProfil ranger = ContexteRangerEldar.getRanger();
        IArmeDeTir longFusil = ContexteRangerEldar.getLongFusilRanger();
        IReglesSpeciales regleAttaquant = ContexteRangerEldar.getRegleAttaque();

        IProfil soeurRepentia = ContexteSoeurRepentia.getSoeurRepentia();
        IReglesSpeciales regleDefense = ContexteSoeurRepentia.getRegleDefense();

        IBatiment aucun = ContexteBatiment.getAucun();

        IContexteAction<IArmeDeTir> contexte = ContexteActionImplementationBuilder.getInstancePhaseDeTir()
                .addProfilAttaquant(ranger).addArmeAttaquant(longFusil).addReglesAttaquant(regleAttaquant)
                .addProfilDefenseur(soeurRepentia).addReglesDefenseur(regleDefense).addBatiment(aucun).build();

        Fraction probaTouche = new Fraction(1, 6);
        Fraction probaNePasIgnorerBlessure = new Fraction(2, 3);

        Fraction attendu = CheminBuilder.getInstance().addEvent(probaTouche).addEvent(probaNePasIgnorerBlessure)
                .build();

        Fraction proba = calculMort.calculProbabiliteMort(contexte);

        Assertions.assertThat(proba).isEqualTo(attendu);
    }
}
Reply
Trouvé dans un placard chez mes parents, ça ne nous rajeunit pas ^^

[Image: 20220515-182524.jpg]
Reply
et beh putain il est collector celui-là Boidleau
Reply
Courage ...
Reply
Ça s'approche...
Reply
C'est le moment de ressortir les Land Raider, apparemment ils passent à E9 et leur canon laser à D6+2, cf leak codex chaos :

https://www.warhammer-forum.com/index.ph...nt-3722878
Reply
L'ultime crossover de ma jeunesse ^^
https://www.waylandgames.co.uk/magic-the...nd-abaddon
Reply
Oulà endu 9 on n'en voit pas partout...
En plus il a droppé en point, clairement il va revenir (surtout que l'impact PA est tel que l'endu 9 va le mettre au top des chars de la méta)
Reply


Forum Jump:


Users browsing this thread: 12 Guest(s)