RKH
Loading...
Searching...
No Matches
test_rkhsma.c
Go to the documentation of this file.
1/*
2 * --------------------------------------------------------------------------
3 *
4 * Framework RKH
5 * -------------
6 *
7 * State-machine framework for reactive embedded systems
8 *
9 * Copyright (C) 2010 Leandro Francucci.
10 * All rights reserved. Protected by international copyright laws.
11 *
12 *
13 * RKH is free software: you can redistribute it and/or modify it under the
14 * terms of the GNU General Public License as published by the Free Software
15 * Foundation, either version 3 of the License, or (at your option) any
16 * later version.
17 *
18 * RKH is distributed in the hope that it will be useful, but WITHOUT ANY
19 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
21 * more details.
22 *
23 * You should have received a copy of the GNU General Public License along
24 * with RKH, see copying.txt file.
25 *
26 * Contact information:
27 * RKH site: http://vortexmakes.com/que-es/
28 * RKH GitHub: https://github.com/vortexmakes/RKH
29 * RKH Sourceforge: https://sourceforge.net/projects/rkh-reactivesys/
30 * e-mail: lf@vortexmakes.com
31 * ---------------------------------------------------------------------------
32 */
33
46/* -------------------------- Development history -------------------------- */
47/*
48 * 2017.04.05 LeFr v2.4.05 ---
49 */
50
51/* -------------------------------- Authors -------------------------------- */
52/*
53 * LeFr Leandro Francucci lf@vortexmakes.com
54 */
55
56/* --------------------------------- Notes --------------------------------- */
57/* ----------------------------- Include files ----------------------------- */
58#include "unity.h"
59#include "rkhsma.h"
60#include "smInstance.h" /* support files */
61#include "smPolymorphism.h"
62#include "Mock_rkhport.h"
63#include "Mock_rkhtrc.h"
64#include "Mock_rkhtrc_record.h"
65#include "Mock_rkhtrc_filter.h"
66#include "Mock_rkhsm.h"
67#include "Mock_rkhqueue.h"
68#include "Mock_rkhassert.h"
69#include "Mock_rkhtmr.h"
70#include "Mock_bsp.h"
71#include <string.h>
72
73/* ----------------------------- Local macros ------------------------------ */
74/* ------------------------------- Constants ------------------------------- */
75/* ---------------------------- Local data types --------------------------- */
76/* ---------------------------- Global variables --------------------------- */
77/* ---------------------------- Local variables ---------------------------- */
78static RKHROM RKH_ROM_T base = {0, 0, "receiver"};
79static RKH_SMA_T receiver;
80const RKH_TRC_FIL_T fsma = {0, NULL}; /* Fake global variable of trace */
81 /* module (using for mocking) */
82const RKH_TRC_FIL_T fsig = {0, NULL};
83static RKH_EVT_T event = {0, 0, 0};
84
85/* ----------------------- Local function prototypes ----------------------- */
86/* ---------------------------- Local functions ---------------------------- */
87#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
88static void
89checkVtbl(RKH_SMA_T *me, RKHActivate activate, RKHTask task,
90 RKHPostFifo postFifo, RKHPostLifo postLifo)
91{
92 TEST_ASSERT_EQUAL_PTR(activate, me->vptr->activate);
93 TEST_ASSERT_EQUAL_PTR(task, me->vptr->task);
94 TEST_ASSERT_EQUAL_PTR(postFifo, me->vptr->post_fifo);
95 TEST_ASSERT_EQUAL_PTR(postLifo, me->vptr->post_lifo);
96}
97
98static void
99testActivate(RKH_SMA_T *me, const RKH_EVT_T **qSto, RKH_QUENE_T qSize,
100 void *stkSto, rui32_t stkSize)
101{
102 (void)me;
103 (void)qSto;
104 (void)qSize;
105 (void)stkSto;
106 (void)stkSize;
107}
108
109static void
110testTask(RKH_SMA_T *me, void *arg)
111{
112 (void)me;
113 (void)arg;
114}
115
116static void
117testPostFifo(RKH_SMA_T *me, const RKH_EVT_T *e, const void *const sender)
118{
119 (void)me;
120 (void)e;
121 (void)sender;
122}
123
124static void
125testPostLifo(RKH_SMA_T *me, const RKH_EVT_T *e, const void *const sender)
126{
127 (void)me;
128 (void)e;
129 (void)sender;
130}
131#endif
132
133static void
134setUp_polymorphism(void)
135{
136#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
137 /* Restore the default virtual table of RKH_SMA_T class */
138 singleton->vptr = &rkhSmaVtbl;
139#endif
140 memset(rkh_sptbl, 0, sizeof(rkh_sptbl));
141}
142
143/* ---------------------------- Global functions --------------------------- */
144void
145setUp(void)
146{
147 receiver.sm.romrkh = &base;
148 Mock_rkhtrc_filter_Init();
149}
150
151void
152tearDown(void)
153{
154 Mock_rkhtrc_filter_Verify();
155 Mock_rkhtrc_filter_Destroy();
156}
157
164void
165test_Register(void)
166{
167 rkh_enter_critical_Expect();
168 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_REG, RKH_FALSE);
169 rkh_exit_critical_Expect();
170
171 rkh_sma_register(&receiver);
172 TEST_ASSERT_EQUAL(&receiver, rkh_sptbl[receiver.sm.romrkh->prio]);
173}
174
175void
176test_UnRegister(void)
177{
178 rkh_enter_critical_Expect();
179 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_UNREG, RKH_FALSE);
180 rkh_exit_critical_Expect();
181
182 rkh_sma_unregister(&receiver);
183 TEST_ASSERT_EQUAL((RKH_SMA_T *)0, rkh_sptbl[receiver.sm.romrkh->prio]);
184}
185
186void
187test_Constructor(void)
188{
189 rkh_sm_ctor_Expect(&(receiver.sm));
190
191 rkh_sma_ctor(&receiver, (const RKHSmaVtbl *)0);
192}
193
194void
195test_TerminateOneRegisteredAO(void)
196{
197 rkh_enter_critical_Expect();
198 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_REG, RKH_FALSE);
199 rkh_exit_critical_Expect();
200
201 rkh_sma_register(&receiver);
202
203 rkh_enter_critical_Expect();
204 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_UNREG, RKH_FALSE);
205 rkh_exit_critical_Expect();
206 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_TERM, RKH_FALSE);
207
208 rkh_sma_terminate(&receiver);
209
210 TEST_ASSERT_EQUAL((RKH_SMA_T *)0, rkh_sptbl[receiver.sm.romrkh->prio]);
211}
212
213void
214test_ActivateOneAO(void)
215{
216 char *buff;
217
218 rkh_queue_init_Expect(&receiver.equeue, (const void **)&buff, 16,
219 &receiver);
220
221 rkh_enter_critical_Expect();
222 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_REG, RKH_FALSE);
223 rkh_exit_critical_Expect();
224
225 rkh_sm_init_Expect((RKH_SM_T *)&receiver);
226
227 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_ACT, RKH_FALSE);
228
229 rkh_sma_activate(&receiver, (const RKH_EVT_T **)&buff, 16, NULL, 0);
230}
231
232void
233test_PostFifo(void)
234{
235 rkh_enter_critical_Expect();
236 rkh_queue_put_fifo_Expect(&receiver.equeue, &event);
237 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_FIFO, RKH_FALSE);
238 rkh_exit_critical_Expect();
239
240 rkh_sma_post_fifo(&receiver, &event, &receiver);
241}
242
243void
244test_PostLifo(void)
245{
246 rkh_enter_critical_Expect();
247 rkh_queue_put_lifo_Expect(&receiver.equeue, &event);
248 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_LIFO, RKH_FALSE);
249 rkh_exit_critical_Expect();
250
251 rkh_sma_post_lifo(&receiver, &event, &receiver);
252}
253
254void
255test_Get(void)
256{
257 RKH_EVT_T *e;
258
259 rkh_queue_get_ExpectAndReturn(&receiver.equeue, &event);
260 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_GET, RKH_FALSE);
261
262 e = rkh_sma_get(&receiver);
263 TEST_ASSERT_EQUAL(&event, e);
264}
265
266void
267test_Defer(void)
268{
269 rkh_enter_critical_Expect();
270 rkh_queue_put_fifo_Expect(&receiver.equeue, &event);
271 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_DEFER, RKH_FALSE);
272 rkh_exit_critical_Expect();
273
274 rkh_sma_defer(&receiver.equeue, &event);
275}
276
277void
278test_Recall(void)
279{
280 RKH_EVT_T *e;
281
282 rkh_queue_get_ExpectAndReturn(&receiver.equeue, NULL);
283
284 e = rkh_sma_recall(&receiver, &receiver.equeue);
285 TEST_ASSERT_EQUAL(NULL, e);
286}
287
297void
298test_ctorOfStaticPrivateAO(void)
299{
300 Single_ctor(4);
301
302 TEST_ASSERT_EQUAL_STRING("single", RKH_SMA_ACCESS_CONST(single, name));
303 TEST_ASSERT_EQUAL(4, Single_getFoo());
304}
305
306void
307test_staticPublicAOWithoutRuntimeCtor(void)
308{
309 publicSingle->foo = 8;
310 TEST_ASSERT_EQUAL_STRING("publicSingle",
311 RKH_SMA_ACCESS_CONST(publicSingle, name));
312}
313
314void
315test_ctorOfStaticPublicAO(void)
316{
317 PublicSingle_ctor(8);
318
319 TEST_ASSERT_EQUAL_STRING("publicSingle",
320 RKH_SMA_ACCESS_CONST(publicSingle, name));
321 TEST_ASSERT_EQUAL(8, publicSingle->foo);
322}
323
324void
325test_ctorOfStaticOpaqueAO(void)
326{
327 Opaque_ctor(opaque, 4);
328
329 TEST_ASSERT_EQUAL(4, Opaque_getFoo(opaque));
330}
331
332void
333test_ctorOfStaticMultipleAO(void)
334{
335 MultiplePublicSingle_ctor(single0, 8);
336
337 TEST_ASSERT_EQUAL_STRING("single0",
338 RKH_SMA_ACCESS_CONST(single0, name));
339 TEST_ASSERT_EQUAL(8, single0->foo);
340}
341
342void
343test_ctorOfStaticArrayOfAO(void)
344{
345 PublicSingle *pSingle = RKH_ARRAY_SMA(arrayOfSingles, 2);
346 MultiplePublicSingle_ctor(pSingle, 8);
347
348 TEST_ASSERT_EQUAL_STRING("single2",
349 RKH_SMA_ACCESS_CONST(pSingle, name));
350 TEST_ASSERT_EQUAL(8, pSingle->foo);
351}
352
353void
354test_staticPrivateSMWithoutRuntimeCtor(void)
355{
356 TEST_ASSERT_EQUAL_STRING("stateMachine",
357 RKH_SMA_ACCESS_CONST(stateMachine, name));
358 TEST_ASSERT_EQUAL_PTR(NULL, stateMachine->state);
359}
360
361void
362test_staticPublicSMWithoutRuntimeCtor(void)
363{
364 TEST_ASSERT_EQUAL_STRING("publicStateMachine",
365 RKH_SMA_ACCESS_CONST(publicStateMachine, name));
366 TEST_ASSERT_EQUAL(8, publicSingle->foo);
367}
368
369void
370test_ctorOfStaticCompositePrivateSingletonAO(void)
371{
372 Composite_ctor(16);
373
374 TEST_ASSERT_EQUAL_STRING("composite",
375 RKH_SMA_ACCESS_CONST(composite, name));
376 TEST_ASSERT_EQUAL_STRING("region",
377 RKH_SMA_ACCESS_CONST(Composite_getItsReactivePart(), name));
378 TEST_ASSERT_EQUAL(16, Composite_getFoo());
379}
380
381void
382test_ctorOfStaticCompositePublicAO(void)
383{
384 PublicComposite_ctor(publicComposite, 16);
385
386 TEST_ASSERT_EQUAL_STRING("publicComposite",
387 RKH_SMA_ACCESS_CONST(publicComposite, name));
388 TEST_ASSERT_EQUAL_STRING("publicRegion",
389 RKH_SMA_ACCESS_CONST(&publicComposite->itsReactivePart, name));
390 TEST_ASSERT_EQUAL(16, publicComposite->foo);
391}
392
393void
394test_ctorOfStaticCompositeAOWithDerivedPublicSM(void)
395{
396 PublicCompositeA_ctor(publicCompositeA, 16, 8);
397
398 TEST_ASSERT_EQUAL_STRING("publicCompositeA",
399 RKH_SMA_ACCESS_CONST(publicCompositeA, name));
400 TEST_ASSERT_EQUAL_STRING("publicRegionA",
401 RKH_SMA_ACCESS_CONST(&publicCompositeA->itsReactivePart, name));
402 TEST_ASSERT_EQUAL(16, publicCompositeA->foo);
403 TEST_ASSERT_EQUAL(8, publicCompositeA->itsReactivePart.foo);
404}
405
406void
407test_ctorOfDynamicCompositeAO(void)
408{
409 PublicSingle *actObj;
410
411 actObj = PublicSingle_dynCtor(8);
412 TEST_ASSERT_NOT_NULL(actObj);
413 TEST_ASSERT_EQUAL(8, actObj->foo);
414
415 TEST_ASSERT_EQUAL_STRING("publicSingleDyn",
416 RKH_SMA_ACCESS_CONST(actObj, name));
417
418 PublicSingle_dynDtor(actObj);
419}
420
421void
422test_ctorOfANonReactiveAO(void)
423{
424 RKH_SMA_T* realSignalMgr = RKH_UPCAST(RKH_SMA_T, signalMgr);
425
426 setUp_polymorphism();
427 rkh_sm_ctor_Expect(RKH_UPCAST(RKH_SM_T, signalMgr));
428
429 PerNonReactWoutST_ctor(signalMgr, 4);
430
431 TEST_ASSERT_EQUAL(4, PerNonReactWoutST_getBaz(signalMgr));
432 TEST_ASSERT_NULL(realSignalMgr->sm.state);
433}
434
435void
436test_invokeActivateOfANonReactiveAO(void)
437{
438 RKH_SMA_T* realSignalMgr = RKH_UPCAST(RKH_SMA_T, signalMgr);
439 const RKH_EVT_T *qs[1];
440
441 setUp_polymorphism();
442 rkh_sm_ctor_Expect(RKH_UPCAST(RKH_SM_T, signalMgr));
443 rkh_queue_init_Ignore();
444 rkh_enter_critical_Expect();
445 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_REG, RKH_FALSE);
446 rkh_exit_critical_Expect();
447 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_ACT, RKH_FALSE);
448
449 PerNonReactWoutST_ctor(signalMgr, 4);
450 RKH_SMA_ACTIVATE(RKH_UPCAST(RKH_SMA_T, signalMgr), qs, 1, NULL, 0);
451}
452
453void
454test_invokeDispatchOfANonReactiveAO(void)
455{
456 RKH_SMA_T* realSignalMgr = RKH_UPCAST(RKH_SMA_T, signalMgr);
457 const RKH_EVT_T *qs[1];
458 RKH_STATIC_EVENT(evt, sigSync);
459
460 setUp_polymorphism();
461 rkh_sm_ctor_Expect(RKH_UPCAST(RKH_SM_T, signalMgr));
462 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SM_DCH, RKH_FALSE);
463 Sensor_get_ExpectAndReturn(48);
464 Sensor_process_ExpectAndReturn(48, 4);
465 Actuator_set_Expect(4);
466
467 PerNonReactWoutST_ctor(signalMgr, 4);
468 RKH_SMA_DISPATCH(RKH_UPCAST(RKH_SMA_T, signalMgr), &evt);
469}
470
471void
472test_ctorOfANonReactiveAOWithSTButWoutUsingEventQueue(void)
473{
474 RKH_SMA_T* realSignalMgr = RKH_UPCAST(RKH_SMA_T, collector);
475
476 setUp_polymorphism();
477 rkh_sm_ctor_Expect(RKH_UPCAST(RKH_SM_T, collector));
478 rkh_tmr_init__Expect(NULL, NULL);
479 rkh_tmr_init__IgnoreArg_t();
480 rkh_tmr_init__IgnoreArg_e();
481
482 PerNonReactWithSTWoutQue_ctor(collector, 4);
483
484 TEST_ASSERT_EQUAL(4, PerNonReactWithSTWoutQue_getBaz(collector));
485}
486
487void
488test_invokeActivateOfANonReactiveAOWithSTButWoutUsingEventQueue(void)
489{
490 RKH_SMA_T* realSignalMgr = RKH_UPCAST(RKH_SMA_T, collector);
491 const RKH_EVT_T *qs[1];
492
493 setUp_polymorphism();
494 rkh_sm_ctor_Expect(RKH_UPCAST(RKH_SM_T, collector));
495 rkh_tmr_init__Expect(NULL, NULL);
496 rkh_tmr_init__IgnoreArg_t();
497 rkh_tmr_init__IgnoreArg_e();
498 rkh_queue_init_Ignore();
499 rkh_enter_critical_Expect();
500 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_REG, RKH_FALSE);
501 rkh_exit_critical_Expect();
502 rkh_sm_init_Expect(RKH_UPCAST(RKH_SM_T, collector));
503 rkh_tmr_start_Expect(NULL, realSignalMgr, 4, 4);
504 rkh_tmr_start_IgnoreArg_t();
505 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_ACT, RKH_FALSE);
506
507 PerNonReactWithSTWoutQue_ctor(collector, 4);
508 RKH_SMA_ACTIVATE(RKH_UPCAST(RKH_SMA_T, collector), qs, 1, NULL, 0);
509}
510
511void
512test_invokeDispatchOfANonReactiveAOWithSTButWoutUsingEventQueue(void)
513{
514 RKH_SMA_T* realSignalMgr = RKH_UPCAST(RKH_SMA_T, collector);
515 const RKH_EVT_T *qs[1];
516 RKH_STATIC_EVENT(evtSync, sigSync);
517
518 setUp_polymorphism();
519 rkh_sm_ctor_Expect(RKH_UPCAST(RKH_SM_T, collector));
520 rkh_tmr_init__Expect(NULL, NULL);
521 rkh_tmr_init__IgnoreArg_t();
522 rkh_tmr_init__IgnoreArg_e();
523 rkh_queue_init_Ignore();
524 rkh_enter_critical_Expect();
525 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_REG, RKH_FALSE);
526 rkh_exit_critical_Expect();
527 rkh_sm_init_Expect(RKH_UPCAST(RKH_SM_T, collector));
528 rkh_tmr_start_Expect(NULL, realSignalMgr, 4, 4);
529 rkh_tmr_start_IgnoreArg_t();
530 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_ACT, RKH_FALSE);
531 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SM_DCH, RKH_FALSE);
532 Sensor_get_ExpectAndReturn(1.3);
533 Sensor_process_ExpectAndReturn(1.3, 1.2);
534 rkh_sm_dispatch_ExpectAndReturn(RKH_UPCAST(RKH_SM_T, collector),
535 NULL,
537 rkh_sm_dispatch_IgnoreArg_e();
538
539 PerNonReactWithSTWoutQue_ctor(collector, 4);
540 RKH_SMA_ACTIVATE(RKH_UPCAST(RKH_SMA_T, collector), qs, 1, NULL, 0);
541 RKH_SMA_DISPATCH(RKH_UPCAST(RKH_SMA_T, collector), &evtSync);
542}
543
553void
554test_defaultVirtualFunctions(void)
555{
556 setUp_polymorphism();
557#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
558 checkVtbl(singleton,
561
562 TEST_ASSERT_EQUAL_PTR(&rkhSmaVtbl, singleton->vptr);
563#endif
564}
565
566void
567test_callVirtualFunction(void)
568{
569 setUp_polymorphism();
570#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
571 const RKH_EVT_T *qs[1];
572
573 rkh_queue_init_Ignore(); /* for RKH_SMA_ACTIVATE() */
574 rkh_enter_critical_Expect();
575 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_REG, RKH_FALSE);
576 rkh_exit_critical_Expect();
577 rkh_sm_init_Ignore();
578 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_ACT, RKH_FALSE);
579
580 rkh_enter_critical_Expect();
581 rkh_queue_put_fifo_Ignore();
582 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_FIFO, RKH_FALSE);
583 rkh_exit_critical_Expect();
584
585 rkh_enter_critical_Expect();
586 rkh_queue_put_lifo_Ignore();
587 rkh_trc_isoff__ExpectAndReturn(RKH_TE_SMA_LIFO, RKH_FALSE);
588 rkh_exit_critical_Expect();
589
590 RKH_SMA_ACTIVATE(singleton, qs, 1, 0, 0);
591 RKH_SMA_POST_FIFO(singleton, &event, NULL);
592 RKH_SMA_POST_LIFO(singleton, &event, NULL);
593#endif
594}
595
596void
597test_setVirtualTable(void)
598{
599 setUp_polymorphism();
600#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
601 const RKHSmaVtbl *vptr;
602 static const RKHSmaVtbl vtbl =
603 {
604 testActivate, testTask, testPostFifo, testPostLifo
605 };
606
607 vptr = singleton->vptr = &vtbl;
608
609 checkVtbl(singleton,
610 testActivate, testTask, testPostFifo, testPostLifo);
611#endif
612}
613
614void
615test_runtimeSingletonAOCtor(void)
616{
617 setUp_polymorphism();
618#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
619 rkh_sm_ctor_Expect(&singleton->sm);
620
621 Singleton_ctor(8);
622 TEST_ASSERT_EQUAL(8, Singleton_getFoo());
623
624 RKH_SMA_ACTIVATE(singleton, NULL, 0, NULL, 0);
625 TEST_ASSERT_EQUAL(0, Singleton_getFoo());
626#endif
627}
628
629void
630test_runtimeMultipleAOCtorWithVtblForObj(void)
631{
632 setUp_polymorphism();
633#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
634 rkh_sm_ctor_Ignore();
635 rkh_sm_ctor_Ignore();
636
637 Multiple_ctor(multA, 2, Multiple_postFifoA);
638 Multiple_ctor(multB, 4, Multiple_postFifoB);
639
640 checkVtbl((RKH_SMA_T *)multA,
641 rkh_sma_activate, rkh_sma_dispatch, Multiple_postFifoA,
643
644 TEST_ASSERT_EQUAL(2, Multiple_getFoobar(multA));
645 TEST_ASSERT_EQUAL(4, Multiple_getFoobar(multB));
646
647 RKH_SMA_POST_FIFO((RKH_SMA_T *)multA, NULL, NULL);
648 RKH_SMA_POST_FIFO((RKH_SMA_T *)multB, NULL, NULL);
649
650 TEST_ASSERT_EQUAL(0, Multiple_getFoobar(multA));
651 TEST_ASSERT_EQUAL(8, Multiple_getFoobar(multB));
652#endif
653}
654
655void
656test_runtimeMultipleAOCtorWithVtblForType(void)
657{
658 setUp_polymorphism();
659#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
660 rkh_sm_ctor_Expect((RKH_SM_T *)cmdSignal);
661 rkh_sm_ctor_Expect((RKH_SM_T *)cmdRegister);
662
663 Command_ctor(cmdSignal, 128);
664 Command_ctor(cmdRegister, 64);
665
666 checkVtbl((RKH_SMA_T *)cmdSignal,
667 rkh_sma_activate, Command_task,
668 Command_postFifo, Command_postLifo);
669
670 checkVtbl((RKH_SMA_T *)cmdRegister,
671 rkh_sma_activate, Command_task,
672 Command_postFifo, Command_postLifo);
673#endif
674}
675
676void
677test_runtimeSubObjectCtorOfSMAAndSM(void)
678{
679 setUp_polymorphism();
680#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
681 rkh_sm_ctor_Expect((RKH_SM_T *)theCallControl);
682 CallControl_ctorA(16);
683
684 TEST_ASSERT_EQUAL(16, CallControl_getFoo());
685 checkVtbl((RKH_SMA_T *)theCallControl,
686 CallControl_activate, CallControl_task,
688#endif
689}
690
691void
692test_runtimeSubObjectCtorOfSMAAndSMWithDefaultVtbl(void)
693{
694 setUp_polymorphism();
695#if RKH_CFG_SMA_VFUNCT_EN == RKH_ENABLED
696 rkh_sm_ctor_Expect((RKH_SM_T *)theCallControl);
697 CallControl_ctorB(8);
698
699 TEST_ASSERT_EQUAL(8, CallControl_getFoo());
700 checkVtbl((RKH_SMA_T *)theCallControl,
703#endif
704}
705
710/* ------------------------------ End of file ------------------------------ */
void rkh_sma_dispatch(RKH_SMA_T *me, void *arg)
For cooperative scheduling policy, this function is used to dispatch the event to the active object b...
#define RKH_SMA_POST_LIFO(me_, e_, sender_)
Invoke the direct event posting facility rkh_sma_post_lifo(). If RKH_CFG_SMA_VFUNCT_EN is set RKH_ENA...
Definition rkhsma.h:498
#define RKH_SMA_POST_FIFO(me_, e_, sender_)
Invoke the direct event posting facility rkh_sma_post_fifo(). If RKH_CFG_SMA_VFUNCT_EN is set RKH_ENA...
Definition rkhsma.h:450
#define RKH_SMA_DISPATCH(me_, arg_)
For cooperative scheduling policy, this function is used to dispatch the event to the active object b...
Definition rkhsma.h:526
#define RKH_UPCAST(BaseType_, me_)
Convert a pointer to a base-class.
Definition rkhfwk_cast.h:74
#define RKH_SMA_ACTIVATE(me_, qSto_, qStoSize, stkSto_, stkSize_)
Invoke the active object activation function rkh_sma_activate(). If RKH_CFG_SMA_VFUNCT_EN is set RKH_...
Definition rkhsma.h:273
#define RKH_FALSE
Standard define.
Definition rkhdef.h:256
#define RKH_STATIC_EVENT(ev_obj, ev_sig)
This macro declares and initializes the event structure ev_ob with ev_sig signal number and establish...
void rkh_sma_post_lifo(RKH_SMA_T *me, const RKH_EVT_T *e, const void *const sender)
Send an event to a state machine application (SMA) as known as active object through a queue using th...
void rkh_sma_terminate(RKH_SMA_T *me)
Terminate a state machine application (SMA) as known as active object.
void rkh_sma_post_fifo(RKH_SMA_T *me, const RKH_EVT_T *e, const void *const sender)
Send an event to a state machine application (SMA) as known as active object through a queue using th...
void rkh_sma_activate(RKH_SMA_T *me, const RKH_EVT_T **qSto, RKH_QUENE_T qSize, void *stkSto, rui32_t stkSize)
Initializes and activates a previously created state machine application (SMA) as known as active obj...
RKH_EVT_T * rkh_sma_get(RKH_SMA_T *me)
Get an event from the event queue of an state machine application (SMA) as known as active object....
@ RKH_EVT_PROC
Definition rkhsm.h:1564
RKH_SMA_T * rkh_sptbl[RKH_CFG_FWK_MAX_SMA]
Priority arranged table of registered SMA.
rui8_t RKH_QUENE_T
This data type defines the maximum number of elements that any queue can contain.
Definition rkhqueue.h:123
Specifies the interface of the acive object (SMA state machine applications) manager.
void rkh_sma_register(RKH_SMA_T *me)
Registers a state machine application (SMA) as known as active object into the framework,...
void(* RKHTask)(RKH_SMA_T *me, void *arg)
Definition rkhsma.h:861
void rkh_sma_defer(RKH_QUEUE_T *q, const RKH_EVT_T *e)
Defer an event to a given separate event queue.
const RKHSmaVtbl rkhSmaVtbl
RKH_EVT_T * rkh_sma_recall(RKH_SMA_T *me, RKH_QUEUE_T *q)
Recall a deferred event from a given event queue.
#define RKH_ARRAY_SMA(_arr, _ix)
Retrieves the pointer to active object from a SMA's array.
Definition rkhsma.h:679
void(* RKHActivate)(RKH_SMA_T *me, const RKH_EVT_T **qSto, RKH_QUENE_T qSize, void *stkSto, rui32_t stkSize)
Definition rkhsma.h:856
void rkh_sma_unregister(RKH_SMA_T *me)
Removes the SMA as known as active object from the priority table, and thus from the framework,...
void(* RKHPostLifo)(RKH_SMA_T *me, const RKH_EVT_T *e, const void *const sender)
Definition rkhsma.h:873
void(* RKHPostFifo)(RKH_SMA_T *me, const RKH_EVT_T *e, const void *const sender)
Definition rkhsma.h:865
#define RKH_SMA_ACCESS_CONST(me_, member_)
Macro for accessing to members of state machine structure.
Definition rkhsma.h:108
void rkh_sma_ctor(RKH_SMA_T *me, const RKHSmaVtbl *vtbl)
Initializes the virtual table of the active object instance and calls the constructor operation of it...
#define RKH_TE_SMA_LIFO
#define RKH_TE_SM_DCH
#define RKH_TE_SMA_REG
#define RKH_TE_SMA_UNREG
#define RKH_TE_SMA_TERM
#define RKH_TE_SMA_DEFER
#define RKH_TE_SMA_ACT
#define RKH_TE_SMA_GET
#define RKH_TE_SMA_FIFO
Represents events without parameters.
Definition rkhevt.h:170
Describes the state machine.
Definition rkhsm.h:1927
rui8_t prio
SMA (a.k.a Active Object) priority.
Definition rkhsm.h:1935
RKHROM RKH_ST_T * state
Pointer to an event that will be passed to state machine application when it starts....
Definition rkhsm.h:1992
Describes the SMA (active object in UML).
Definition rkhsma.h:772
RKH_SM_T sm
State machine.
Definition rkhsma.h:777
RKH_EQ_TYPE equeue
Virtual pointer.
Definition rkhsma.h:835
Represents the filter of signal and active object.
Virtual table for the RKH_SMA_T structure.
Definition rkhsma.h:884