• Aucun résultat trouvé

Chapitre 6 SeTGaM pour les diagrammes d’états-transitions

6.2 Calcul des dépendances

6.2.2 Dépendances de contrôle

Les dépendances de contrôle sont basées sur la post-dominance entre état et état et entre état et transition. Pour ce faire, nous allons proposer trois algorithmes, associés à chaque définition donnée. Puis nous proposons l’algorithme global qui s’appuie sur ces dernières.

Définition 10 (Post-Dominance entre États) Un état S post-domine un autre état V du diagramme d’états/transitions si et seulement si tous les chemins partant de V jusqu’à l’état de final F passent pas S .

Pour construire l’algorithme correspondant à la définition de Post-dominance entre États nous nous sommes retrouvés face au problème de cycle, comme la présence de

6.2. Calcul des dépendances transitions réflexives dans les diagrammes. Ceci autorise un nombre infini de passages par une transition, donc un parcours entre deux états possiblement infini. Afin de résoudre ce problème, à chaque passage par une transition, nous la marquons comme visitée, et nous continuons le parcours tant qu’il reste des transitions non-visitées. Pour chaque nouveau parcours, les transitions sont remises à l’état initial i.e non-visités.

Entrées : S,V : State - états du diagramme d’états/transitions Sorties : res : Boolean - variable booléen

Données : model : le modèle avec un diagramme d’états/transitions; 1 res = true; 2 si V = S alors 3 return true; 4 sinon 5 si V.isFinalState() alors 6 return false; 7 sinon 8 si V ∈ model.getVisistedStates() alors 9 return true; 10 sinon

11 tant que (V.getNbNonVisitedNeighbours()>0 & res = true) faire 12 State B = V.getFirstNonVisitedNeighbour();

13 V.visitNeighbour(B);

14 res = res & totalAccessFromStateToState (S,B);

15 fin 16 model.visit(V); 17 return res; 18 fin 19 fin 20 fin Procédure totalAccessFromStateToState(S,V)

La procédure totalAccessFromStateToState est un parcours en profondeur (first-depth) qui détermine si un état V du diagramme d’états/transitions est post-dominé par un autre état S . Il renvoie vrai si tout chemin de l’état V passe par S , faux sinon. Cette idée est exprimée dans la procédure récursive totalAccessFromStateToState dont la condition d’arrêt est quand :

– les états S et V sont les mêmes (ligne 2)

– l’état final est atteint sans passer par l’état S (ligne 5) – l’état V a été déjà visité (ligne 8)

– il n’y a plus de voisins de l’état V à visiter ou qu’il a pu conclure sur la post- dominance (ligne 11)

Il est à noter, que nous considérons six opérations qui seront seulement décrites :

– getNbNonVisitedNeighbours() : pour un état, il donne le nombre d’états voisins non- visités.

– getFirstNonVisitedNeighbour() : pour un état, il renvoie le premier voisin non-visité d’un état donné.

– getVisistedStates() : renvoie l’ensemble d’états dont tous les états voisins ont été visité lors du parcours. Cet état est dit complètement visité.

– visitNeighbour(State) : s’applique sur un état et permet de marquer l’état voisin State en tant que visité.

– visit(State) : permet de marquer un état State comme complètement visité. – isFinalState() : permet de vérifier si un état est l’état final.

Entrées :

S, S’ : de type State qui représente les états du diagramme d’états/transitions

Sorties : postDominance : martice [State]x[State] où [S][S’] est vrai si l’état S post-domine S’, faux sinon; Données : model : le modèle;

pour chaque State S ∈ model faire

pour chaque State S’ ∈ model où S 6= S’ faire

postDominanceStateState[S][S’] = totalAccessFromStateToState (S,S’); model.ReInitVisit() ;

fin fin

Algorithme 3: Post-dominance entre États post-domine(S,S’)

L’algorithme 3 de Post-dominance entre États détermine pour chaque état s’il post-domine un autre état en complétant par vrai ou faux le tableau de post-dominance. À chaque boucle dans l’algorithme, l’appel à la procédure totalAccessFromStateToState est fait sur les deux états sélectionnés. Après l’exécution de la procédure totalAccessFromSta- teToState, les états visités sont remis à leur état initial i.e. non-visité par la fonction ReInitVisit .

En respectant la définition 11, nous recherchons s’il existe un état qui post-domine une transition, défini par l’algorithme 4.

Entrées :

S : état du diagramme d’états/transitions; T : transition du diagramme d’états/transitions; Sorties :

postDominanceStateTransition : matrice [State][Transition] où [S][T] est vrais si l’état S post-domine la transition T;

Données : model : le modèle; pour chaque State S ∈ model faire

pour chaque Transition T ∈ model faire

si T.arriving()=S & T.departure() 6= S alors postDominanceStateTransition[S][T] = true; sinon si (postDominanceStateState[S][T.arriving()]) alors postDominanceStateTransition[S][T] = true; fin fin fin fin

Algorithme 4: Post-dominance État/Transition post-domine(S,T)

Définition 11 (Post-Dominance État/Transition) Un état S post-domine une tran- sition T du diagramme d’états/transitions si et seulement si tout chemin passant par la transition T passent obligatoirement par S pour atteindre l’état final F .

Dans l’algorithme 4, nous utilisons deux fonctions qui permettent de récupérer l’état cible ou l’état source d’une transition :

6.2. Calcul des dépendances – arriving() : s’applique sur une transition et renvoie l’état d’arrivée d’une transition

i.e l’état cible.

– departure() : s’applique sur une transition et renvoie l’état de départ d’une transition i.e l’état source.

En disposant des définitions 10 et 11 et les algorithmes 3 et 4 respectifs nous pouvons constituer la définition sur les dépendances de contrôle 12 et son algorithme 5.

Données : model : le modèle;

T, T’ : transitions du diagramme d’états/transitions;

Sorties : controlDependance : matrice de type [Transition]x[Transition] où [T][T’] est vrai si T’ est contrôle dépendante de T;

pour chaque Transition T ∈ model faire State sourceT = T.departure();

pour chaque Transition T’ ∈ model faire State sourceT’ = T’.departure();

si !post-domine(sourceT’,sourceT) & post-domine(sourceT’,T) alors controlDependance[T][T’]=true;

fin fin fin

Algorithme 5: Dépendance de contrôle

Définition 12 (Dépendance de contrôle) Une transition T contrôle une autre tran- sition T0 si et seulement si : (i ) l’état parent de T0 ne post-domine pas l’état parent de la transition T , et (ii ) l’état parent de T0 post-domine la transition T .

Remarque : L’ensemble de couples hT , T0i est appelé graphe de dépendances de contrôle.

Nous allons illustrer le calcul de dépendances de contrôle sur la transition register − success, représentée sur la figure 6.2.

Figure 6.2 – Extrait du diagramme d’états/transitions d’eCinema

Sur la partie gauche Post-dominance du tableau 6.3, nous donnons les résultats sur les post-dominances entre état/état et état/transition, issus du diagramme d’états/tran- sitions de la figure 6.2.

Sur la partie droite Dépendance de contrôle du tableau 6.3, nous récapitulons les dé- pendances de contrôle, issues du diagramme d’états/transitions et les post-dominances

Post-dominance Dépendance de contrôle

welcome register register-success goToHome-fromReg goToRegister

register-success x x

goToHome-fromReg x x

goToRegister x

welcome

register x

Table 6.3 – Post-dominance et dépendances de contrôle sur un fragment d’eCinema

état/transition et état/état. En appliquant l’algorithme 5, nous constatons que l’état register , qui est l’état de départ de register-success, ne post-domine pas l’état welcome qui est l’état de départ de goToRegister et que la transition goToRegister est post-dominée par l’état register .

Suite à ces résultats, issus du tableau 6.3, nous pouvons conclure que la transition register-success est contrôle dépendante de la transition goToRegister . De même, nous pouvons conclure que la transition goToHome-fromReg est contrôle dépendante de la transition goToRegister .

Ces dépendances entre les transitions ajoutées au résultat du calcul des différences vont ensuite permettre de définir les transitions indirectement impactées par l’évolution. L’ensemble de tous ces résultats sera utilisé pour la gestion du cycle de vie des tests.