def testSequentialCalls(self): log = [] EventLoop.call(log.append, 1) EventLoop.call(log.append, 2) EventLoop.call(log.append, 3) EventLoop.call(log.append, 4) EventLoop.call(EventLoop.stop) EventLoop.run() self.assertEqual(log, [1,2,3,4])
def testSequentialCalls(self): log = [] EventLoop.call(log.append, 1) EventLoop.call(log.append, 2) EventLoop.call(log.append, 3) EventLoop.call(log.append, 4) class IdleTimer(trellis.Component): trellis.attrs( idle_timeout=20, busy=False, ) idle_for = trellis.maintain( lambda self: self.idle_for.begins_with(not self.busy), initially=NOT_YET) @trellis.maintain # XXX should be perform def alarm(self): if self.idle_for[self.idle_timeout] and EventLoop.running: log.append(5) EventLoop.stop() it = IdleTimer() EventLoop.run() self.assertEqual(log, [1, 2, 3, 4, 5])
def testSequentialCalls(self): log = [] EventLoop.call(log.append, 1) EventLoop.call(log.append, 2) EventLoop.call(log.append, 3) EventLoop.call(log.append, 4) class IdleTimer(trellis.Component): trellis.attrs( idle_timeout = 20, busy = False, ) idle_for = trellis.maintain( lambda self: self.idle_for.begins_with(not self.busy), initially=NOT_YET ) trellis.maintain() # XXX should be perform def alarm(self): if self.idle_for[self.idle_timeout] and EventLoop.running: log.append(5) EventLoop.stop() it = IdleTimer() EventLoop.run() self.assertEqual(log, [1,2,3,4,5])
def testSequentialCalls(self): log = [] EventLoop.call(log.append, 1) EventLoop.call(log.append, 2) EventLoop.call(log.append, 3) EventLoop.call(log.append, 4) event = Time[0.00001] def c(): if event: # events aren't EventLoop.call(EventLoop.stop) c = trellis.Cell(c) c.value # This will loop indefinitely, if sub-millisecond events aren't # rounded up to the next millisecond. EventLoop.run() self.frame.Destroy() self.assertEqual(log, [1, 2, 3, 4])
def testSequentialCalls(self): log = [] EventLoop.call(log.append, 1) EventLoop.call(log.append, 2) EventLoop.call(log.append, 3) EventLoop.call(log.append, 4) event = Time[0.00001] def c(): if event: # events aren't EventLoop.call(EventLoop.stop) c = trellis.Cell(c) c.value # This will loop indefinitely, if sub-millisecond events aren't # rounded up to the next millisecond. EventLoop.run() self.frame.Destroy() self.assertEqual(log, [1, 2, 3, 4])
def c(): if event: # events aren't EventLoop.call(EventLoop.stop)
class TestDefaultEventLoop(unittest.TestCase): def setUp(self): self.loop = EventLoop() self.ctrl = trellis.ctrl def testCallAndPoll(self): log = [] self.loop.call(log.append, 1) self.loop.call(log.append, 2) self.assertEqual(log, []) self.loop.poll() self.assertEqual(log, [1]) self.loop.poll() self.assertEqual(log, [1, 2]) self.loop.poll() self.assertEqual(log, [1, 2]) @a def testLoopIsNonAtomic(self): self.assertRaises(AssertionError, self.loop.poll) self.assertRaises(AssertionError, self.loop.flush) self.assertRaises(AssertionError, self.loop.run) def testCallAndFlush(self): log = [] self.loop.call(log.append, 1) self.loop.call(log.append, 2) self.loop.call(self.loop.call, log.append, 3) self.assertEqual(log, []) self.loop.flush() self.assertEqual(log, [1, 2]) self.loop.poll() self.assertEqual(log, [1, 2, 3]) self.loop.poll() self.assertEqual(log, [1, 2, 3]) def testUndoOfCall(self): log = [] def do(): self.loop.call(log.append, 1) sp = self.ctrl.savepoint() self.loop.call(log.append, 2) self.ctrl.rollback_to(sp) self.loop.call(log.append, 3) self.ctrl.atomically(do) self.assertEqual(log, []) self.loop.flush() self.assertEqual(log, [1, 3]) def testScheduleUndo(self): t = Time() t.auto_update = False t20 = t[20] log = [] @trellis.Cell def checktime(): t.reached(t20) log.append(t._events[t20._when]) @trellis.Performer def err_after_reached(): if len(t._schedule) > 1: raise DummyError self.assertRaises(DummyError, checktime.get_value) self.assertEqual(t._schedule, [t20._when, Max]) self.assertEqual(dict(t._events), {t20._when: log[0]}) del checktime self.failUnless(isinstance(log.pop(), trellis.Sensor)) self.assertEqual(dict(t._events), {}) self.assertEqual(log, []) def force_rollback(self): @trellis.Performer def do_it(): raise DummyError def testUpdateUndo(self): t = Time() t.auto_update = False t20 = t[20] @trellis.Cell def checktime(): if t.reached(t20): self.force_rollback() checktime.value self.assertEqual(t._schedule, [t20._when, Max]) self.assertEqual(list(t._events), [t20._when]) self.assertRaises(DummyError, t.advance, 20) self.assertEqual(t._schedule, [t20._when, Max]) self.assertEqual(list(t._events), [t20._when])
def c(): if event: # events aren't EventLoop.call(EventLoop.stop)
class TestDefaultEventLoop(unittest.TestCase): def setUp(self): self.loop = EventLoop() self.ctrl = trellis.ctrl def testCallAndPoll(self): log = [] self.loop.call(log.append, 1) self.loop.call(log.append, 2) self.assertEqual(log, []) self.loop.poll() self.assertEqual(log, [1]) self.loop.poll() self.assertEqual(log, [1, 2]) self.loop.poll() self.assertEqual(log, [1, 2]) @a def testLoopIsNonAtomic(self): self.assertRaises(AssertionError, self.loop.poll) self.assertRaises(AssertionError, self.loop.flush) self.assertRaises(AssertionError, self.loop.run) def testCallAndFlush(self): log = [] self.loop.call(log.append, 1) self.loop.call(log.append, 2) self.loop.call(self.loop.call, log.append, 3) self.assertEqual(log, []) self.loop.flush() self.assertEqual(log, [1, 2]) self.loop.poll() self.assertEqual(log, [1, 2, 3]) self.loop.poll() self.assertEqual(log, [1, 2, 3]) def testUndoOfCall(self): log = [] def do(): self.loop.call(log.append, 1) sp = self.ctrl.savepoint() self.loop.call(log.append, 2) self.ctrl.rollback_to(sp) self.loop.call(log.append, 3) self.ctrl.atomically(do) self.assertEqual(log, []) self.loop.flush() self.assertEqual(log, [1, 3]) def testScheduleUndo(self): t = Time() t.auto_update = False t20 = t[20] log = [] @trellis.Cell def checktime(): t.reached(t20) log.append(t._events[t20._when]) @trellis.Performer def err_after_reached(): if len(t._schedule) > 1: raise DummyError self.assertRaises(DummyError, checktime.get_value) self.assertEqual(t._schedule, [t20._when, Max]) self.assertEqual(dict(t._events), {t20._when: log[0]}) del checktime self.failUnless(isinstance(log.pop(), trellis.Sensor)) self.assertEqual(dict(t._events), {}) self.assertEqual(log, []) def force_rollback(self): @trellis.Performer def do_it(): raise DummyError def testUpdateUndo(self): t = Time() t.auto_update = False t20 = t[20] @trellis.Cell def checktime(): if t.reached(t20): self.force_rollback() checktime.value self.assertEqual(t._schedule, [t20._when, Max]) self.assertEqual(list(t._events), [t20._when]) self.assertRaises(DummyError, t.advance, 20) self.assertEqual(t._schedule, [t20._when, Max]) self.assertEqual(list(t._events), [t20._when])