main.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <string.h>
  5. #include "Timer.h"
  6. #include "DummyTimer.h"
  7. #include "InterfaceTestStatemachine.h"
  8. #include "InterfaceTestEvent.h"
  9. #define MAXEVENTSPERTYPE 4
  10. const char* stateName[6] = {"State1", "State2", "State3", "State4", "State5", "State6"};
  11. void setupStatemachine(Timer* dummyTimer, EventPool* eventPool)
  12. {
  13. /* set up dummy Timer */
  14. dummyTimer_init(dummyTimer);
  15. /* Set up Event Pool */
  16. interfaceTest_eventPool_init_heap(eventPool, MAXEVENTSPERTYPE);
  17. /* initialize state machine */
  18. interfaceTestStatemachine_init(dummyTimer, eventPool);
  19. /* call all necessary enter functions */
  20. interfaceTestStatemachine_enter();
  21. }
  22. void teardownStatemachine(Timer* dummyTimer, EventPool* eventPool)
  23. {
  24. /* call all exit actions for this state machine */
  25. interfaceTestStatemachine_exit();
  26. /* free all internal memory for this state machine */
  27. interfaceTestStatemachine_destruct();
  28. /* free the timer */
  29. timer_exit(dummyTimer);
  30. /* free all events in the event pool */
  31. eventPool_exit(eventPool);
  32. }
  33. /*@Test: test_default_interface good case, guard matches */
  34. int test_default_interface_good()
  35. {
  36. InterfaceTestStatemachine* machine;
  37. Timer dummyTimer;
  38. EventPool eventPool;
  39. integer retval;
  40. printf("start\n");
  41. /*@Desc: setup initial statemachine */
  42. setupStatemachine(&dummyTimer, &eventPool);
  43. /* get the handle only for getting the state name */
  44. machine = interfaceTest_get_handle();
  45. /*@Desc: check the initial state */
  46. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  47. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  48. /*@Desc: raise event1 on default interface */
  49. interfaceTest_if_raise_event1();
  50. /*@DescInfo: Initial value for the guard is 2.3, which is bigger than 0, so the transition should be taken */
  51. /*@Desc: run an explicit cycle */
  52. interfaceTestStatemachine_runCycle();
  53. /*@Desc: check whether the state is set to "State2" */
  54. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  55. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State2") == 0);
  56. /*@Desc: check if the entry event2 is raised */
  57. assert( interfaceTest_if_is_event2_raised(&retval) == bool_true );
  58. /*@Desc: check if the return value of event2 is set to 22 */
  59. assert( retval == 22 );
  60. /*@Desc: raise event1 on default interface */
  61. interfaceTest_if_raise_event1();
  62. /*@Desc: run an explicit cycle */
  63. interfaceTestStatemachine_runCycle();
  64. /*@Desc: check whether state has changed back to "State1" */
  65. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  66. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  67. /*@Desc: check whether event2 is not raised any more */
  68. assert( interfaceTest_if_is_event2_raised(&retval) == bool_false );
  69. /*@Desc: teardown statemachine */
  70. teardownStatemachine(&dummyTimer, &eventPool);
  71. return 0;
  72. }
  73. /*@Test: test_default_interface good case, guard matches */
  74. int test_default_interface_bad()
  75. {
  76. InterfaceTestStatemachine* machine;
  77. Timer dummyTimer;
  78. EventPool eventPool;
  79. integer retval = 55;
  80. /*@Desc: setup initial statemachine */
  81. setupStatemachine(&dummyTimer, &eventPool);
  82. /* get the handle only for getting the state name */
  83. machine = interfaceTest_get_handle();
  84. /*@Desc: check the initial state */
  85. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  86. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  87. /*@Desc: set variable var2 to -12.6 */
  88. interfaceTest_if_set_var2(-12.6);
  89. /*@Desc: raise event1 on default interface */
  90. interfaceTest_if_raise_event1();
  91. /*@DescInfo: Transition should not be taken, as guard with var2 is less than 0 */
  92. /*@Desc: run an explicit cycle */
  93. interfaceTestStatemachine_runCycle();
  94. /*@Desc: check whether the state is still set to "State1" */
  95. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  96. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  97. /*@Desc: check if the entry event2 is NOT raised */
  98. assert( interfaceTest_if_is_event2_raised(&retval) == bool_false );
  99. /*@Desc: check if the original retval has not been changed */
  100. assert( retval == 55 );
  101. /*@Desc: raise event1 on default interface */
  102. interfaceTest_if_raise_event1();
  103. /*@Desc: set variable var2 to 213.55 (>0) */
  104. interfaceTest_if_set_var2(213.55);
  105. /*@Desc: run an explicit cycle */
  106. interfaceTestStatemachine_runCycle();
  107. /*@Desc: check whether state has changed back to "State2" */
  108. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  109. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State2") == 0);
  110. /*@Desc: check whether event2 is raised */
  111. assert( interfaceTest_if_is_event2_raised(&retval) == bool_true );
  112. /*@Desc: teardown statemachine */
  113. teardownStatemachine(&dummyTimer, &eventPool);
  114. return 0;
  115. }
  116. /*@Test: test_other_interface good case, guard matches */
  117. int test_other_interface_good()
  118. {
  119. InterfaceTestStatemachine* machine;
  120. Timer dummyTimer;
  121. EventPool eventPool;
  122. /*@Desc: setup initial statemachine */
  123. setupStatemachine(&dummyTimer, &eventPool);
  124. /* get the handle only for getting the state name */
  125. machine = interfaceTest_get_handle();
  126. /*@Desc: check the initial state */
  127. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  128. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  129. /*@Desc: raise event3 on other interface */
  130. interfaceTest_if_other_raise_event3();
  131. /*@DescInfo: Initial value for the guard is var3 == 1, which is the initial value, so the transition should be taken */
  132. /*@Desc: run an explicit cycle */
  133. interfaceTestStatemachine_runCycle();
  134. /*@Desc: check whether the state is set to "State3" */
  135. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  136. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State3") == 0);
  137. /*@Desc: check if the entry event4 is raised */
  138. assert( interfaceTest_if_other_is_event4_raised() == bool_true );
  139. /*@Desc: raise event3 on other interface */
  140. interfaceTest_if_other_raise_event3();
  141. /*@Desc: run an explicit cycle */
  142. interfaceTestStatemachine_runCycle();
  143. /*@Desc: check whether state has changed back to "State1" */
  144. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  145. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  146. /*@Desc: check whether event4 is not raised any more */
  147. assert( interfaceTest_if_other_is_event4_raised() == bool_false );
  148. /*@Desc: teardown statemachine */
  149. teardownStatemachine(&dummyTimer, &eventPool);
  150. return 0;
  151. }
  152. /*@Test: test_default_interface good case, guard matches */
  153. int test_other_interface_bad()
  154. {
  155. InterfaceTestStatemachine* machine;
  156. Timer dummyTimer;
  157. EventPool eventPool;
  158. /*@Desc: setup initial statemachine */
  159. setupStatemachine(&dummyTimer, &eventPool);
  160. /* get the handle only for getting the state name */
  161. machine = interfaceTest_get_handle();
  162. /*@Desc: check the initial state */
  163. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  164. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  165. /*@Desc: set variable var3 to 2 in default interface */
  166. interfaceTest_if_set_var3(2);
  167. /*@Desc: raise event1 on other interface */
  168. interfaceTest_if_other_raise_event3();
  169. /*@DescInfo: Transition should not be taken, as guard with var3 is not equal 1 */
  170. /*@Desc: run an explicit cycle */
  171. interfaceTestStatemachine_runCycle();
  172. /*@Desc: check whether the state is still set to "State1" */
  173. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  174. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  175. /*@Desc: check if the entry event2 is NOT raised */
  176. assert( interfaceTest_if_other_is_event4_raised() == bool_false );
  177. /*@Desc: raise event1 on other interface */
  178. interfaceTest_if_other_raise_event3();
  179. /*@Desc: set variable var3 to 1 */
  180. interfaceTest_if_set_var3(1);
  181. /*@Desc: run an explicit cycle */
  182. interfaceTestStatemachine_runCycle();
  183. /*@Desc: check whether state has changed back to "State2" */
  184. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  185. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State3") == 0);
  186. /*@Desc: check whether event2 is raised */
  187. assert( interfaceTest_if_other_is_event4_raised() == bool_true );
  188. /*@Desc: teardown statemachine */
  189. teardownStatemachine(&dummyTimer, &eventPool);
  190. return 0;
  191. }
  192. /*@Test: test_third_interface good case, guard matches */
  193. int test_third_interface_good()
  194. {
  195. InterfaceTestStatemachine* machine;
  196. Timer dummyTimer;
  197. EventPool eventPool;
  198. sc_boolean retVal = bool_false;
  199. /*@Desc: setup initial statemachine */
  200. setupStatemachine(&dummyTimer, &eventPool);
  201. /* get the handle only for getting the state name */
  202. machine = interfaceTest_get_handle();
  203. /*@Desc: check the initial state */
  204. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  205. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  206. /*@Desc: raise event5 on other interface */
  207. interfaceTest_if_third_raise_event5();
  208. /*@Desc: set var1 to true */
  209. interfaceTest_if_set_var1(bool_true);
  210. /*@Desc: run an explicit cycle */
  211. interfaceTestStatemachine_runCycle();
  212. /*@Desc: check whether the state is set to "State4" */
  213. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  214. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State4") == 0);
  215. /*@Desc: check if the entry event4 is raised */
  216. assert( interfaceTest_if_third_is_event6_raised(&retVal) == bool_true );
  217. /*@Desc: check whether returned event6 value is set to true */
  218. assert( retVal == bool_true );
  219. /*@Desc: raise event5 on other interface */
  220. interfaceTest_if_third_raise_event5();
  221. /*@Desc: set retValue to false */
  222. retVal = bool_false;
  223. /*@Desc: run an explicit cycle */
  224. interfaceTestStatemachine_runCycle();
  225. /*@Desc: check whether state has changed back to "State1" */
  226. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  227. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  228. /*@Desc: check whether event4 is not raised any more */
  229. assert( interfaceTest_if_third_is_event6_raised(&retVal) == bool_false );
  230. /*@Desc: check whether returned event6 value is set to false */
  231. assert( retVal == bool_false );
  232. /*@Desc: teardown statemachine */
  233. teardownStatemachine(&dummyTimer, &eventPool);
  234. return 0;
  235. }
  236. /*@Test: test_default_interface good case, guard matches */
  237. int test_third_interface_bad()
  238. {
  239. InterfaceTestStatemachine* machine;
  240. Timer dummyTimer;
  241. EventPool eventPool;
  242. sc_boolean retVal = bool_false;
  243. /*@Desc: setup initial statemachine */
  244. setupStatemachine(&dummyTimer, &eventPool);
  245. /* get the handle only for getting the state name */
  246. machine = interfaceTest_get_handle();
  247. /*@Desc: check the initial state */
  248. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  249. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  250. /*@Desc: set variable var1 to false in default interface */
  251. interfaceTest_if_set_var1(bool_false);
  252. /*@Desc: raise event1 on third interface */
  253. interfaceTest_if_third_raise_event5();
  254. /*@DescInfo: Transition should not be taken, as guard with var3 is not equal 1 */
  255. /*@Desc: run an explicit cycle */
  256. interfaceTestStatemachine_runCycle();
  257. /*@Desc: check whether the state is still set to "State1" */
  258. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  259. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  260. /*@Desc: check if the entry event2 is NOT raised */
  261. assert( interfaceTest_if_third_is_event6_raised(&retVal) == bool_false );
  262. /*@Desc: raise event5 on third interface */
  263. interfaceTest_if_third_raise_event5();
  264. /*@Desc: set variable var1 to true on default interface */
  265. interfaceTest_if_set_var1(bool_true);
  266. /*@Desc: run an explicit cycle */
  267. interfaceTestStatemachine_runCycle();
  268. /*@Desc: check whether state has changed back to "State2" */
  269. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  270. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State4") == 0);
  271. /*@Desc: check whether event2 is raised */
  272. assert( interfaceTest_if_third_is_event6_raised(&retVal) == bool_true );
  273. /*@Desc: check whether returned event6 value is set to true */
  274. assert( retVal == bool_true );
  275. /*@Desc: teardown statemachine */
  276. teardownStatemachine(&dummyTimer, &eventPool);
  277. return 0;
  278. }
  279. int test_namespaces()
  280. {
  281. InterfaceTestStatemachine* machine;
  282. Timer dummyTimer;
  283. EventPool eventPool;
  284. /*@Desc: setup initial statemachine */
  285. setupStatemachine(&dummyTimer, &eventPool);
  286. /* get the handle only for getting the state name */
  287. machine = interfaceTest_get_handle();
  288. /*@Desc: check the initial state */
  289. printf("%s\n", stateName[statemachineBase_getState((StatemachineBase*)machine, 0)]);
  290. assert( strcmp(stateName[statemachineBase_getState((StatemachineBase*)machine, 0)], "State1") == 0);
  291. /*@Desc: check correct initialization of variable v1 */
  292. assert( interfaceTest_if_other_get_v1() == 5 );
  293. /*@Desc: set third interface variable v1 to 52.83 */
  294. interfaceTest_if_third_set_v1( 52.83 );
  295. /*@Desc: set other interface variable to 8877 */
  296. interfaceTest_if_other_set_v1( 8877 );
  297. /*@DescInfo: toogle through all states */
  298. /*@Desc: raise event1 on default event */
  299. interfaceTest_if_raise_event1();
  300. /*@Desc: run an explicit cycle */
  301. interfaceTestStatemachine_runCycle();
  302. /*@Desc: raise event1 on default event */
  303. interfaceTest_if_raise_event1();
  304. /*@Desc: run an explicit cycle */
  305. interfaceTestStatemachine_runCycle();
  306. /*@Desc: raise event3 on default event */
  307. interfaceTest_if_other_raise_event3();
  308. /*@Desc: run an explicit cycle */
  309. interfaceTestStatemachine_runCycle();
  310. /*@Desc: raise event3 on default event */
  311. interfaceTest_if_other_raise_event3();
  312. /*@Desc: run an explicit cycle */
  313. interfaceTestStatemachine_runCycle();
  314. /*@Desc: set var1 of default interface to true */
  315. interfaceTest_if_set_var1( bool_true);
  316. /*@Desc: raise event5 on default event */
  317. interfaceTest_if_third_raise_event5();
  318. /*@Desc: run an explicit cycle */
  319. interfaceTestStatemachine_runCycle();
  320. /*@Desc: raise event5 on default event */
  321. interfaceTest_if_third_raise_event5();
  322. /*@Desc: run an explicit cycle */
  323. interfaceTestStatemachine_runCycle();
  324. printf ("%f", interfaceTest_if_third_get_v1());
  325. /*@Desc: check if v1 of third interface is still 52.83 */
  326. assert( interfaceTest_if_third_get_v1() > 52.82 &&
  327. interfaceTest_if_third_get_v1() < 52.84 );
  328. /*@Desc: check if v1 of other interface is still 8877 */
  329. assert( interfaceTest_if_other_get_v1() == 8877 );
  330. /*@Desc: teardown statemachine */
  331. teardownStatemachine(&dummyTimer, &eventPool);
  332. return 0;
  333. }
  334. int main(int argc, char** argv)
  335. {
  336. if (argc != 2)
  337. return -1;
  338. switch (atoi(argv[1])) {
  339. case 1:
  340. return test_default_interface_good();
  341. case 2:
  342. return test_default_interface_bad();
  343. case 3:
  344. return test_other_interface_good();
  345. case 4:
  346. return test_other_interface_bad();
  347. case 5:
  348. return test_third_interface_good();
  349. case 6:
  350. return test_third_interface_bad();
  351. case 7:
  352. return test_namespaces();
  353. }
  354. return 0;
  355. }