Research Article

Synthesis of Test Scenarios Using UML Sequence Diagrams

Algorithm 1

Function ProcessFragment (Fragment: fragmentId, A: curNode).
Input:   𝑓 π‘Ÿ π‘Ž 𝑔 π‘š 𝑒 𝑛 𝑑 𝐼 𝑑 : Fragment, a tag indicating the type of fragment
     𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 ∈ 𝐴
Output:   𝑒 π‘₯ 𝑖 𝑑 𝑁 π‘œ 𝑑 𝑒 ∈ 𝐴
1:  While  ! End Offragment do // end of current fragment
2:    π‘₯ = 𝐺 𝑒 𝑑 𝑁 𝑒 π‘₯ 𝑑 𝐸 𝑙 𝑒 π‘š 𝑒 𝑛 𝑑 ( ) ;   // Read the next element
    in the fragment
3:    if π‘₯ = β€² 𝐸 𝑂 𝐹 β€² then // Termination condition
4:    𝑒 π‘₯ 𝑖 𝑑 𝑁 π‘œ 𝑑 𝑒 = 𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 ;
5:    return   𝑒 π‘₯ 𝑖 𝑑 𝑁 π‘œ 𝑑 𝑒
6:    end if
7:    case:   π‘₯ = β€² π‘š 𝑒 𝑠 𝑠 π‘Ž 𝑔 𝑒 β€²     // π‘₯ is a message element
8:     InsertAtPos ( 𝑖 , π‘₯ , 𝐿 ) ;
9:     x = GetNextElement();
10:    while π‘₯ = β€² π‘š 𝑒 𝑠 𝑠 π‘Ž 𝑔 𝑒 β€²   do
11:      InsertAtPos ( 𝑖 + 1 , π‘₯ , 𝐿 ) ;
12:      x = GetNextElement();
13:    end while
14:    if π‘₯ ! = β€² π‘š 𝑒 𝑠 𝑠 π‘Ž 𝑔 𝑒 β€²   then
15:       unread(x); break;
16:    end if
17:   𝐡 𝑁 = 𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐡 𝑙 π‘œ 𝑐 π‘˜ 𝑁 π‘œ 𝑑 𝑒 ( 𝐿 )     // Create a block
  node, 𝐡 𝑁 with block of messages in partial order 𝑂 ;
18:    ConnectEdge ( 𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 , 𝐡 𝑁 ) ;    // Edge from
   𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 to the next node 𝐡 𝑁
19:    𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 = 𝐡 𝑁 ;
20:  end case;
21:  case:   π‘₯ = β€² 𝑙 π‘œ π‘œ 𝑝 β€²      // π‘₯ is a loop fragment
22:        𝐷 𝑁   =   𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐷 𝑒 𝑐 𝑖 𝑠 𝑖 π‘œ 𝑛 𝑁 π‘œ 𝑑 𝑒 ( π‘₯ . 𝑔 𝑒 π‘Ž π‘Ÿ 𝑑 )
          // Create decision node with predicate
      𝑔 𝑒 π‘Ž π‘Ÿ 𝑑 in π‘₯ ;
23:       ConnectEdge ( 𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 , 𝐷 𝑁 ) ;
24:        𝑦 = 𝑃 π‘Ÿ π‘œ 𝑐 𝑒 𝑠 𝑠 𝐹 π‘Ÿ π‘Ž 𝑔 π‘š 𝑒 𝑛 𝑑 ( π‘₯ , 𝐷 𝑁 . 𝑇 𝑅 π‘ˆ 𝐸 ) ;
25:       ConnectEdge ( 𝑦 , 𝐷 𝑁 ) ;     // Create back edge
26:        𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 = 𝐷 𝑁 . 𝐹 𝐴 𝐿 𝑆 𝐸 ;       // Out edge
      from decision node
27:    end case;
28:    case:   π‘₯ = β€² π‘œ 𝑝 𝑑 β€²      // π‘₯ is an opt fragment
29:        𝐷 𝑁    =    𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐷 𝑒 𝑐 𝑖 𝑠 𝑖 π‘œ 𝑛 𝑁 π‘œ 𝑑 𝑒 ( π‘₯ . 𝑔 𝑒 π‘Ž π‘Ÿ 𝑑 )
          // Create decision node with predicate
      𝑔 𝑒 π‘Ž π‘Ÿ 𝑑 in π‘₯ ;
30:       ConnectEdge ( 𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 , 𝐷 𝑁 ) ;
31:        𝑦 = 𝑃 π‘Ÿ π‘œ 𝑐 𝑒 𝑠 𝑠 𝐹 π‘Ÿ π‘Ž 𝑔 π‘š 𝑒 𝑛 𝑑 ( π‘₯ , 𝐷 𝑁 . 𝑇 𝑅 π‘ˆ 𝐸 ) ;
32:        𝑀 𝑁 = 𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝑀 𝑒 π‘Ÿ 𝑔 𝑒 𝑁 π‘œ 𝑑 𝑒 ( ) ;
33:       ConnectEdge ( 𝐷 𝑁 . 𝐹 𝐴 𝐿 𝑆 𝐸 , 𝑀 𝑁 ) ;
34:       ConnectEdge ( 𝑦 , 𝑀 𝑁 ) ;
35:        𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 = 𝑀 𝑁 ;
36:    end case;
37:    case:   π‘₯ = β€² 𝑏 π‘Ÿ 𝑒 π‘Ž π‘˜ β€²       // π‘₯ is a break fragment
38:        𝐷 𝑁    =    𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐷 𝑒 𝑐 𝑖 𝑠 𝑖 π‘œ 𝑛 𝑁 π‘œ 𝑑 𝑒 ( π‘₯ . 𝑔 𝑒 π‘Ž π‘Ÿ 𝑑 )
          // Create decision node with predicate
      𝑔 𝑒 π‘Ž π‘Ÿ 𝑑 in π‘₯ ;
39:       ConnectEdge ( 𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 , 𝐷 𝑁 ) ;
40:        𝑦 = 𝑃 π‘Ÿ π‘œ 𝑐 𝑒 𝑠 𝑠 𝐹 π‘Ÿ π‘Ž 𝑔 π‘š 𝑒 𝑛 𝑑 ( π‘₯ , 𝐷 𝑁 . 𝑇 𝑅 π‘ˆ 𝐸 ) ;
41:        𝑓 𝑛 = 𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐹 𝑖 𝑛 π‘Ž 𝑙 𝑁 π‘œ 𝑑 𝑒 ( ) ;
42:       ConnectEdge ( 𝑦 , 𝑓 𝑛 ) ;
43:        𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 = 𝐷 𝑁 . 𝐹 𝐴 𝐿 𝑆 𝐸 ;
44:    end case;
45:    case:   π‘₯ = β€² π‘Ž 𝑙 𝑑 β€²       // π‘₯ is an alt fragment
46:       𝐷 𝑁   =   𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐷 𝑒 𝑐 𝑖 𝑠 𝑖 π‘œ 𝑛 𝑁 π‘œ 𝑑 𝑒 ( 𝑛 𝑖 𝑙 )       //
      Create decision node with multioperands;
47:       ConnectEdge ( 𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 , 𝐷 𝑁 ) ;
48:        𝑀 𝑁 = 𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝑀 𝑒 π‘Ÿ 𝑔 𝑒 𝑁 π‘œ 𝑑 𝑒 ( ) ;
49:       for   𝑒 π‘Ž 𝑐 β„Ž π‘œ 𝑝 𝑒 π‘Ÿ π‘Ž 𝑛 𝑑 π‘œ 𝑝 𝑑 𝑖 ∈ π‘₯
50:            𝑒 𝑖 = 𝑔 𝑒 π‘Ž π‘Ÿ 𝑑 ( π‘œ 𝑝 𝑑 𝑖 ) ;
51:            𝑦 = 𝑃 π‘Ÿ π‘œ 𝑐 𝑒 𝑠 𝑠 𝐹 π‘Ÿ π‘Ž 𝑔 π‘š 𝑒 𝑛 𝑑 ( π‘œ 𝑝 𝑑 𝑖 , 𝐷 𝑁 . 𝑒 𝑖 ) ;
52:           ConnectEdge ( 𝑦 , 𝑀 𝑁 ) ;
53:       end for
54:        𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 = 𝑀 𝑁 ;
55:    end case;
56:    case:   π‘₯ = β€² 𝑝 π‘Ž π‘Ÿ β€²       // π‘₯ is a par fragment
57:        𝐹 𝑁 = 𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐹 π‘œ π‘Ÿ π‘˜ 𝑁 π‘œ 𝑑 𝑒 ( )       //Create fork
      node;
58:       ConnectEdge ( 𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 , 𝐹 𝑁 ) ;
59:        𝐽 𝑁 = 𝐢 π‘Ÿ 𝑒 π‘Ž 𝑑 𝑒 𝐽 π‘œ 𝑖 𝑛 𝑁 π‘œ 𝑑 𝑒 ( ) ;
60:       for   𝑒 π‘Ž 𝑐 β„Ž π‘œ 𝑝 𝑒 π‘Ÿ π‘Ž 𝑛 𝑑 π‘œ 𝑝 𝑑 𝑖 ∈ π‘₯
61:            𝑦 = 𝑃 π‘Ÿ π‘œ 𝑐 𝑒 𝑠 𝑠 𝐹 π‘Ÿ π‘Ž 𝑔 π‘š 𝑒 𝑛 𝑑 ( π‘œ 𝑝 𝑑 𝑖 , 𝐹 𝑁 ) ;
62:           ConnectEdge ( 𝑦 , 𝐽 𝑁 ) ;
63:       end for
64:        𝑐 𝑒 π‘Ÿ 𝑁 π‘œ 𝑑 𝑒 = 𝐽 𝑁 ;
65:    end case;
66:  end while
67: exitNode = curNode;
68:  return  𝑒 π‘₯ 𝑖 𝑑 𝑁 π‘œ 𝑑 𝑒
Function ProcessFragment ( 𝐹 π‘Ÿ π‘Ž 𝑔 π‘š 𝑒 𝑛 𝑑 , 𝐴 )