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
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