コード例 #1
0
        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));
        }
コード例 #2
0
ファイル: FabriqueArbre.cs プロジェクト: TheManu/ArbreLexical
        private async Task ConstruireReferenceAsync(
            IEnumerable <Etat> etatsDebut,
            IEnumerable <Etat> etatsFin,
            ElementReferenceConstructionDto donnees,
            Dictionary <string, IConstructionElementArbre> dicoReferences = null)
        {
            try
            {
                if (null != donnees?.Id &&
                    !string.IsNullOrWhiteSpace(donnees.Id))
                {
                    dicoReferences = dicoReferences ?? new Dictionary <string, IConstructionElementArbre>();
                    var elementParent = await CreerElementAsync(
                        etatsDebut,
                        etatsFin);

                    IConstructionElementArbre elementRefCirculaire;
                    if (dicoReferences.TryGetValue(donnees.Id, out elementRefCirculaire))
                    { // C'est une référence circulaire => ajout d'une transition vers le début de la construction de la référence
                        arbre
                        .AjouterTransition(
                            elementParent.EtatEntree,
                            elementRefCirculaire.EtatEntree);
                        arbre
                        .AjouterTransition(
                            elementRefCirculaire.EtatSortie,
                            elementParent.EtatSortie);

                        arbre
                        .Etiquetter(
                            $"RefCirculaire: {donnees.Id}-{elementParent.EtatEntree}/{elementParent.EtatSortie}",
                            EnumTypeBlock.Autre,
                            elementParent.EtatEntree,
                            elementParent.EtatSortie);
                    }
                    else
                    { // Pas de référence circulaire => construction de la référence (reportée si l'étiquette n'est pas encore définie)
                        BlockInfos blockInfosEnregistre = null;
                        lock (blocksInfos)
                        {
                            blockInfosEnregistre = blocksInfos
                                                   .FirstOrDefault(b => b.Id == donnees.Id);

                            if (null == blockInfosEnregistre)
                            {
                                blockInfosEnregistre = new BlockInfos(
                                    donnees.Id);

                                blocksInfos
                                .Add(
                                    blockInfosEnregistre);
                            }

                            if (null == blockInfosEnregistre.Donnees)
                            { // Le block n'existe pas encore => ajout pour référencer cette cible
                                blockInfosEnregistre
                                .AjouterElementEnAttente(
                                    elementParent);
                            }
                        }

                        if (null != blockInfosEnregistre?.Donnees)
                        { // Création de la référence
                            var elementSource             = blockInfosEnregistre.Donnees;
                            var dicoReferencesPourEnfants = new Dictionary <string, IConstructionElementArbre>(
                                dicoReferences);
                            dicoReferencesPourEnfants
                            .Add(
                                donnees.Id,
                                elementParent);

                            await ConstruireAsync(
                                new Etat[] { elementParent.EtatEntree },
                                new Etat[] { elementParent.EtatSortie },
                                elementSource,
                                dicoReferencesPourEnfants);

                            arbre
                            .Etiquetter(
                                donnees.Id,
                                blockInfosEnregistre.TypeBlock,
                                elementParent.EtatEntree,
                                elementParent.EtatSortie);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw EncapsulerEtGererException <ExceptionTechniqueArbreConstruction>(
                          ex);
            }
        }
コード例 #3
0
        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));
        }