11/* mbed Microcontroller Library
2- * Copyright (c) 2017 ARM Limited
2+ * Copyright (c) 2017-2019 ARM Limited
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
@@ -322,6 +322,145 @@ void time_left_test()
322322 TEST_ASSERT_EQUAL (-1 , queue.time_left (0 ));
323323}
324324
325+ void f5 (int a1, int a2, int a3, int a4, int a5)
326+ {
327+ touched = true ;
328+ }
329+
330+ class EventTest {
331+ public:
332+ EventTest () : 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+ /* * Test that queue executes both dynamic and user allocated events.
349+ *
350+ * Given queue is initialized and its size is set to store three Event at max in its internal memory.
351+ * When post queue allocated event.
352+ * Then only three event can be posted due to queue memory size.
353+ * When post user allocated evens.
354+ * Then number of posted events is not limited by queue memory size.
355+ * When both Event and UserAllocatedEvent are posted and queue dispatch is called.
356+ * Then both types of events are executed properly.
357+ *
358+ */
359+ void mixed_dynamic_static_events_queue_test ()
360+ {
361+ {
362+ EventQueue queue (9 * EVENTS_EVENT_SIZE);
363+
364+ EventTest e1_test;
365+ Event<void ()> e1 = queue.event (&e1_test, &EventTest::f0);
366+ int id1 = e1 .post ();
367+ TEST_ASSERT_NOT_EQUAL (0 , id1);
368+ EventTest e2_test;
369+ Event<void ()> e2 = queue.event (&e2_test, &EventTest::f1, 3 );
370+ int id2 = e2 .post ();
371+ TEST_ASSERT_NOT_EQUAL (0 , id2);
372+ EventTest e3_test;
373+ Event<void ()> e3 = queue.event (&e3_test, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
374+ int id3 = e3 .post ();
375+ TEST_ASSERT_NOT_EQUAL (0 , id3);
376+
377+
378+ auto ue0 = make_user_allocated_event (func0);
379+ EventTest ue1_test;
380+ auto ue1 = make_user_allocated_event (&ue1_test, &EventTest::f0);
381+ EventTest ue2_test;
382+ auto ue2 = make_user_allocated_event (&ue2_test, &EventTest::f1, 3 );
383+ EventTest ue3_test;
384+ auto ue3 = make_user_allocated_event (&ue3_test, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
385+ EventTest ue4_test;
386+ auto ue4 = make_user_allocated_event (&ue4_test, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
387+
388+ touched = false ;
389+
390+ ue0.call_on (&queue);
391+ TEST_ASSERT_EQUAL (false , ue0.try_call ());
392+ ue1.call_on (&queue);
393+ TEST_ASSERT_EQUAL (false , ue1.try_call ());
394+ ue2.call_on (&queue);
395+ TEST_ASSERT_EQUAL (false , ue2.try_call ());
396+ ue3.call_on (&queue);
397+ TEST_ASSERT_EQUAL (false , ue3.try_call ());
398+ ue4.call_on (&queue);
399+ ue4.cancel ();
400+ TEST_ASSERT_EQUAL (true , ue4.try_call ());
401+ ue4.cancel ();
402+ e2 .cancel ();
403+
404+ queue.dispatch (1 );
405+
406+ TEST_ASSERT_EQUAL (true , touched);
407+ TEST_ASSERT_EQUAL (1 , ue1_test.counter );
408+ TEST_ASSERT_EQUAL (3 , ue2_test.counter );
409+ TEST_ASSERT_EQUAL (15 , ue3_test.counter );
410+ TEST_ASSERT_EQUAL (0 , ue4_test.counter );
411+ TEST_ASSERT_EQUAL (1 , e1_test.counter );
412+ TEST_ASSERT_EQUAL (0 , e2_test.counter );
413+ TEST_ASSERT_EQUAL (15 , e3_test.counter );
414+ }
415+ }
416+
417+
418+ static EventQueue g_queue (0 );
419+
420+ /* * Test that static queue executes user allocated events.
421+ *
422+ * Given static queue is initialized
423+ * When post user allocated evens.
424+ * Then UserAllocatedEvent are posted and dispatched without any error.
425+ */
426+ void static_events_queue_test ()
427+ {
428+ // check that no dynamic event can be posted
429+ Event<void ()> e0 = g_queue.event (func0);
430+ TEST_ASSERT_EQUAL (0 , e0 .post ());
431+
432+ auto ue0 = g_queue.make_user_allocated_event (func0);
433+ EventTest test1;
434+ auto ue1 = make_user_allocated_event (&test1, &EventTest::f0);
435+ EventTest test2;
436+ auto ue2 = g_queue.make_user_allocated_event (&test2, &EventTest::f1, 3 );
437+ EventTest test3;
438+ auto ue3 = make_user_allocated_event (&test3, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
439+ EventTest test4;
440+ auto ue4 = g_queue.make_user_allocated_event (&test4, &EventTest::f5, 1 , 2 , 3 , 4 , 5 );
441+
442+ ue0.call ();
443+ TEST_ASSERT_EQUAL (false , ue0.try_call ());
444+ ue1.call_on (&g_queue);
445+ TEST_ASSERT_EQUAL (false , ue1.try_call ());
446+ ue2 ();
447+ TEST_ASSERT_EQUAL (false , ue2.try_call ());
448+ ue3.call_on (&g_queue);
449+ TEST_ASSERT_EQUAL (false , ue3.try_call ());
450+ ue4.call ();
451+ ue4.cancel ();
452+ TEST_ASSERT_EQUAL (true , ue4.try_call ());
453+ g_queue.cancel (&ue4);
454+
455+ g_queue.dispatch (1 );
456+
457+ TEST_ASSERT_EQUAL (1 , test1.counter );
458+ TEST_ASSERT_EQUAL (3 , test2.counter );
459+ TEST_ASSERT_EQUAL (15 , test3.counter );
460+ TEST_ASSERT_EQUAL (0 , test4.counter );
461+
462+ }
463+
325464// Test setup
326465utest::v1::status_t test_setup (const size_t number_of_cases)
327466{
@@ -348,6 +487,9 @@ const Case cases[] = {
348487 Case (" Testing the event inference" , event_inference_test),
349488
350489 Case (" Testing time_left" , time_left_test),
490+ Case (" Testing mixed dynamic & static events queue" , mixed_dynamic_static_events_queue_test),
491+ Case (" Testing static events queue" , static_events_queue_test)
492+
351493};
352494
353495Specification specification (test_setup, cases);
0 commit comments