@@ -322,6 +322,134 @@ void time_left_test()
322
322
TEST_ASSERT_EQUAL (-1 , queue.time_left (0 ));
323
323
}
324
324
325
+ void f5 (int a1, int a2, int a3, int a4, int a5)
326
+ {
327
+ touched = true ;
328
+ }
329
+
330
+ class UserAllocatedTest {
331
+ public:
332
+ UserAllocatedTest () : counter() {}
333
+ void f0 ()
334
+ {
335
+ counter++;
336
+ }
337
+ void f1 (int a)
338
+ {
339
+ counter += a;
340
+ }
341
+ void f5 (int a, int b, int c, int d, int e)
342
+ {
343
+ counter += a + b + c + d + e;
344
+ }
345
+ uint32_t counter;
346
+ };
347
+
348
+ void my_f0 ()
349
+ {
350
+ touched = true ;
351
+ }
352
+ void my_f5 (int , int , int , int , int )
353
+ {
354
+ touched = true ;
355
+ }
356
+
357
+ /* * Test that queue executes user allocated events.
358
+ *
359
+ * Given queue is initialized and its size is set to store one Event at max in its internal memory.
360
+ * When post queue allocated event.
361
+ * Then only one event can be posted due to queue memory size.
362
+ * When post user allocated evens.
363
+ * Then number of posted events is not limited by queue memory size.
364
+ * When both Event and UserAllocatedEvent are posted and queue dispatch is called.
365
+ * Then both types of events are executed properly.
366
+ *
367
+ * Given queue is initialized and its size is set 1B - only user allocated events allowed.
368
+ * When post user allocated evens.
369
+ * Then UserAllocatedEvent are posted and dispatched without any error.
370
+ */
371
+ void user_allocated_events_test ()
372
+ {
373
+ {
374
+ EventQueue queue (4 * EVENTS_EVENT_SIZE);
375
+
376
+ Event<void ()> e0 = queue.event (func0);
377
+ TEST_ASSERT_NOT_EQUAL (0 , e0 .post ());
378
+ Event<void ()> e1 = queue.event (func0);
379
+ TEST_ASSERT_EQUAL (0 , e1 .post ());
380
+
381
+ auto ue0 = make_user_allocated_event (func0);
382
+ UserAllocatedTest test1;
383
+ auto ue1 = make_user_allocated_event (&test1, &UserAllocatedTest::f0);
384
+ UserAllocatedTest test2;
385
+ auto ue2 = make_user_allocated_event (&test2, &UserAllocatedTest::f1, 3 );
386
+ UserAllocatedTest test3;
387
+ auto ue3 = make_user_allocated_event (&test3, &UserAllocatedTest::f5, 1 , 2 , 3 , 4 , 5 );
388
+ UserAllocatedTest test4;
389
+ auto ue4 = make_user_allocated_event (&test4, &UserAllocatedTest::f5, 1 , 2 , 3 , 4 , 5 );
390
+
391
+ touched = false ;
392
+
393
+ ue0.call_on (&queue);
394
+ TEST_ASSERT_EQUAL (false , ue0.try_call ());
395
+ ue1.call_on (&queue);
396
+ TEST_ASSERT_EQUAL (false , ue1.try_call ());
397
+ ue2.call_on (&queue);
398
+ TEST_ASSERT_EQUAL (false , ue2.try_call ());
399
+ ue3.call_on (&queue);
400
+ TEST_ASSERT_EQUAL (false , ue3.try_call ());
401
+ ue4.call_on (&queue);
402
+ ue4.cancel ();
403
+ TEST_ASSERT_EQUAL (true , ue4.try_call ());
404
+ ue4.cancel ();
405
+
406
+ queue.dispatch (1 );
407
+
408
+ TEST_ASSERT_EQUAL (true , touched);
409
+ TEST_ASSERT_EQUAL (1 , test1.counter );
410
+ TEST_ASSERT_EQUAL (3 , test2.counter );
411
+ TEST_ASSERT_EQUAL (15 , test3.counter );
412
+ TEST_ASSERT_EQUAL (0 , test4.counter );
413
+ }
414
+
415
+ {
416
+ EventQueue queue (1 );
417
+
418
+ Event<void ()> e0 = queue.event (func0);
419
+ TEST_ASSERT_EQUAL (0 , e0 .post ());
420
+
421
+ auto ue0 = make_user_allocated_event (func0);
422
+ UserAllocatedTest test1;
423
+ auto ue1 = make_user_allocated_event (&test1, &UserAllocatedTest::f0);
424
+ UserAllocatedTest test2;
425
+ auto ue2 = make_user_allocated_event (&test2, &UserAllocatedTest::f1, 3 );
426
+ UserAllocatedTest test3;
427
+ auto ue3 = make_user_allocated_event (&test3, &UserAllocatedTest::f5, 1 , 2 , 3 , 4 , 5 );
428
+ UserAllocatedTest test4;
429
+ auto ue4 = make_user_allocated_event (&test4, &UserAllocatedTest::f5, 1 , 2 , 3 , 4 , 5 );
430
+
431
+ ue0.call_on (&queue);
432
+ TEST_ASSERT_EQUAL (false , ue0.try_call ());
433
+ ue1.call_on (&queue);
434
+ TEST_ASSERT_EQUAL (false , ue1.try_call ());
435
+ ue2.call_on (&queue);
436
+ TEST_ASSERT_EQUAL (false , ue2.try_call ());
437
+ ue3.call_on (&queue);
438
+ TEST_ASSERT_EQUAL (false , ue3.try_call ());
439
+ ue4.call_on (&queue);
440
+ ue4.cancel ();
441
+ TEST_ASSERT_EQUAL (true , ue4.try_call ());
442
+ ue4.cancel ();
443
+
444
+ queue.dispatch (1 );
445
+
446
+ TEST_ASSERT_EQUAL (1 , test1.counter );
447
+ TEST_ASSERT_EQUAL (3 , test2.counter );
448
+ TEST_ASSERT_EQUAL (15 , test3.counter );
449
+ TEST_ASSERT_EQUAL (0 , test4.counter );
450
+ }
451
+ }
452
+
325
453
// Test setup
326
454
utest::v1::status_t test_setup (const size_t number_of_cases)
327
455
{
@@ -348,6 +476,7 @@ const Case cases[] = {
348
476
Case (" Testing the event inference" , event_inference_test),
349
477
350
478
Case (" Testing time_left" , time_left_test),
479
+ Case (" Testing user allocated event class" , user_allocated_events_test)
351
480
};
352
481
353
482
Specification specification (test_setup, cases);
0 commit comments