main.c 16 KB

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