public async Task ConstruireEtiquetteSansEnregistrement()
        {
            // Préparations
            IArbreConstruction arbre       = new ArbreConstruction();
            const string       chemin      = "123456";
            const string       idEtiquette = "Etiq";
            var typeBlock     = EnumTypeBlock.Autre;
            var elementEnfant = new ElementCheminConstructionDto(chemin);
            var elementRacine = new ElementEtiquetteConstructionDto(
                typeBlock,
                idEtiquette,
                elementEnfant);
            IFabriqueArbre fabrique = new FabriqueArbre(
                arbre,
                elementRacine);

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

            // Tests
            Assert
            .IsNotNull(
                (fabrique as FabriqueArbre).ElementsConstruction);
            Assert
            .AreEqual(
                0,
                ((fabrique as FabriqueArbre).BlocksInfos?.Count).GetValueOrDefault(0));
        }
        public async Task ConstruireCheminReussite()
        {
            // Préparations
            IArbreConstruction arbre  = new ArbreConstruction();
            const string       chemin = "123456";
            var elementRacine         = new ElementCheminConstructionDto(
                chemin);
            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);

            navigateur
            .TransitionPar(
                chemin);
            Assert
            .IsTrue(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));
        }
        public async Task ConstruireSequenceEchec()
        {
            // Préparations
            IArbreConstruction arbre       = new ArbreConstruction();
            const string       chemin1     = "123456";
            const string       chemin2     = "abcdef";
            const string       cheminSuivi = "6";
            var elementRacine = new SequenceElementsConstructionDto(
                new[]
            {
                new ElementCheminConstructionDto(chemin1),
                new ElementCheminConstructionDto(chemin2)
            });
            IFabriqueArbre fabrique = new FabriqueArbre(
                arbre,
                elementRacine);

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

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

            // Sans cheminer => échec
            var navigateur = (arbre as ArbreConstruction)
                             .RecupererNavigateurMultiSymbolesSur(
                arbre.EtatEntree);

            navigateur
            .TransitionsSansSymbole();
            Assert
            .IsFalse(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));

            // Autre chemin => pas de cible
            navigateur = (arbre as ArbreConstruction)
                         .RecupererNavigateurMultiSymbolesSur(
                arbre.EtatEntree);
            navigateur
            .TransitionPar(
                cheminSuivi);
            Assert
            .AreEqual(
                0,
                navigateur.EtatsCourants.Count());
        }
        public async Task ConstruireReferenceEchec()
        {
            // Préparations
            IArbreConstruction arbre       = new ArbreConstruction();
            const string       chemin      = "123456";
            const string       cheminSuivi = "ab";
            const string       idEtiquette = "Etiq";
            var typeBlock        = EnumTypeBlock.Reference;
            var elementEtiquette = new ElementEtiquetteConstructionDto(
                typeBlock,
                idEtiquette,
                new ElementCheminConstructionDto(chemin));
            var elementReference = new ElementReferenceConstructionDto(
                idEtiquette);
            var elementRacine = new ChoixElementsConstructionDto(
                new ElementConstructionDto[] {
                elementEtiquette,
                elementReference
            });
            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);

            navigateur
            .TransitionPar(
                cheminSuivi);
            Assert
            .IsFalse(
                navigateur.EtatsCourants.Contains(arbre.EtatSortie));
        }
        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));
        }