public async Task ConstruireRepetitionMin2Max3Reussite()
        {
            // Préparations
            IArbreConstruction arbre  = new ArbreConstruction();
            const string       chemin = "123456";
            var elementRacine         = new ElementRepetitionConstructionDto(
                new ElementCheminConstructionDto(chemin),
                2,
                3);
            IFabriqueArbre fabrique = new FabriqueArbre(
                arbre,
                elementRacine);

            // Action à vérifier
            await fabrique
            .ConstruireAsync();

            // Tests
            Assert
            .IsNotNull(
                (fabrique as FabriqueArbre).ElementsConstruction);

            var navigateur = (arbre as ArbreConstruction)
                             .RecupererNavigateurMultiSymbolesSur(
                arbre.EtatEntree);

            // 1 fois => pas suffisant
            navigateur
            .TransitionPar(
                chemin);
            Assert
            .IsFalse(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));

            // 2 fois => ok
            navigateur
            .TransitionPar(
                chemin);
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));

            // 3 fois => ok
            navigateur
            .TransitionPar(
                chemin);
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));
        }
Exemplo n.º 2
0
        private async Task ConstruireRepetitionAsync(
            IEnumerable <Etat> etatsDebut,
            IEnumerable <Etat> etatsFin,
            ElementRepetitionConstructionDto donnees,
            Dictionary <string, IConstructionElementArbre> dicoReferences = null)
        {
            try
            {
                if (null != donnees?.Element)
                {
                    var nbreMin = donnees.NombreMin;
                    var nbreMax = donnees.NombreMax
                                  .GetValueOrDefault(int.MaxValue);

                    if (nbreMin >= 0 &&
                        nbreMax >= 1 &&
                        nbreMin <= nbreMax)
                    {
                        var tasks        = new List <Task>();
                        int nbreElements = Math.Max(
                            nbreMin,
                            nbreMax == int.MaxValue ? 1 : nbreMax);

                        var elementParent = await CreerElementAsync(
                            etatsDebut,
                            etatsFin);

                        var etatsDebutOuFin       = new Etat[] { elementParent.EtatEntree };
                        var etatsFinElementParent = new Etat[] { elementParent.EtatSortie };

                        if (nbreMin == 0)
                        {
                            arbre
                            .AjouterTransition(
                                elementParent.EtatEntree,
                                elementParent.EtatSortie);
                        }

                        for (int i = 0; i < nbreElements; i++)
                        {
                            var element = await CreerElementAsync(
                                etatsDebutOuFin,
                                i + 1 == nbreElements?
                                etatsFinElementParent :
                                null);

                            etatsDebutOuFin = new Etat[] { element.EtatSortie };

                            if (i == 0 &&
                                nbreMax == int.MaxValue)
                            { // Max = infini => boucle sur le 1er élément
                                arbre
                                .AjouterTransition(
                                    element.EtatSortie,
                                    element.EtatEntree);
                            }

                            if (nbreMin < nbreElements &&
                                i + 1 == nbreMin)
                            { // min < max (< infini) => sortie possible
                                arbre
                                .AjouterTransition(
                                    element.EtatSortie,
                                    elementParent.EtatSortie);
                            }

                            var task = ConstruireAsync(
                                new Etat[] { element.EtatEntree },
                                etatsDebutOuFin,
                                donnees.Element,
                                dicoReferences);
                            tasks
                            .Add(task);
                        }

                        Task
                        .WaitAll(
                            tasks.ToArray());
                    }
                }
            }
            catch (Exception ex)
            {
                throw EncapsulerEtGererException <ExceptionTechniqueArbreConstruction>(
                          ex);
            }
        }