def test_trydoer_throw(): """ Test TryDoer testing class with throw to force exit """ tymist = tyming.Tymist(tock=0.125) doer = TryDoer(tymth=tymist.tymen(), tock=0.25) assert doer.tock == 0.25 assert doer.states == [] assert tymist.tyme == 0.0 do = doer(tymth=doer.tymth, tock=doer.tock) assert inspect.isgenerator(do) result = do.send(None) assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0) ] result = do.send("Hello") assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1) ] tymist.tick() result = do.send("Hi") assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2) ] tymist.tick() try: result = do.throw(ValueError, "Bad") except ValueError as ex: assert ex.args[0] == "Bad" # exception alue is thrown value assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2), State(tyme=0.25, context='abort', feed='Bad', count=3), State(tyme=0.25, context='exit', feed=None, count=4) ] # send after throw tymist.tick() try: result = do.send("what?") except StopIteration as ex: assert ex.value == None # after throw no StopIteration value assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2), State(tyme=0.25, context='abort', feed='Bad', count=3), State(tyme=0.25, context='exit', feed=None, count=4) ]
def test_trydoer_close(): """ Test TryDoer testing class with close to force exit """ tymist = tyming.Tymist(tock=0.125) doer = TryDoer(tymth=tymist.tymen(), tock=0.25) assert doer.tock == 0.25 assert doer.states == [] assert tymist.tyme == 0.0 do = doer(tymth=doer.tymth, tock=doer.tock) assert inspect.isgenerator(do) result = do.send(None) assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0) ] result = do.send("Hello") assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1) ] tymist.tick() result = do.send("Hi") assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2) ] tymist.tick() result = do.close() assert result == None # not clean return no return from close assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2), State(tyme=0.25, context='close', feed=None, count=3), State(tyme=0.25, context='exit', feed=None, count=4) ] # send after close tymist.tick() try: result = do.send("what?") except StopIteration as ex: assert ex.value == None # after close no StopIteration value assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2), State(tyme=0.25, context='close', feed=None, count=3), State(tyme=0.25, context='exit', feed=None, count=4) ] """End Test """
def test_doist_remove_own_doer(): """ Test .remove method of Doist called by a doer of Doist that removes all doers including itself. """ tock = 1.0 limit = 5.0 # create doist first so can inject it into removeDo doist = doing.Doist(tock=tock, limit=limit) # create doized function that removes doers @doing.doize(tock=0.0, doist=doist) def removeDo(tymth=None, tock=0.0, doist=None, **opts): """ Returns generator function (doer dog) to process to remove all doers of doist but itself Parameters: tymth is injected function wrapper closure returned by .tymen() of Tymist instance (e.e. Doist/DoDoer). Calling tymth() returns associated Tymist .tyme. tock is injected initial tock value from doer.tock opts is dict of injected optional additional parameters from doer.opts Injected attributes by doize decorator as parameters to this method: gf.tock = tock # default tock attribute for doer gf.opts = {} # default opts for doer Usage: add to doers list """ yield # enter context also makes generator method # recur context doist.remove(list( doist.doers)) # attept to remove all doers including itself yield # extra yield for testing so does a couple of passes after removed yield # extra yield for testing so does a couple of passes after removed return True # once removed then return to remove itself as doer # create other doers to remove doer0 = TryDoer(stop=1) doer1 = TryDoer(stop=2) doer2 = TryDoer(stop=3) doer3 = TryDoer(stop=2) doer4 = TryDoer(stop=3) doers = [doer0, doer1, doer2, doer3, doer4, removeDo] doist.doers = list(doers) # make copy assert doist.tock == tock == 1.0 assert doist.tyme == 0.0 assert doist.limit == limit == 5.0 assert doist.doers == doers assert removeDo in doist.doers for doer in doist.doers: assert doer.done == None assert doist.done == None assert not doist.deeds doist.enter() assert not doist.done doist.recur() # should run removeDo and remove all but itself assert doist.tyme == 1.0 assert doist.deeds # doer removed by not deed. assert not doist.done # doist not done assert not doist.doers assert not removeDo in doist.doers # force exited so not done assert not doer0.done assert not doer1.done assert not doer2.done assert not doer3.done assert not doer4.done assert not removeDo.done doist.recur() assert doist.tyme == 2.0 assert doist.deeds assert not doist.done # dodoer not done assert doist.deeds assert not doist.doers doist.recur() assert doist.tyme == 3.0 assert not doist.deeds assert not doist.done assert removeDo.done # finished on it own """Done Test"""
def test_doist_remove(): """ Test Doist.remove of doers """ tock = 1.0 limit = 5.0 # start over with full set to test remove doer0 = TryDoer(stop=1) doer1 = TryDoer(stop=2) doer2 = TryDoer(stop=3) doer3 = TryDoer(stop=2) doer4 = TryDoer(stop=3) doers = [doer0, doer1, doer2, doer3, doer4] doist = doing.Doist(tock=tock, doers=list(doers), always=True) assert doist.tock == tock == 1.0 assert doist.tyme == 0.0 assert doist.doers == doers for doer in doist.doers: assert doer.done == None assert doist.done == None assert not doist.deeds doist.enter() assert doist.done == None # did not call .do so stays None not False doist.recur() doist.recur() assert doist.tyme == 2.0 assert not doist.done # doist not done assert doer0.done assert not doer1.done assert not doer2.done assert not doer3.done assert not doer4.done assert len(doist.deeds) == 4 # deeds still there doers = [doer for dog, retyme, doer in doist.deeds] assert doers == [doer1, doer2, doer3, doer4] # doer0 is removed for dog, retyme, doer in doist.deeds: assert not doer.done doist.remove(doers=[doer0, doer1, doer3]) assert doist.doers == [doer2, doer4] assert len(doist.deeds) == 2 doers = [doer for dog, retyme, doer in doist.deeds] assert doers == [doer2, doer4] # others are removed for dog, retyme, doer in doist.deeds: assert not doer.done assert not doer1.done # forced exit assert not doer3.done # forced exit doist.recur() doist.recur() assert doist.tyme == 4.0 assert doist.done == None # never called .do assert len(doist.deeds) == 0 # all done assert len(doist.doers) == 2 # not removed but completed for doer in doist.doers: assert doer.done assert doer0.done # already clean done before remove assert not doer1.done # forced exit upon remove before done assert doer2.done # clean done assert not doer3.done # forced exit upon remove before done assert doer4.done # clean done doist.recur() doist.recur() # does not complete because always == True """Done Test"""
def test_extend_remove_doers(): """ Test Doist but dynamically extend and remove doers """ tock = 1.0 limit = 5.0 # create some TryDoers for doers doer0 = TryDoer(stop=1) doer1 = TryDoer(stop=2) doer2 = TryDoer(stop=3) doers = [doer0, doer1, doer2] doist = doing.Doist(tock=tock, limit=limit, doers=list(doers)) # make copy assert doist.tock == tock == 1.0 assert doist.limit == limit == 5.0 assert doist.done is None assert doist.doers == doers assert not doist.deeds doist.do(limit=2) assert doist.tyme == 2.0 assert not doist.done # still remaining deeds that did not complete assert doer0.done assert not doer1.done assert not doer2.done assert not doist.deeds assert doist.doers == doers # redo doist.do(tyme=0, limit=2) assert doist.tyme == 2.0 assert not doist.done # deeds that did not complete assert doer0.done assert not doer1.done assert not doer2.done assert not doist.deeds assert doist.doers == doers # redo doist.do(tyme=0, limit=2) assert doist.tyme == 2.0 assert not doist.done # remaining deeds that did not complete assert doer0.done assert not doer1.done assert not doer2.done assert not doist.deeds assert doist.doers == doers # Test extend and remove Doers # Now manually restart and run manually but do not reach limit so we can # and extend remove below doist.done = False assert not doist.done doist.tyme = 0.0 assert doist.tyme == 0.0 assert not doist.deeds assert doist.doers == doers doist.enter() assert len(doist.deeds) == 3 doist.recur() doist.recur() assert doist.tyme == 2.0 assert not doist.done assert doer0.done assert not doer1.done assert not doer2.done assert len(doist.deeds) == 2 # deeds still there # test extend Doers doer3 = TryDoer(stop=1) doer4 = TryDoer(stop=2) moredoers = [doer3, doer4] doist.extend(doers=list(moredoers)) # make copy assert doist.doers == doers + moredoers assert len(doist.doers) == 5 assert len(doist.deeds) == 4 indices = [index for dog, retyme, index in doist.deeds] doers = [doer for dog, retyme, doer in doist.deeds] assert doers == [doer1, doer2, doer3, doer4] doist.recur() doist.recur() assert doist.tyme == 4.0 assert not doist.done # doist not done assert doer0.done assert doer1.done assert doer2.done assert doer3.done assert not doer4.done assert len(doist.deeds) == 1 # deeds still there doist.exit() assert doist.done == False # forced close so not done assert doer0.done assert doer1.done assert doer2.done assert doer3.done assert not doer4.done # forced close so not done assert not doist.deeds """ Done Test"""
def test_dodoer_remove_own_doer(): """ Test .remove method of DoDoer called by a doer of DoDoer that removes all doers including own doer """ tock = 1.0 # create DoDoer subclass with doized method to remove other doers class RemoveDoDoer(doing.DoDoer): """ Subclass with doized method to remove other doers """ def __init__(self, doers=None, **kwa): """ Add removeDo to doers Inherited Parameters: tymist is Tymist instance tock is float seconds initial value of .tock doers is list of doers (do generator instancs or functions) """ doers = doers if doers is not None else [] # default doers.extend([self.removeDo]) # add .removeDo super(RemoveDoDoer, self).__init__(doers=doers, **kwa) @doing.doize() def removeDo(self, tymth=None, tock=0.0, **opts): """ Returns Doist compatibile generator method (doer dog) to process to remove all doers but itself Parameters: tymth is injected function wrapper closure returned by .tymen() of Tymist instance (e.e. Doist/DoDoer). Calling tymth() returns associated Tymist .tyme. tock is injected initial tock value from doer.tock opts is dict of injected optional additional parameters from doer.opts Injected attributes by doize decorator as parameters to this method: gf.tock = tock # default tock attribute for doer gf.opts = {} # default opts for doer Usage: add to doers list """ yield # enter context also makes generator method # recur context self.remove(list(self.doers)) yield # extra yield for testing so does a couple of passes after removed yield # extra yield for testing so does a couple of passes after removed return True # once removed then return to remove itself as doer # start over with full set to test remove where the remove is called by # a doer in the DoDoer.doers doer0 = TryDoer(stop=1) doer1 = TryDoer(stop=2) doer2 = TryDoer(stop=3) doer3 = TryDoer(stop=2) doer4 = TryDoer(stop=3) doers = [doer0, doer1, doer2, doer3, doer4] dodoer = RemoveDoDoer(tock=tock, doers=list(doers)) assert dodoer.tock == tock == 1.0 assert dodoer.removeDo in dodoer.doers assert len(dodoer.doers) == len(doers) + 1 == 6 for doer in dodoer.doers: assert doer.done == None assert dodoer.always == False limit = 5.0 doist = doing.Doist(tock=tock, limit=limit, doers=[dodoer]) assert doist.tyme == 0.0 assert doist.tock == tock == 1.0 assert doist.limit == limit == 5.0 assert doist.doers == [dodoer] assert dodoer.done == None assert dodoer.always == False assert not dodoer.deeds doist.enter() assert not dodoer.done doist.recur() # should run dodoer.removeDo and remove all but itself assert doist.tyme == 1.0 assert doist.deeds assert not dodoer.done # dodoer not done assert dodoer.deeds # deed still there even though doer is removed assert not dodoer.doers assert not dodoer.removeDo in dodoer.doers # force exited so not done assert not doer0.done assert not doer1.done assert not doer2.done assert not doer3.done assert not doer4.done assert not dodoer.removeDo.done doist.recur() assert doist.tyme == 2.0 assert doist.deeds assert not dodoer.done # dodoer not done assert dodoer.deeds assert not dodoer.doers doist.recur() assert doist.tyme == 3.0 assert not doist.deeds assert dodoer.done # dodoer done completed successfully assert not dodoer.deeds # finished by itself assert not dodoer.doers assert dodoer.removeDo.done # finished by itself. """Done Test"""
def test_dodoer_always(): """ Test DoDoer class with tryDoer and always """ tock = 1.0 # create some TryDoers for doers doer0 = TryDoer(stop=1) doer1 = TryDoer(stop=2) doer2 = TryDoer(stop=3) doers = [doer0, doer1, doer2] dodoer = doing.DoDoer(tock=tock, doers=list(doers)) # make copy assert dodoer.tock == tock == 1.0 assert dodoer.doers == doers for doer in dodoer.doers: assert doer.done == None assert dodoer.always == False limit = 5.0 doist = doing.Doist(tock=tock, limit=limit, doers=[dodoer]) assert doist.tock == tock == 1.0 assert doist.limit == limit == 5.0 assert doist.doers == [dodoer] assert dodoer.done == None assert dodoer.always == False assert not dodoer.deeds # limit = 5 is long enough that all TryDoers complete doist.do() assert doist.tyme == 4.0 assert dodoer.done assert dodoer.tyme == doist.tyme assert dodoer.always == False for doer in dodoer.doers: assert doer.done assert doer.tyme == dodoer.tyme == doist.tyme assert not dodoer.deeds # redo but with limit == so not all complete doist.do(limit=2) assert doist.tyme == 6.0 assert not dodoer.done assert dodoer.always == False assert doer0.done assert not doer1.done assert not doer2.done assert not dodoer.deeds # redo but with ddoer.always == True but limit enough to complete dodoer.always = True assert dodoer.always == True doist.do(limit=5) assert doist.tyme == 11.0 assert not dodoer.done # dodoer not done assert dodoer.always == True for doer in dodoer.doers: # but all its doers are done assert doer.done assert not dodoer.deeds # redo but with ddoer.always == True but limit not enought to complete assert dodoer.always == True doist.do(limit=2) assert doist.tyme == 13.0 assert not dodoer.done # dodoer not done assert dodoer.always == True assert doer0.done assert not doer1.done assert not doer2.done assert not dodoer.deeds # redo but with ddoer.always == True but manual run doist so does not # force complete doers assert dodoer.always == True assert doist.tyme == 13.0 doist.enter() doist.recur() doist.recur() assert doist.tyme == 15.0 assert not dodoer.done # dodoer not done assert dodoer.always == True assert doer0.done assert not doer1.done assert not doer2.done assert len(dodoer.deeds) == 2 # deeds still there # Test extend # now extend Doers doer3 = TryDoer(stop=1) doer4 = TryDoer(stop=2) moredoers = [doer3, doer4] dodoer.extend(doers=list(moredoers)) assert dodoer.doers == doers + moredoers assert len(dodoer.deeds) == 4 doers = [doer for dog, retyme, doer in dodoer.deeds] assert doers == [doer1, doer2, doer3, doer4] doist.recur() doist.recur() assert doist.tyme == 17.0 assert not dodoer.done # dodoer not done assert dodoer.always == True assert doer0.done assert doer1.done assert doer2.done assert doer3.done assert not doer4.done assert len(dodoer.deeds) == 1 # deeds still there doist.exit() assert dodoer.done == False # forced close so not done assert doer0.done assert doer1.done assert doer2.done assert doer3.done assert not doer4.done # forced close so not done assert not doist.deeds """End Test """
def test_trydoer_break(): """ Test TryDoer testing class with break to normal exit """ tymist = tyming.Tymist(tock=0.125) doer = TryDoer(tymth=tymist.tymen(), tock=0.25) assert doer.tock == 0.25 assert doer.states == [] assert tymist.tyme == 0.0 do = doer(tymth=doer.tymth, tock=doer.tock) assert inspect.isgenerator(do) result = do.send(None) assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0) ] result = do.send("Hello") assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1) ] tymist.tick() result = do.send("Hi") assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2) ] tymist.tick() result = do.send("Blue") assert result == 0.25 assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2), State(tyme=0.25, context='recur', feed='Blue', count=3) ] tymist.tick() try: result = do.send("Red") except StopIteration as ex: assert ex.value == True # clean return assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2), State(tyme=0.25, context='recur', feed='Blue', count=3), State(tyme=0.375, context='recur', feed='Red', count=4), State(tyme=0.375, context='exit', feed=None, count=5) ] # send after break tymist.tick() try: result = do.send("Red") except StopIteration as ex: assert ex.value == None # after break no StopIteration value assert doer.states == [ State(tyme=0.0, context='enter', feed='Default', count=0), State(tyme=0.0, context='recur', feed='Hello', count=1), State(tyme=0.125, context='recur', feed='Hi', count=2), State(tyme=0.25, context='recur', feed='Blue', count=3), State(tyme=0.375, context='recur', feed='Red', count=4), State(tyme=0.375, context='exit', feed=None, count=5) ] """End Test """