Ejemplo n.º 1
0
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)
        ]
Ejemplo n.º 2
0
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 """
Ejemplo n.º 3
0
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"""
Ejemplo n.º 4
0
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"""
Ejemplo n.º 5
0
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"""
Ejemplo n.º 6
0
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"""
Ejemplo n.º 7
0
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 """
Ejemplo n.º 8
0
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 """