mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-06 00:05:02 -05:00
140 lines
4.3 KiB
Python
140 lines
4.3 KiB
Python
import sys
|
|
|
|
import six
|
|
|
|
from nose2.plugins import printhooks
|
|
from nose2 import events, session
|
|
from nose2.tests._common import TestCase
|
|
|
|
|
|
class CustomEvent(events.Event):
|
|
|
|
_attrs = events.Event._attrs + ('args',)
|
|
|
|
def __init__(self, args, **kw):
|
|
self.args = args
|
|
super(CustomEvent, self).__init__(**kw)
|
|
|
|
|
|
class TestPluginA(events.Plugin):
|
|
|
|
def register(self):
|
|
super(TestPluginA, self).register()
|
|
self.addMethods('pluginHookA')
|
|
|
|
def register_with_nested_hook(self):
|
|
super(TestPluginA, self).register()
|
|
self.addMethods('pluginHookB')
|
|
|
|
|
|
class TestPluginB(events.Plugin):
|
|
|
|
def pluginHookA(self, event):
|
|
event.handled = True
|
|
return "TestPluginB.pluginHookA"
|
|
|
|
|
|
class TestPluginC(events.Plugin):
|
|
|
|
def register(self):
|
|
super(TestPluginC, self).register()
|
|
self.addMethods('pluginHookB1')
|
|
|
|
def pluginHookB(self, event):
|
|
nested_event = CustomEvent('level_two_args')
|
|
self.session.hooks.pluginHookB1(nested_event)
|
|
event.handled = True
|
|
return "TestPluginC.pluginHookB"
|
|
|
|
|
|
class IndentAwarePlugin(events.Plugin):
|
|
|
|
def pluginHookA(self, event):
|
|
event.handled = True
|
|
return printhooks.INDENT.pop()
|
|
|
|
|
|
class TestPrintHooksPlugin(TestCase):
|
|
tags = ['unit']
|
|
|
|
def setUp(self):
|
|
self.err = sys.stderr
|
|
self.buf = six.StringIO()
|
|
sys.stderr = self.buf
|
|
self.addCleanup(self.restore_stderr)
|
|
|
|
self.session = session.Session()
|
|
self.print_hooks_plugin = printhooks.PrintHooks(session=self.session)
|
|
self.plugin_a = TestPluginA(session=self.session)
|
|
self.plugin_b = TestPluginB(session=self.session)
|
|
|
|
def restore_stderr(self):
|
|
sys.stderr = self.err
|
|
|
|
def test_traces_hooks_created_after_own_registration(self):
|
|
self.print_hooks_plugin.register()
|
|
self.plugin_a.register()
|
|
self.plugin_b.register()
|
|
|
|
event = CustomEvent('args')
|
|
result = self.session.hooks.pluginHookA(event)
|
|
self.assertEqual(result, "TestPluginB.pluginHookA")
|
|
self.assertEqual("\n"
|
|
"pluginHookA: "
|
|
"CustomEvent(handled=False, args='args')",
|
|
self.buf.getvalue())
|
|
|
|
def test_traces_hooks_created_before_own_registration(self):
|
|
self.plugin_a.register()
|
|
self.plugin_b.register()
|
|
self.print_hooks_plugin.register()
|
|
|
|
event = CustomEvent('args')
|
|
result = self.session.hooks.pluginHookA(event)
|
|
self.assertEqual(result, "TestPluginB.pluginHookA")
|
|
self.assertEqual("\n"
|
|
"pluginHookA: "
|
|
"CustomEvent(handled=False, args='args')",
|
|
self.buf.getvalue())
|
|
|
|
def test_traces_hooks_that_nobody_implements(self):
|
|
self.plugin_a.register()
|
|
self.print_hooks_plugin.register()
|
|
|
|
event = CustomEvent('args')
|
|
result = self.session.hooks.pluginHookA(event)
|
|
self.assertEqual(result, None)
|
|
self.assertEqual("\n"
|
|
"pluginHookA: "
|
|
"CustomEvent(handled=False, args='args')",
|
|
self.buf.getvalue())
|
|
|
|
def test_indents_nested_hooks_in_trace(self):
|
|
self.plugin_c = TestPluginC(session=self.session)
|
|
|
|
self.plugin_a.register_with_nested_hook()
|
|
self.plugin_c.register()
|
|
self.print_hooks_plugin.register()
|
|
|
|
event = CustomEvent('level_one_args')
|
|
result = self.session.hooks.pluginHookB(event)
|
|
self.assertEqual(result, "TestPluginC.pluginHookB")
|
|
self.assertEqual("\n"
|
|
"pluginHookB: "
|
|
"CustomEvent(handled=False, args='level_one_args')"
|
|
"\n "
|
|
"pluginHookB1: "
|
|
"CustomEvent(handled=False, args='level_two_args')",
|
|
self.buf.getvalue())
|
|
|
|
def test_hook_implementors_can_modify_trace_indent(self):
|
|
self.indent_aware_plugin = IndentAwarePlugin(session=self.session)
|
|
|
|
self.plugin_a.register()
|
|
self.indent_aware_plugin.register()
|
|
self.print_hooks_plugin.register()
|
|
|
|
event = CustomEvent('args')
|
|
result = self.session.hooks.pluginHookA(event)
|
|
self.assertEqual(result, " ")
|