def test_exception_swallowing(): class SwallowingContextManager(ContextManager): def __init__(self): self.times_entered = 0 self.times_exited = 0 def __enter__(self): self.times_entered += 1 return self def __exit__(self, exc_type, exc_value, exc_traceback): self.times_exited += 1 if isinstance(exc_value, MyException): return True swallowing_rcm = as_reentrant(SwallowingContextManager()) my_set = set() with swallowing_rcm: my_set.add(0) with swallowing_rcm: my_set.add(1) with swallowing_rcm: my_set.add(2) with swallowing_rcm: my_set.add(3) with swallowing_rcm: my_set.add(4) raise MyException my_set.add(5) my_set.add(6) my_set.add(7) my_set.add(8) assert my_set == set((0, 1, 2, 3, 4))
def test_exception_swallowing(): class SwallowingContextManager(ContextManager): def __init__(self): self.times_entered = 0 self.times_exited = 0 def __enter__(self): self.times_entered += 1 return self def __exit__(self, exc_type, exc_value, exc_traceback): self.times_exited += 1 if isinstance(exc_value, MyException): return True swallowing_rcm = as_reentrant(SwallowingContextManager()) my_set = set() with swallowing_rcm: my_set.add(0) with swallowing_rcm: my_set.add(1) with swallowing_rcm: my_set.add(2) with swallowing_rcm: my_set.add(3) with swallowing_rcm: my_set.add(4) raise MyException my_set.add(5) my_set.add(6) my_set.add(7) my_set.add(8) assert my_set == {0, 1, 2, 3, 4}
def test_order_of_depth_modification(): depth_log = queue_module.Queue() class JohnnyContextManager(ContextManager): def __enter__(self): depth_log.put(johnny_reentrant_context_manager.depth) return self def __exit__(self, exc_type, exc_value, exc_traceback): depth_log.put(johnny_reentrant_context_manager.depth) johnny_reentrant_context_manager = as_reentrant(JohnnyContextManager()) assert johnny_reentrant_context_manager.depth == 0 with johnny_reentrant_context_manager: assert johnny_reentrant_context_manager.depth == 1 # `.__wrapped__.__enter__` saw a depth of 0, because the depth # increment happens *after* `.__wrapped__.__enter__` is called: assert depth_log.get(block=False) == 0 with johnny_reentrant_context_manager: assert johnny_reentrant_context_manager.depth == 2 assert depth_log.qsize() == 0 # We're in a depth greater than 1, # so `.__wrapped__.__enter__` wasn't # even called. assert johnny_reentrant_context_manager.depth == 1 assert depth_log.qsize() == 0 # We came out of a depth greater than 1, # so `.__wrapped__.__enter__` wasn't even # called. # `.__wrapped__.__enter__` saw a depth of 1, because the depth decrement # happens *after* `.__wrapped__.__enter__` is called: assert depth_log.get(block=False) == 1
def test_reentrant_context_manager(): '''Test the basic workings of `ReentrantContextManager`.''' class MyContextManager(ContextManager): def __init__(self): self.times_entered = 0 self.times_exited = 0 def __enter__(self): self.times_entered += 1 return self.times_entered def __exit__(self, exc_type, exc_value, exc_traceback): self.times_exited += 1 get_reentrant_context_manager = lambda: as_reentrant(MyContextManager()) my_rcm = get_reentrant_context_manager() assert my_rcm.__wrapped__.times_entered == 0 assert my_rcm.__wrapped__.times_exited == 0 with my_rcm as enter_return_value: assert enter_return_value == 1 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 0 with my_rcm as enter_return_value: with my_rcm as enter_return_value: assert enter_return_value == 1 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 0 assert enter_return_value == 1 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 0 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 1 with my_rcm as enter_return_value: assert enter_return_value == 2 assert my_rcm.__wrapped__.times_entered == 2 assert my_rcm.__wrapped__.times_exited == 1 with my_rcm as enter_return_value: with my_rcm as enter_return_value: assert enter_return_value == 2 assert my_rcm.__wrapped__.times_entered == 2 assert my_rcm.__wrapped__.times_exited == 1 assert enter_return_value == 2 assert my_rcm.__wrapped__.times_entered == 2 assert my_rcm.__wrapped__.times_exited == 1 with cute_testing.RaiseAssertor(MyException): with my_rcm as enter_return_value: assert enter_return_value == 3 assert my_rcm.__wrapped__.times_entered == 3 assert my_rcm.__wrapped__.times_exited == 2 with my_rcm as enter_return_value: with my_rcm as enter_return_value: assert enter_return_value == 3 assert my_rcm.__wrapped__.times_entered == 3 assert my_rcm.__wrapped__.times_exited == 2 assert enter_return_value == 3 assert my_rcm.__wrapped__.times_entered == 3 assert my_rcm.__wrapped__.times_exited == 2 raise MyException
# Copyright 2009-2017 Ram Rachum. # This program is distributed under the MIT license. '''Testing module for `python_toolbox.caching.CachedProperty`.''' import nose from python_toolbox import context_management from python_toolbox import misc_tools from python_toolbox.caching import cache, CachedType, CachedProperty from python_toolbox.context_management import (as_idempotent, as_reentrant, BlankContextManager) get_depth_counting_context_manager = \ lambda: as_reentrant(BlankContextManager()) @misc_tools.set_attributes(i=0) def counting_func(self): '''Return a bigger number every time.''' try: return counting_func.i finally: counting_func.i += 1 def test(): '''Test basic workings of `CachedProperty`.''' class A: personality = CachedProperty(counting_func)
# Copyright 2009-2017 Ram Rachum. # This program is distributed under the MIT license. '''Test the `python_toolbox.context_management.nested` function.''' from python_toolbox import freezing from python_toolbox import cute_testing from python_toolbox.context_management import (BlankContextManager, nested, as_reentrant) get_depth_counting_context_manager = \ lambda: as_reentrant(BlankContextManager()) def test_nested(): '''Test the basic workings of `nested`.''' a = get_depth_counting_context_manager() b = get_depth_counting_context_manager() c = get_depth_counting_context_manager() with nested(a): assert (a.depth, b.depth, c.depth) == (1, 0, 0) with nested(a, b): assert (a.depth, b.depth, c.depth) == (2, 1, 0) with nested(a, b, c): assert (a.depth, b.depth, c.depth) == (3, 2, 1) with nested(c): assert (a.depth, b.depth, c.depth) == (1, 0, 1)
def test_reentrant_context_manager(): """Test the basic workings of `ReentrantContextManager`.""" class MyContextManager(ContextManager): def __init__(self): self.times_entered = 0 self.times_exited = 0 def __enter__(self): self.times_entered += 1 return self.times_entered def __exit__(self, exc_type, exc_value, exc_traceback): self.times_exited += 1 get_reentrant_context_manager = lambda: as_reentrant(MyContextManager()) my_rcm = get_reentrant_context_manager() assert my_rcm.__wrapped__.times_entered == 0 assert my_rcm.__wrapped__.times_exited == 0 with my_rcm as enter_return_value: assert enter_return_value == 1 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 0 with my_rcm as enter_return_value: with my_rcm as enter_return_value: assert enter_return_value == 1 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 0 assert enter_return_value == 1 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 0 assert my_rcm.__wrapped__.times_entered == 1 assert my_rcm.__wrapped__.times_exited == 1 with my_rcm as enter_return_value: assert enter_return_value == 2 assert my_rcm.__wrapped__.times_entered == 2 assert my_rcm.__wrapped__.times_exited == 1 with my_rcm as enter_return_value: with my_rcm as enter_return_value: assert enter_return_value == 2 assert my_rcm.__wrapped__.times_entered == 2 assert my_rcm.__wrapped__.times_exited == 1 assert enter_return_value == 2 assert my_rcm.__wrapped__.times_entered == 2 assert my_rcm.__wrapped__.times_exited == 1 with cute_testing.RaiseAssertor(MyException): with my_rcm as enter_return_value: assert enter_return_value == 3 assert my_rcm.__wrapped__.times_entered == 3 assert my_rcm.__wrapped__.times_exited == 2 with my_rcm as enter_return_value: with my_rcm as enter_return_value: assert enter_return_value == 3 assert my_rcm.__wrapped__.times_entered == 3 assert my_rcm.__wrapped__.times_exited == 2 assert enter_return_value == 3 assert my_rcm.__wrapped__.times_entered == 3 assert my_rcm.__wrapped__.times_exited == 2 raise MyException