private async Task <Tuple <IArbreConstruction, IFabriqueArbreDepuisJson> > ChargerFichierEtConstruire()
        {
            if (null != arbreDepuisFichierJson)
            {
                return(arbreDepuisFichierJson);
            }

            IArbreConstruction       arbre    = new ArbreConstruction();
            IFabriqueArbreDepuisJson fabrique = new FabriqueArbreDepuisJson(
                arbre,
                @"Services\Arbre\Construction\Donnees\Json\ConstructionArbre.json");
            await fabrique
            .ChargerFichierAsync();

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

            arbreDepuisFichierJson = new Tuple <IArbreConstruction, IFabriqueArbreDepuisJson>(
                arbre,
                fabrique);

            return(arbreDepuisFichierJson);
        }
        public void AjouterMemeTransitionAvecSymbole()
        {
            // Préparations
            IArbreConstruction arbre = new ArbreConstruction();
            var        etatSource    = arbre.AjouterEtat();
            var        etatCible     = arbre.AjouterEtat();
            const char symbole       = 'a';
            var        transition1   = arbre.AjouterTransition(
                etatSource,
                etatCible,
                symbole);

            // Action à vérifier
            var transition2 = arbre.AjouterTransition(
                etatSource,
                etatCible,
                symbole);

            // Tests
            Assert
            .AreEqual(
                transition1,
                transition2);
        }
        public async Task ConstruireRepetitionMin2Max3Echec()
        {
            // 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);

            // 0 fois => pas suffisant
            navigateur
            .TransitionsSansSymbole();
            Assert
            .IsFalse(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));

            // 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));

            // 4 fois => non
            navigateur
            .TransitionPar(
                chemin);
            Assert
            .IsFalse(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));
        }
        public async Task ConstruireReferenceDoubleNiveau()
        {
            // Préparations
            // Construction de 2 étiquette, l'une appelant l'autre
            IArbreConstruction arbre            = new ArbreConstruction();
            const string       chemin           = "123456";
            var          typeBlock              = EnumTypeBlock.Reference;
            const string idEtiquetteEnfant      = "EtiqEnfant";
            var          elementEtiquetteEnfant = new ElementEtiquetteConstructionDto(
                typeBlock,
                idEtiquetteEnfant,
                new ElementCheminConstructionDto(chemin));
            const string idEtiquetteParent      = "EtiqParent";
            var          elementEtiquetteParent = new ElementEtiquetteConstructionDto(
                typeBlock,
                idEtiquetteParent,
                new ElementReferenceConstructionDto(idEtiquetteEnfant));
            var elementReference = new ElementReferenceConstructionDto(
                idEtiquetteParent);
            var elementSequence = new SequenceElementsConstructionDto(
                new[]
            {
                elementReference,
                elementReference
            });
            var elementRacine = new ChoixElementsConstructionDto(
                new ElementConstructionDto[] {
                elementEtiquetteEnfant,
                elementEtiquetteParent,
                elementSequence     // = séquence contenant 2 références à l'étiquette de plus haut niveau
            });
            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));
        }
        public void TransitionsAvecSymboleX2()
        {
            // Préparations
            IArbreConstruction arbre    = new ArbreConstruction();
            const char         symbole1 = 'a';
            const char         symbole2 = 'b';
            var etat1 = arbre.AjouterEtat();
            var etat2 = arbre.AjouterEtat();
            var etat3 = arbre.AjouterEtat();
            var etat4 = arbre.AjouterEtat();
            var etat5 = arbre.AjouterEtat();
            var etat6 = arbre.AjouterEtat();
            var etat7 = arbre.AjouterEtat();

            arbre.AjouterTransition(
                etat1,
                etat2);
            arbre.AjouterTransition(
                etat1,
                etat4,
                symbole1);
            arbre.AjouterTransition(
                etat2,
                etat3);
            arbre.AjouterTransition(
                etat4,
                etat5);
            arbre.AjouterTransition(
                etat5,
                etat6,
                symbole2);
            arbre.AjouterTransition(
                etat6,
                etat7);

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

            // Action à vérifier
            navigateur
            .TransitionPar(symbole1);
            navigateur
            .TransitionPar(symbole2);

            // Tests

            // Tests sur l'origine
            Assert
            .AreEqual(
                1,
                navigateur.EtatsOrigine.Count());
            Assert
            .IsTrue(
                navigateur.EtatsOrigine.Contains(etat1));

            // Tests sur les états courants
            Assert
            .AreEqual(
                2,
                navigateur.EtatsCourants.Count());
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat6));
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat7));

            // Tests sur les transitions
            Assert
            .AreEqual(
                4,
                navigateur.Transitions.Count());
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat1 && t.EtatCible == etat4));
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat4 && t.EtatCible == etat5));
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat5 && t.EtatCible == etat6));
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat6 && t.EtatCible == etat7));
        }
        public void Ajouter2TransitionsAvecMemeSymbole()
        {
            // Préparations
            IArbreConstruction arbre = new ArbreConstruction();
            var        etatSource    = arbre.AjouterEtat();
            var        etatCible1    = arbre.AjouterEtat();
            var        etatCible2    = arbre.AjouterEtat();
            const char symbole       = 'a';
            var        transition1   = arbre.AjouterTransition(
                etatSource,
                etatCible1,
                symbole);

            // Action à vérifier
            var transition2 = arbre.AjouterTransition(
                etatSource,
                etatCible2,
                symbole);

            // Tests
            var etatSourceInfos = (arbre as ArbreConstruction)
                                  .RecupererInfos(etatSource);
            var etatSourceTransitionsSortantes = etatSourceInfos
                                                 .TransitionsSortantes;
            var transitionIntermediaire = etatSourceTransitionsSortantes
                                          .RecupererTransitionAvecSymbole(symbole);
            var etatIntermediaire = transitionIntermediaire
                                    .EtatCible;
            var etatIntermediaireInfos = (arbre as ArbreConstruction)
                                         .RecupererInfos(etatIntermediaire);
            var etatIntermediaireTransitionsSortantes = etatIntermediaireInfos
                                                        .TransitionsSortantes
                                                        .Transitions;

            Assert
            .IsFalse(
                new[] { etatSource, etatCible1, etatCible2 }.Contains(etatIntermediaire));
            Assert
            .IsTrue(
                etatSourceTransitionsSortantes.Transitions.All(t => t != transition1));
            Assert
            .AreEqual(
                symbole,
                transitionIntermediaire.Symbole);
            Assert
            .AreEqual(
                etatSource,
                transitionIntermediaire.EtatSource);
            Assert
            .AreEqual(
                2,
                etatIntermediaireTransitionsSortantes.Count());
            Assert
            .IsTrue(
                etatIntermediaireTransitionsSortantes.All(t => !t.Symbole.HasValue));
            Assert
            .IsNull(
                transition2.Symbole);
            Assert
            .IsTrue(
                etatIntermediaireTransitionsSortantes.Any(t => t.EtatCible == etatCible1));
            Assert
            .IsTrue(
                etatIntermediaireTransitionsSortantes.Any(t => t.EtatCible == etatCible2));
        }
        public void TransitionsSansSymbole()
        {
            // Préparations
            IArbreConstruction arbre = new ArbreConstruction();
            var etat1 = arbre.AjouterEtat();
            var etat2 = arbre.AjouterEtat();
            var etat3 = arbre.AjouterEtat();
            var etat4 = arbre.AjouterEtat();

            arbre.AjouterTransition(
                etat1,
                etat2);
            arbre.AjouterTransition(
                etat1,
                etat4,
                'a');
            arbre.AjouterTransition(
                etat2,
                etat3);

            var navigateur = (arbre as ArbreConstruction)
                             .RecupererNavigateurSur(
                etat1);

            // Action à vérifier
            navigateur
            .TransitionsSansSymbole();

            // Tests

            // Tests sur l'origine
            Assert
            .AreEqual(
                1,
                navigateur.EtatsOrigine.Count());
            Assert
            .IsTrue(
                navigateur.EtatsOrigine.Contains(etat1));

            // Tests sur les états courants
            Assert
            .AreEqual(
                3,
                navigateur.EtatsCourants.Count());
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat1));
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat2));
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat3));

            // Tests sur les transitions
            Assert
            .AreEqual(
                2,
                navigateur.Transitions.Count());
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat1 && t.EtatCible == etat2));
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat2 && t.EtatCible == etat3));
        }
        public void TransitionsAvecSymbole()
        {
            // Préparations
            IArbreConstruction arbre   = new ArbreConstruction();
            const char         symbole = 'a';
            var etat1 = arbre.AjouterEtat();
            var etat2 = arbre.AjouterEtat();
            var etat3 = arbre.AjouterEtat();
            var etat4 = arbre.AjouterEtat();
            var etat5 = arbre.AjouterEtat();

            arbre.AjouterTransition(
                etat1,
                etat2);
            arbre.AjouterTransition(
                etat1,
                etat4,
                symbole);
            arbre.AjouterTransition(
                etat2,
                etat3);
            arbre.AjouterTransition(
                etat4,
                etat5);

            var navigateur = (arbre as ArbreConstruction)
                             .RecupererNavigateurSur(
                etat1);

            navigateur
            .ForcerTransitionsSansSymboleEnSortie = false;

            // Action à vérifier
            navigateur
            .TransitionPar(symbole);

            // Tests

            // Tests sur l'origine
            Assert
            .AreEqual(
                1,
                navigateur.EtatsOrigine.Count());
            Assert
            .IsTrue(
                navigateur.EtatsOrigine.Contains(etat1));

            // Tests sur les états courants
            Assert
            .AreEqual(
                1,
                navigateur.EtatsCourants.Count());
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat4));

            // Tests sur les transitions
            Assert
            .AreEqual(
                1,
                navigateur.Transitions.Count());
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat1 && t.EtatCible == etat4));

            // + Transitions sans symbole
            navigateur
            .TransitionsSansSymbole();

            // Tests sur les états courants
            Assert
            .AreEqual(
                2,
                navigateur.EtatsCourants.Count());
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat4));
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(etat5));

            // Tests sur les transitions
            Assert
            .AreEqual(
                2,
                navigateur.Transitions.Count());
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat1 && t.EtatCible == etat4));
            Assert
            .IsTrue(
                navigateur.Transitions.Any(t => t.EtatSource == etat4 && t.EtatCible == etat5));
        }