#include "unittest/TestSuite.h" #include "utilities/FixedIntervalRunLoop.h" static void runCallback(void * context) { *(unsigned int *) context += 1; } static void verifyInit(FixedIntervalRunLoop * runLoop, double stepInterval, double tolerance, FixedIntervalRunLoopCallback stepCallback, void * stepContext) { TestCase_assertPointerEqual(runLoop->vtable, &FixedIntervalRunLoop_class); TestCase_assertDoubleEqual(runLoop->stepInterval, stepInterval); TestCase_assertDoubleEqual(runLoop->tolerance, tolerance); TestCase_assertPointerEqual(runLoop->stepCallback, stepCallback); TestCase_assertPointerEqual(runLoop->stepContext, stepContext); TestCase_assertDoubleEqual(runLoop->slop, 0.0); } static void testInit() { FixedIntervalRunLoop runLoop, * runLoopPtr; bool success; memset(&runLoop, 0x00, sizeof(runLoop)); stemobject_assign_vtable(runLoop, FixedIntervalRunLoop); success = FixedIntervalRunLoop_init(&runLoop, 1, 2, runCallback, NULL); TestCase_assertBoolTrue(success); verifyInit(&runLoop, 1, 2, runCallback, NULL); FixedIntervalRunLoop_dispose(&runLoop); memset(&runLoop, 0xFF, sizeof(runLoop)); stemobject_assign_vtable(runLoop, FixedIntervalRunLoop); success = FixedIntervalRunLoop_init(&runLoop, 1, 2, runCallback, NULL); TestCase_assertBoolTrue(success); verifyInit(&runLoop, 1, 2, runCallback, NULL); FixedIntervalRunLoop_dispose(&runLoop); runLoopPtr = FixedIntervalRunLoop_create(1, 2, runCallback, NULL); TestCase_assertPointerNonNULL(runLoopPtr); if (runLoopPtr == NULL) { return; } // Suppress clang warning verifyInit(runLoopPtr, 1, 2, runCallback, NULL); FixedIntervalRunLoop_dispose(runLoopPtr); } static void testCallbackInterval() { FixedIntervalRunLoop * runLoop; unsigned int callbackCalls = 0, reportedCallbackCalls; runLoop = FixedIntervalRunLoop_create(1, 0, runCallback, &callbackCalls); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 1023.0 / 1024.0); TestCase_assertUIntEqual(callbackCalls, 0); TestCase_assertUIntEqual(reportedCallbackCalls, 0); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 1.0 / 1024.0); TestCase_assertUIntEqual(callbackCalls, 1); TestCase_assertUIntEqual(reportedCallbackCalls, 1); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 4095.0 / 1024.0); TestCase_assertUIntEqual(callbackCalls, 4); TestCase_assertUIntEqual(reportedCallbackCalls, 3); FixedIntervalRunLoop_dispose(runLoop); } static void testTolerance() { FixedIntervalRunLoop * runLoop; unsigned int callbackCalls = 0, reportedCallbackCalls; runLoop = FixedIntervalRunLoop_create(1, 0.25, runCallback, &callbackCalls); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 0.7499); TestCase_assertUIntEqual(callbackCalls, 0); TestCase_assertUIntEqual(reportedCallbackCalls, 0); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 0.0001); TestCase_assertUIntEqual(callbackCalls, 1); TestCase_assertUIntEqual(reportedCallbackCalls, 1); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 0.25); TestCase_assertUIntEqual(callbackCalls, 1); TestCase_assertUIntEqual(reportedCallbackCalls, 0); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 1.25); TestCase_assertUIntEqual(callbackCalls, 2); TestCase_assertUIntEqual(reportedCallbackCalls, 1); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 0.5); TestCase_assertUIntEqual(callbackCalls, 3); TestCase_assertUIntEqual(reportedCallbackCalls, 1); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 2.5); TestCase_assertUIntEqual(callbackCalls, 4); TestCase_assertUIntEqual(reportedCallbackCalls, 1); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 0.0); TestCase_assertUIntEqual(callbackCalls, 5); TestCase_assertUIntEqual(reportedCallbackCalls, 1); reportedCallbackCalls = FixedIntervalRunLoop_advance(runLoop, 2.001); TestCase_assertUIntEqual(callbackCalls, 7); TestCase_assertUIntEqual(reportedCallbackCalls, 2); FixedIntervalRunLoop_dispose(runLoop); } TEST_SUITE(FixedIntervalRunLoopTest, testInit, testCallbackInterval, testTolerance)