void test() { if (os_) *os_ << "test()\n"; IterationListenerRegistry registry; TestListener test3("test3"); TestListener test4("test4"); TestListener test5("test5"); TestListener test6("test6"); registry.addListener(IterationListenerPtr(&test3, nullDeallocate), 3); registry.addListener(IterationListenerPtr(&test4, nullDeallocate), 4); registry.addListener(IterationListenerPtr(&test5, nullDeallocate), 5); registry.addListener(IterationListenerPtr(&test6, nullDeallocate), 6); size_t iterationCount = 24; for (size_t i=0; i<iterationCount; i++) registry.broadcastUpdateMessage(IterationListener::UpdateMessage(i, iterationCount)); // validate unit_assert(test3.count() == 9); // 0 2 5 8 11 14 17 20 23 unit_assert(test4.count() == 7); unit_assert(test5.count() == 6); unit_assert(test6.count() == 5); if (os_) *os_ << endl; }
void testTime() { if (os_) *os_ << "testTime()\n"; IterationListenerRegistry registry; TestListener test_iteration("test_iteration"); TestListener test_time("test_time"); registry.addListener(IterationListenerPtr(&test_iteration, nullDeallocate), 1000000); registry.addListenerWithTimer(IterationListenerPtr(&test_time, nullDeallocate), 1.0); time_t start; time(&start); const double iterationDuration = 5.0; for (int i=0; ; i++) { time_t now; time(&now); if (difftime(now, start) > iterationDuration) break; registry.broadcastUpdateMessage(IterationListener::UpdateMessage(i,0)); } if (os_) *os_ << endl; }
void testCancel() { if (os_) *os_ << "testCancel()\n"; IterationListenerRegistry registry; CancelListener cancelListener(12); TestListener test3("test3"); TestListener test4("test4"); TestListener test6("test6"); registry.addListener(IterationListenerPtr(&cancelListener, nullDeallocate), 1); registry.addListener(IterationListenerPtr(&test3, nullDeallocate), 3); registry.addListener(IterationListenerPtr(&test4, nullDeallocate), 4); registry.addListener(IterationListenerPtr(&test6, nullDeallocate), 5); // typical use of IterationListenerRegistry, with proper Status_Cancel handling bool canceled = false; size_t iterationCount = 24; for (size_t i=0; i<iterationCount; i++) { IterationListener::Status status = registry.broadcastUpdateMessage(IterationListener::UpdateMessage(i, iterationCount)); // handle Status_Cancel if (status == IterationListener::Status_Cancel) { canceled = true; break; } } // implementations should send a final update on completion of the iteration if (!canceled) registry.broadcastUpdateMessage(IterationListener::UpdateMessage(iterationCount, iterationCount)); // validate unit_assert(test3.count() == 5); unit_assert(test4.count() == 4); unit_assert(test6.count() == 3); if (os_) *os_ << endl; }
void testRemove() { if (os_) *os_ << "testRemove()\n"; IterationListenerRegistry registry; BadListener bad; TestListener test3("test3"); TestListener test4("test4"); IterationListenerPtr badPtr(&bad, nullDeallocate); registry.addListener(IterationListenerPtr(&test3, nullDeallocate), 3); registry.addListener(badPtr, 1); registry.addListener(IterationListenerPtr(&test4, nullDeallocate), 4); // sanity check -- verify that broadcast throws if BadListener is in the registry bool caught = false; try { registry.broadcastUpdateMessage(IterationListener::UpdateMessage(0,0)); } catch (exception& e) { if (e.what() == string("bad")) caught = true; } unit_assert(caught); // remove BadListener -- broadcast will throw if not removed properly registry.removeListener(badPtr); registry.broadcastUpdateMessage(IterationListener::UpdateMessage(0,0)); if (os_) *os_ << endl; }