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