##// END OF EJS Templates
hgweb: generate last change date for an empty atom-bookmarks feed (issue5022)...
hgweb: generate last change date for an empty atom-bookmarks feed (issue5022) RFC 4287 states that atom feeds must have an <updated> element, so let's add one even when repo doesn't have a single bookmark.

File last commit:

r27786:4a7dc29b default
r28712:80e92247 default
Show More
test-ctxmanager.py
79 lines | 2.4 KiB | text/x-python | PythonLexer
/ tests / test-ctxmanager.py
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 from __future__ import absolute_import
import silenttestrunner
import unittest
from mercurial.util import ctxmanager
class contextmanager(object):
def __init__(self, name, trace):
self.name = name
self.entered = False
self.exited = False
self.trace = trace
def __enter__(self):
self.entered = True
self.trace(('enter', self.name))
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.exited = exc_type, exc_val, exc_tb
self.trace(('exit', self.name))
def __repr__(self):
return '<ctx %r>' % self.name
class ctxerror(Exception):
pass
class raise_on_enter(contextmanager):
def __enter__(self):
self.trace(('raise', self.name))
raise ctxerror(self.name)
class raise_on_exit(contextmanager):
def __exit__(self, exc_type, exc_val, exc_tb):
self.trace(('raise', self.name))
raise ctxerror(self.name)
def ctxmgr(name, trace):
return lambda: contextmanager(name, trace)
class test_ctxmanager(unittest.TestCase):
def test_basics(self):
trace = []
addtrace = trace.append
with ctxmanager(ctxmgr('a', addtrace), ctxmgr('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 a, b = c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 c.atexit(addtrace, ('atexit', 'x'))
c.atexit(addtrace, ('atexit', 'y'))
self.assertEqual(trace, [('enter', 'a'), ('enter', 'b'),
('atexit', 'y'), ('atexit', 'x'),
('exit', 'b'), ('exit', 'a')])
def test_raise_on_enter(self):
trace = []
addtrace = trace.append
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 def go():
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 with ctxmanager(ctxmgr('a', addtrace),
lambda: raise_on_enter('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 addtrace('unreachable')
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 self.assertRaises(ctxerror, go)
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 self.assertEqual(trace, [('enter', 'a'), ('raise', 'b'), ('exit', 'a')])
def test_raise_on_exit(self):
trace = []
addtrace = trace.append
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 def go():
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 with ctxmanager(ctxmgr('a', addtrace),
lambda: raise_on_exit('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 addtrace('running')
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 self.assertRaises(ctxerror, go)
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 self.assertEqual(trace, [('enter', 'a'), ('enter', 'b'), 'running',
('raise', 'b'), ('exit', 'a')])
if __name__ == '__main__':
silenttestrunner.main(__name__)