Exemple #1
0
def test_memoize_and_safe_mode():

    def b1(env):
        if len(env.a) > 0:
            env.a.pop()
        return env.a

    rc = Context(safe=True)
    rc.new_value(a=[1, 2, 3])
    rc.new_expression(b=b1)
    rc.memoize('b')
    rc.new_observer('c', lambda env: env.b)

    raises(Exception, rc.memoize, 'a')
    raises(Exception, rc.memoize, 'c')
    rc.memoize(rc['b'], False)
    assert not rc['b'].memoized
    rc.memoize('b', True)
    assert rc['b'].memoized

    rc.run()
    assert rc['b'].exec_count is 4
    assert rc['c'].exec_count is 4
    assert len(rc['b'].value) is 0
    assert len(rc['c'].value) is 0

    rc.set_value(a=[1, 2, 3])
    assert rc['b'].exec_count is 4
    assert rc['c'].exec_count is 5
    assert len(rc['b'].value) is 0
    assert len(rc['c'].value) is 0

    rc.set_value(a=[1, 2])
    assert rc['b'].exec_count is 4
    assert rc['c'].exec_count is 6
    assert len(rc['b'].value) is 0
    assert len(rc['c'].value) is 0

    rc.safe = False

    rc.set_value(a=[1, 2, 3])
    assert rc['b'].exec_count is 4
    assert rc['c'].exec_count is 7
    assert len(rc['b'].value) is 0
    assert len(rc['c'].value) is 0

    rc.set_value(a=[1])
    assert rc['b'].exec_count is 4
    assert rc['c'].exec_count is 8
    assert len(rc['b'].value) is 0
    assert len(rc['c'].value) is 0

    rc.set_value(a=[10, 20])
    assert rc['b'].exec_count is 5
    assert rc['c'].exec_count is 9
    assert len(rc['b'].value) is 1
    assert len(rc['c'].value) is 1
Exemple #2
0
def test_safe_mode():

    def b1(env):
        if len(env.a) > 0:
            env.a.pop()
        return env.a

    rc = Context(safe=True)
    rc.new_value(a=[1, 2, 3])
    rc.new_expression(b=b1)
    rc.new_observer('c', lambda env: env.b)

    rc.run()
    assert rc['b'].exec_count is 4
    assert rc['c'].exec_count is 4
    assert len(rc['b'].value) is 0
    assert len(rc['c'].value) is 0

    rc.safe = False
    rc.set_value(a=[1, 2, 3])
    assert rc['b'].exec_count is 5
    assert rc['c'].exec_count is 5
    assert len(rc['b'].value) is 2
    assert len(rc['c'].value) is 2

    def b2(env):
        env.b1.pop()
        return env.a

    rc = Context(safe=True)
    rc.new_value(a=[1, 2, 3])
    rc.new_expression(b1=lambda env: list(env.a))
    rc.new_expression(b2=b2)
    rc.new_observer('c', lambda env: (env.b1, env.b2))

    raises(Exception, rc.run)

    rc = Context(safe=False)
    rc.new_value(a=[1, 2, 3])
    rc.new_expression(b1=lambda env: list(env.a))
    rc.new_expression(b2=b2)
    rc.new_observer('c', lambda env: (env.b1, env.b2))
    rc.run()
    assert rc['b1'].exec_count is 1
    assert rc['b2'].exec_count is 1
    assert rc['c'].exec_count is 1

    def b3(env):
        if len(env.a1) > 0:
            return env.a1.pop()
        return 0

    rc = Context(safe=True)
    a = [1, 2, 3]
    rc.new_value(a1=a, a2=a)
    rc.new_expression(b=b3)
    rc.new_observer('c', lambda env: env.b)
    rc.run()
    assert rc['b'].exec_count is 4
    assert rc['c'].exec_count is 4
    assert rc['b'].value is 0
    assert rc['c'].value is 0
    assert len(rc['a1'].value) is 0
    assert len(rc['a2'].value) is 0
    assert len(a) is 0

    a.extend([1, 2])
    rc.run()
    assert rc['b'].exec_count is 7
    assert rc['c'].exec_count is 7
    assert rc['b'].value is 0
    assert rc['c'].value is 0
    assert len(rc['a1'].value) is 0
    assert len(rc['a2'].value) is 0
    assert len(a) is 0