main.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817
  1. /*
  2. * main.c
  3. *
  4. * Created on: 16.11.2011
  5. * Author: showcase
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <assert.h>
  10. #include <string.h>
  11. #include "Timer.h"
  12. #include "DummyTimer.h"
  13. #include "Test_ParallelRegionsStatemachine.h"
  14. /*@DTestSuite: ParallelRegions Statechart Test (Test_ParallelRegions.sct) */
  15. #define MAXEVENTSPERTYPE 4
  16. const char* stateName[10] = {"State1", "State2", "State3", "State4", "State5", "State6", "State7", "State8", "State9", "noState"};
  17. const int EnumTostateStr[10] = {
  18. _Test_ParallelRegions_mainRegion_State1,
  19. _Test_ParallelRegions_mainRegion_State2,
  20. _Test_ParallelRegions_mainRegion_State2_Region1_State3,
  21. _Test_ParallelRegions_mainRegion_State2_Region1_State4,
  22. _Test_ParallelRegions_mainRegion_State2_Region1_State4_Region2_State5,
  23. _Test_ParallelRegions_mainRegion_State2_Region1_State4_Region2_State6,
  24. _Test_ParallelRegions_mainRegion_State2_Region3_State7,
  25. _Test_ParallelRegions_mainRegion_State2_Region3_State8,
  26. _Test_ParallelRegions_mainRegion_State2_Region1_State4_Region4_State9,
  27. last_state };
  28. const char* getStateString(uint32_t index)
  29. {
  30. int i;
  31. for (i=0; i<10; ++i)
  32. if (EnumTostateStr[i] == index)
  33. return stateName[i];
  34. return stateName[last_state];
  35. }
  36. void setupStatemachine(Test_ParallelRegionsStatemachine* machine, Timer* dummyTimer, EventPool* eventPool)
  37. {
  38. /* set up dummy Timer */
  39. dummyTimer_init(dummyTimer);
  40. /* Set up Event Pool */
  41. test_ParallelRegions_eventPool_init_heap(eventPool, MAXEVENTSPERTYPE);
  42. /* initialize state machine */
  43. test_ParallelRegionsStatemachine_init(machine, dummyTimer, eventPool);
  44. /* call all necessary enter functions */
  45. test_ParallelRegionsStatemachine_enter(machine);
  46. }
  47. void teardownStatemachine(Test_ParallelRegionsStatemachine* machine, Timer* dummyTimer, EventPool* eventPool)
  48. {
  49. /* call all exit actions for this state machine */
  50. test_ParallelRegionsStatemachine_exit(machine);
  51. /* free all internal memory for this state machine */
  52. test_ParallelRegionsStatemachine_destruct(machine);
  53. /* free the timer */
  54. timer_exit(dummyTimer);
  55. /* free all events in the event pool */
  56. eventPool_exit(eventPool);
  57. }
  58. /*@Test: test_initialization test the initialization of the state vector */
  59. int test_initialization()
  60. {
  61. Test_ParallelRegionsStatemachine machine;
  62. Timer dummyTimer;
  63. EventPool eventPool;
  64. /*@Desc: setup initial statemachine */
  65. setupStatemachine(&machine, &dummyTimer, &eventPool);
  66. /*@Desc: check the initial state at position 0 to be State1 */
  67. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  68. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  69. /*@Desc: check the initial state at position 1 to be no State */
  70. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  71. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  72. /*@Desc: check the initial state at position 2 to be no State */
  73. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  74. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  75. /*@Desc: teardown statemachine */
  76. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  77. return 0;
  78. }
  79. /*@Test: test_state1_transition_event1 test the transition into Region1 and Region3 */
  80. int test_state1_transition_event1()
  81. {
  82. Test_ParallelRegionsStatemachine machine;
  83. Timer dummyTimer;
  84. EventPool eventPool;
  85. /*@Desc: setup initial statemachine */
  86. setupStatemachine(&machine, &dummyTimer, &eventPool);
  87. /*@Desc: check the initial state at position 0 */
  88. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  89. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  90. /*@Desc: raise event1 on default interface */
  91. test_ParallelRegions_if_raise_event1(&machine.iface);
  92. /*@Desc: run an explicit cycle */
  93. test_ParallelRegionsStatemachine_runCycle(&machine);
  94. /*@Desc: check the initial state at position 0 to be State3 */
  95. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  96. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State3") == 0);
  97. /*@Desc: check the initial state at position 1 to be no State */
  98. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  99. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  100. /*@Desc: check the initial state at position 2 to be State7 */
  101. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  102. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  103. /*@Desc: teardown statemachine */
  104. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  105. return 0;
  106. }
  107. /*@Test: test_state1_transition_and_back test behavior when jumping from state1 into parallel regions with state3 and 7 and from state3 back to state1 */
  108. int test_state1_transition_and_back()
  109. {
  110. Test_ParallelRegionsStatemachine machine;
  111. Timer dummyTimer;
  112. EventPool eventPool;
  113. /*@Desc: setup initial statemachine */
  114. setupStatemachine(&machine, &dummyTimer, &eventPool);
  115. /*@Desc: check the initial state at position 0 */
  116. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  117. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  118. /*@Desc: raise event1 on default interface */
  119. test_ParallelRegions_if_raise_event1(&machine.iface);
  120. /*@Desc: run an explicit cycle */
  121. test_ParallelRegionsStatemachine_runCycle(&machine);
  122. /*@Desc: check the initial state at position 0 to be State3 */
  123. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  124. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State3") == 0);
  125. /*@Desc: check the initial state at position 2 to be State7 */
  126. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  127. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  128. /*@Desc: raise event10 on default interface */
  129. test_ParallelRegions_if_raise_event10(&machine.iface);
  130. printf("run Cycle ..\n");
  131. /*@Desc: run an explicit cycle */
  132. test_ParallelRegionsStatemachine_runCycle(&machine);
  133. /*@Desc: check the initial state at position 0 to be State1 */
  134. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  135. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  136. /*@Desc: check the initial state at position 1 to be no State */
  137. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  138. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  139. /*@Desc: check the initial state at position 2 to be no State */
  140. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  141. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  142. /*@Desc: teardown statemachine */
  143. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  144. return 0;
  145. }
  146. /*@Test: test_state1_transition_and_back test behavior when jumping from state1 into parallel regions with state3 and 7 and from state3 back from state3 */
  147. int test_state1_transition_and_back_from_state3()
  148. {
  149. Test_ParallelRegionsStatemachine machine;
  150. Timer dummyTimer;
  151. EventPool eventPool;
  152. /*@Desc: setup initial statemachine */
  153. setupStatemachine(&machine, &dummyTimer, &eventPool);
  154. /*@Desc: check the initial state at position 0 */
  155. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  156. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  157. /*@Desc: raise event1 on default interface */
  158. test_ParallelRegions_if_raise_event1(&machine.iface);
  159. /*@Desc: run an explicit cycle */
  160. test_ParallelRegionsStatemachine_runCycle(&machine);
  161. /*@Desc: check the initial state at position 0 to be State3 */
  162. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  163. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State3") == 0);
  164. /*@Desc: check the initial state at position 2 to be State7 */
  165. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  166. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  167. /*@Desc: raise event9 on default interface */
  168. test_ParallelRegions_if_raise_event9(&machine.iface);
  169. /*@Desc: run an explicit cycle */
  170. test_ParallelRegionsStatemachine_runCycle(&machine);
  171. /*@Desc: check the initial state at position 0 to be State1 */
  172. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  173. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  174. /*@Desc: check the initial state at position 1 to be no State */
  175. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  176. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  177. /*@Desc: check the initial state at position 2 to be no State */
  178. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  179. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  180. /*@Desc: teardown statemachine */
  181. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  182. return 0;
  183. }
  184. /*@Test: test_state1_transition_and_back test behavior when jumping from state1 into parallel regions with state3 and 7 and from state7 back from state3 */
  185. int test_state1_transition_and_back_from_state7()
  186. {
  187. Test_ParallelRegionsStatemachine machine;
  188. Timer dummyTimer;
  189. EventPool eventPool;
  190. /*@Desc: setup initial statemachine */
  191. setupStatemachine(&machine, &dummyTimer, &eventPool);
  192. /*@Desc: check the initial state at position 0 */
  193. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  194. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  195. /*@Desc: raise event1 on default interface */
  196. test_ParallelRegions_if_raise_event1(&machine.iface);
  197. /*@Desc: run an explicit cycle */
  198. test_ParallelRegionsStatemachine_runCycle(&machine);
  199. /*@Desc: check the initial state at position 0 to be State3 */
  200. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  201. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State3") == 0);
  202. /*@Desc: check the initial state at position 2 to be State7 */
  203. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  204. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  205. /*@Desc: raise event9 on default interface */
  206. test_ParallelRegions_if_raise_event7(&machine.iface);
  207. /*@Desc: run an explicit cycle */
  208. test_ParallelRegionsStatemachine_runCycle(&machine);
  209. /*@Desc: check the initial state at position 0 to be State1 */
  210. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  211. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  212. /*@Desc: check the initial state at position 1 to be no State */
  213. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  214. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  215. /*@Desc: check the initial state at position 2 to be no State */
  216. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  217. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  218. /*@Desc: teardown statemachine */
  219. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  220. return 0;
  221. }
  222. /*@Test: test_state1_transition_to_State4 test the transition into Region2, Region3 and Region4 */
  223. int test_state1_transition_to_State4()
  224. {
  225. Test_ParallelRegionsStatemachine machine;
  226. Timer dummyTimer;
  227. EventPool eventPool;
  228. /*@Desc: setup initial statemachine */
  229. setupStatemachine(&machine, &dummyTimer, &eventPool);
  230. /*@Desc: check the initial state at position 0 */
  231. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  232. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  233. /*@Desc: raise event1 on default interface */
  234. test_ParallelRegions_if_raise_event1(&machine.iface);
  235. /*@Desc: run an explicit cycle */
  236. test_ParallelRegionsStatemachine_runCycle(&machine);
  237. /*@Desc: raise event2 on default interface */
  238. test_ParallelRegions_if_raise_event2(&machine.iface);
  239. /*@Desc: run an explicit cycle */
  240. test_ParallelRegionsStatemachine_runCycle(&machine);
  241. /*@Desc: check the initial state at position 0 to be State5 */
  242. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  243. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State5") == 0);
  244. /*@Desc: check the initial state at position 1 to be State9 */
  245. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  246. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "State9") == 0);
  247. /*@Desc: check the initial state at position 2 to be State7 */
  248. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  249. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  250. /*@Desc: teardown statemachine */
  251. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  252. return 0;
  253. }
  254. /*@Test: test_parallel_event3_handling_state5_state7 test event3 handling within state5 and event7 */
  255. int test_parallel_event3_handling_state5_state7()
  256. {
  257. Test_ParallelRegionsStatemachine machine;
  258. Timer dummyTimer;
  259. EventPool eventPool;
  260. /*@Desc: setup initial statemachine */
  261. setupStatemachine(&machine, &dummyTimer, &eventPool);
  262. /*@Desc: check the initial state at position 0 */
  263. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  264. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  265. /*@Desc: raise event1 on default interface */
  266. test_ParallelRegions_if_raise_event1(&machine.iface);
  267. /*@Desc: run an explicit cycle */
  268. test_ParallelRegionsStatemachine_runCycle(&machine);
  269. /*@Desc: raise event2 on default interface */
  270. test_ParallelRegions_if_raise_event2(&machine.iface);
  271. /*@Desc: run an explicit cycle */
  272. test_ParallelRegionsStatemachine_runCycle(&machine);
  273. /*@Desc: raise event3 on default interface */
  274. test_ParallelRegions_if_raise_event3(&machine.iface);
  275. /*@Desc: run an explicit cycle */
  276. test_ParallelRegionsStatemachine_runCycle(&machine);
  277. /*@Desc: check the initial state at position 0 to be State6 */
  278. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  279. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State6") == 0);
  280. /*@Desc: check the initial state at position 1 to be State9 */
  281. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  282. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "State9") == 0);
  283. /*@Desc: check the initial state at position 2 to be State8 */
  284. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  285. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State8") == 0);
  286. /*@Desc: teardown statemachine */
  287. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  288. return 0;
  289. }
  290. /*@Test: test_parallel_event3_handling_state5_state7 test event3 handling within state5 and event7 */
  291. int test_preference_event3_leaving_state3_and_state7()
  292. {
  293. Test_ParallelRegionsStatemachine machine;
  294. Timer dummyTimer;
  295. EventPool eventPool;
  296. /*@Desc: setup initial statemachine */
  297. setupStatemachine(&machine, &dummyTimer, &eventPool);
  298. /*@Desc: check the initial state at position 0 */
  299. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  300. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  301. /*@Desc: raise event1 on default interface */
  302. test_ParallelRegions_if_raise_event1(&machine.iface);
  303. /*@Desc: run an explicit cycle */
  304. test_ParallelRegionsStatemachine_runCycle(&machine);
  305. /*@Desc: check whether reg3 is set correctly to 7 */
  306. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == 7);
  307. /*@Desc: check the initial state at position 0 to be State3 */
  308. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  309. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State3") == 0);
  310. /*@Desc: check the initial state at position 0 to be State7 */
  311. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  312. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  313. /*@Desc: raise event3 on default interface */
  314. test_ParallelRegions_if_raise_event3(&machine.iface);
  315. /*@Desc: run an explicit cycle */
  316. test_ParallelRegionsStatemachine_runCycle(&machine);
  317. /*@Desc: check the initial state at position 0 to be State1 */
  318. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  319. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  320. /*@Desc: check the initial state at position 1 to be no State */
  321. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  322. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  323. /*@Desc: check the initial state at position 2 to be no State */
  324. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  325. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  326. /*@Desc: check whether reg3 is set correctly to -1 */
  327. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == -1);
  328. /*@Desc: teardown statemachine */
  329. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  330. return 0;
  331. }
  332. /*@Test: test_state1_transition_directly_to_state8 test the transition into Region3 to State8 and implicitly to Region1 State3 */
  333. int test_state1_transition_directly_to_state8()
  334. {
  335. Test_ParallelRegionsStatemachine machine;
  336. Timer dummyTimer;
  337. EventPool eventPool;
  338. /*@Desc: setup initial statemachine */
  339. setupStatemachine(&machine, &dummyTimer, &eventPool);
  340. /*@Desc: check the initial state at position 0 */
  341. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  342. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  343. /*@Desc: raise event12 on default interface */
  344. test_ParallelRegions_if_raise_event12(&machine.iface);
  345. /*@Desc: run an explicit cycle */
  346. test_ParallelRegionsStatemachine_runCycle(&machine);
  347. /*@Desc: check the initial state at position 0 to be State3 */
  348. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  349. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State3") == 0);
  350. /*@Desc: check the initial state at position 1 to be no State */
  351. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  352. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  353. /*@Desc: check the initial state at position 2 to be State8 */
  354. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  355. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State8") == 0);
  356. /*@Desc: check whether reg3 is set correctly to 8 */
  357. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == 8);
  358. /*@Desc: teardown statemachine */
  359. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  360. return 0;
  361. }
  362. /*@Test: test_state1_transition_directly_to_state6 test the transition into Region2 to State6 and implicitly to Region4 State9 and Region3 State7 */
  363. int test_state1_transition_directly_to_state6()
  364. {
  365. Test_ParallelRegionsStatemachine machine;
  366. Timer dummyTimer;
  367. EventPool eventPool;
  368. /*@Desc: setup initial statemachine */
  369. setupStatemachine(&machine, &dummyTimer, &eventPool);
  370. /*@Desc: check the initial state at position 0 */
  371. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  372. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  373. /*@Desc: raise event12 on default interface */
  374. test_ParallelRegions_if_raise_event11(&machine.iface);
  375. /*@Desc: run an explicit cycle */
  376. test_ParallelRegionsStatemachine_runCycle(&machine);
  377. /*@Desc: check the initial state at position 0 to be State6 */
  378. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  379. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State6") == 0);
  380. /*@Desc: check the initial state at position 1 to be State9 */
  381. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  382. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "State9") == 0);
  383. /*@Desc: check the initial state at position 2 to be State7 */
  384. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  385. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  386. /*@Desc: check whether reg3 is set correctly to 7 */
  387. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == 7);
  388. /*@Desc: teardown statemachine */
  389. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  390. return 0;
  391. }
  392. /*@Test: test_state1_transition_directly_to_state4 test the transition into Region2 to State5 and Region4 State9 and implicitly to Region3 State7 */
  393. int test_state1_transition_directly_to_state4()
  394. {
  395. Test_ParallelRegionsStatemachine machine;
  396. Timer dummyTimer;
  397. EventPool eventPool;
  398. /*@Desc: setup initial statemachine */
  399. setupStatemachine(&machine, &dummyTimer, &eventPool);
  400. /*@Desc: check the initial state at position 0 */
  401. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  402. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  403. /*@Desc: raise event13 on default interface */
  404. test_ParallelRegions_if_raise_event13(&machine.iface);
  405. /*@Desc: run an explicit cycle */
  406. test_ParallelRegionsStatemachine_runCycle(&machine);
  407. /*@Desc: check the initial state at position 0 to be State5 */
  408. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  409. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State5") == 0);
  410. /*@Desc: check the initial state at position 1 to be State9 */
  411. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  412. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "State9") == 0);
  413. /*@Desc: check the initial state at position 2 to be State7 */
  414. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  415. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  416. /*@Desc: check whether reg3 is set correctly to 7 */
  417. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == 7);
  418. /*@Desc: teardown statemachine */
  419. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  420. return 0;
  421. }
  422. /*@Test: test_hierarchy_traversal_event12_event8 test the transition into Region2 to State5 and Region4 State9 and implicitly to Region3 State7 */
  423. int test_hierarchy_traversal_event12_event2_event8()
  424. {
  425. Test_ParallelRegionsStatemachine machine;
  426. Timer dummyTimer;
  427. EventPool eventPool;
  428. /*@Desc: setup initial statemachine */
  429. setupStatemachine(&machine, &dummyTimer, &eventPool);
  430. /*@Desc: check the initial state at position 0 */
  431. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  432. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  433. /*@Desc: raise event12 on default interface */
  434. test_ParallelRegions_if_raise_event12(&machine.iface);
  435. /*@Desc: run an explicit cycle */
  436. test_ParallelRegionsStatemachine_runCycle(&machine);
  437. /*@Desc: check whether hierarchy is set correctly to 5 */
  438. assert( test_ParallelRegions_if_get_hierarchy(&machine.iface) == 2+3);
  439. /*@Desc: raise event2 on default interface */
  440. test_ParallelRegions_if_raise_event2(&machine.iface);
  441. /*@Desc: run an explicit cycle */
  442. test_ParallelRegionsStatemachine_runCycle(&machine);
  443. /*@Desc: check whether hierarchy value is set correctly to 35 */
  444. printf( "Hierarchy has value %d, should be 35\n", test_ParallelRegions_if_get_hierarchy(&machine.iface) );
  445. assert( test_ParallelRegions_if_get_hierarchy(&machine.iface) == (((2+3)*4)+5)+10);
  446. /*@Desc: check whether reg3 is set correctly to 8 */
  447. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == 8);
  448. /*@Desc: raise event8 on default interface */
  449. test_ParallelRegions_if_raise_event8(&machine.iface);
  450. /*@Desc: run an explicit cycle */
  451. test_ParallelRegionsStatemachine_runCycle(&machine);
  452. /*@Desc: check the initial state at position 0 to be State5 */
  453. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  454. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  455. /*@Desc: check the initial state at position 1 to be State9 */
  456. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  457. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  458. /*@Desc: check the initial state at position 2 to be State7 */
  459. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  460. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  461. /*@Desc: check whether reg3 is set correctly to 2 */
  462. assert( test_ParallelRegions_if_get_hierarchy(&machine.iface) == 2);
  463. /*@Desc: check whether reg3 is set correctly to -1 */
  464. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == -1);
  465. /*@Desc: teardown statemachine */
  466. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  467. return 0;
  468. }
  469. /*@Test: test_hierarchy_traversal_event11_event10 test the transition into Region2 to State6 and Region4 State9 and implicitly to Region3 State7 */
  470. int test_hierarchy_traversal_event11_event10()
  471. {
  472. Test_ParallelRegionsStatemachine machine;
  473. Timer dummyTimer;
  474. EventPool eventPool;
  475. /*@Desc: setup initial statemachine */
  476. setupStatemachine(&machine, &dummyTimer, &eventPool);
  477. /*@Desc: check the initial state at position 0 */
  478. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  479. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  480. /*@Desc: raise event11 on default interface */
  481. test_ParallelRegions_if_raise_event11(&machine.iface);
  482. /*@Desc: run an explicit cycle */
  483. test_ParallelRegionsStatemachine_runCycle(&machine);
  484. /*@Desc: check the initial state at position 0 to be State5 */
  485. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  486. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State6") == 0);
  487. /*@Desc: check the initial state at position 1 to be State9 */
  488. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  489. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "State9") == 0);
  490. /*@Desc: check the initial state at position 2 to be State7 */
  491. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  492. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  493. /*@Desc: check whether hierarchy is set correctly to 36 */
  494. assert( test_ParallelRegions_if_get_hierarchy(&machine.iface) == (((2+3)*4)+6)+10);
  495. /*@Desc: check whether reg3 is set correctly to 7 */
  496. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == 7);
  497. /*@Desc: raise event2 on default interface */
  498. test_ParallelRegions_if_raise_event10(&machine.iface);
  499. /*@Desc: run an explicit cycle */
  500. test_ParallelRegionsStatemachine_runCycle(&machine);
  501. /*@Desc: check the initial state at position 0 to be State5 */
  502. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  503. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  504. /*@Desc: check the initial state at position 1 to be State9 */
  505. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  506. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  507. /*@Desc: check the initial state at position 2 to be State7 */
  508. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  509. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  510. /*@Desc: check whether reg3 is set correctly to 2 */
  511. assert( test_ParallelRegions_if_get_hierarchy(&machine.iface) == 2);
  512. /*@Desc: check whether reg3 is set correctly to -1 */
  513. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == -1);
  514. /*@Desc: teardown statemachine */
  515. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  516. return 0;
  517. }
  518. /*@Test: test_hierarchy_traversal_event11_event10 test the transition into Region2 to State6 and Region4 State9 and implicitly to Region3 State7 */
  519. int test_hierarchy_traversal_event13_event14()
  520. {
  521. Test_ParallelRegionsStatemachine machine;
  522. Timer dummyTimer;
  523. EventPool eventPool;
  524. /*@Desc: setup initial statemachine */
  525. setupStatemachine(&machine, &dummyTimer, &eventPool);
  526. /*@Desc: check the initial state at position 0 */
  527. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  528. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  529. /*@Desc: raise event11 on default interface */
  530. test_ParallelRegions_if_raise_event13(&machine.iface);
  531. /*@Desc: run an explicit cycle */
  532. test_ParallelRegionsStatemachine_runCycle(&machine);
  533. /*@Desc: check the initial state at position 0 to be State5 */
  534. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  535. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State5") == 0);
  536. /*@Desc: check the initial state at position 1 to be State9 */
  537. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  538. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "State9") == 0);
  539. /*@Desc: check the initial state at position 2 to be State7 */
  540. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  541. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "State7") == 0);
  542. /*@Desc: check whether hierarchy is set correctly to 36 */
  543. assert( test_ParallelRegions_if_get_hierarchy(&machine.iface) == (((2+3)*4)+5)+10);
  544. /*@Desc: check whether reg3 is set correctly to 7 */
  545. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == 7);
  546. /*@Desc: raise event2 on default interface */
  547. test_ParallelRegions_if_raise_event14(&machine.iface);
  548. /*@Desc: run an explicit cycle */
  549. test_ParallelRegionsStatemachine_runCycle(&machine);
  550. /*@Desc: check the initial state at position 0 to be State5 */
  551. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)));
  552. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 0)), "State1") == 0);
  553. /*@Desc: check the initial state at position 1 to be State9 */
  554. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)));
  555. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 1)), "noState") == 0);
  556. /*@Desc: check the initial state at position 2 to be State7 */
  557. printf("%s\n", getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)));
  558. assert( strcmp(getStateString(statemachineBase_getState((StatemachineBase*)&machine, 2)), "noState") == 0);
  559. /*@Desc: check whether reg3 is set correctly to 2 */
  560. printf ("The hierarchy value is set to %d\n",test_ParallelRegions_if_get_hierarchy(&machine.iface));
  561. assert( test_ParallelRegions_if_get_hierarchy(&machine.iface) == 2);
  562. /*@Desc: check whether reg3 is set correctly to -1 */
  563. assert( test_ParallelRegions_if_get_reg3(&machine.iface) == -1);
  564. /*@Desc: teardown statemachine */
  565. teardownStatemachine(&machine, &dummyTimer, &eventPool);
  566. return 0;
  567. }
  568. int main(int argc, char** argv)
  569. {
  570. if (argc != 2)
  571. return -1;
  572. switch (atoi(argv[1])) {
  573. case 1:
  574. return test_initialization();
  575. case 2:
  576. return test_state1_transition_event1();
  577. case 3:
  578. return test_state1_transition_and_back();
  579. case 4:
  580. return test_state1_transition_and_back_from_state3();
  581. case 5:
  582. return test_state1_transition_and_back_from_state7();
  583. case 6:
  584. return test_state1_transition_to_State4();
  585. case 7:
  586. return test_parallel_event3_handling_state5_state7();
  587. case 8:
  588. return test_preference_event3_leaving_state3_and_state7();
  589. case 9:
  590. return test_state1_transition_directly_to_state8();
  591. case 10:
  592. return test_state1_transition_directly_to_state6();
  593. case 11:
  594. return test_state1_transition_directly_to_state4();
  595. case 12:
  596. return test_hierarchy_traversal_event12_event2_event8();
  597. case 13:
  598. return test_hierarchy_traversal_event11_event10();
  599. case 14:
  600. return test_hierarchy_traversal_event13_event14();
  601. }
  602. return -1;
  603. }