Source code for traitsui.testing.tester.tests.test_registry
# (C) Copyright 2004-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
import unittest
from traitsui.testing.tester.target_registry import (
TargetRegistry,
)
from traitsui.testing.tester.exceptions import (
InteractionNotSupported,
LocationNotSupported,
)
[docs]class TestInteractionRegistry(unittest.TestCase):
[docs] def test_registry_empty(self):
class SpecificTarget:
pass
class Action:
pass
registry = TargetRegistry()
with self.assertRaises(InteractionNotSupported) as exception_context:
registry._get_handler(SpecificTarget(), Action())
self.assertEqual(
str(exception_context.exception),
f"No handler is found for target {SpecificTarget!r} with "
f"interaction {Action!r}. Supported these: []",
)
[docs] def test_register_editor_with_action(self):
registry = TargetRegistry()
class SpecificEditor:
pass
class UserAction:
pass
def handler(wrapper, interaction):
pass
# when
registry.register_interaction(
target_class=SpecificEditor,
interaction_class=UserAction,
handler=handler,
)
# then
actual = registry._get_handler(SpecificEditor(), UserAction())
self.assertIs(actual, handler)
[docs] def test_get_interactions_supported(self):
registry = TargetRegistry()
class SpecificEditor:
pass
class UserAction:
pass
class UserAction2:
pass
def handler(wrapper, interaction):
pass
# when
registry.register_interaction(
target_class=SpecificEditor,
interaction_class=UserAction,
handler=handler,
)
registry.register_interaction(
target_class=SpecificEditor,
interaction_class=UserAction2,
handler=handler,
)
# then
self.assertEqual(
registry._get_interactions(SpecificEditor()),
{UserAction, UserAction2},
)
[docs] def test_action_not_supported_report_supported_action(self):
# Test raise InteractionNotSupported contains information about what
# actions are supported.
class SpecificEditor:
pass
class SpecificEditor2:
pass
class UserAction:
pass
class UserAction2:
pass
class UserAction3:
pass
def handler(wrapper, interaction):
pass
registry = TargetRegistry()
registry.register_interaction(SpecificEditor, UserAction, handler)
registry.register_interaction(SpecificEditor2, UserAction2, handler)
registry.register_interaction(SpecificEditor2, UserAction3, handler)
with self.assertRaises(InteractionNotSupported) as exception_context:
registry._get_handler(SpecificEditor2(), None)
self.assertIn(UserAction2, exception_context.exception.supported)
self.assertIn(UserAction3, exception_context.exception.supported)
self.assertNotIn(UserAction, exception_context.exception.supported)
[docs] def test_error_conflict(self):
# Test the same target + interaction type cannot be registered twice.
class SpecificEditor:
pass
class UserAction:
pass
def handler(wrapper, interaction):
pass
registry = TargetRegistry()
registry.register_interaction(SpecificEditor, UserAction, handler)
with self.assertRaises(ValueError):
registry.register_interaction(SpecificEditor, UserAction, handler)
[docs] def test_error_get_interaction_doc(self):
# The registry is empty
registry = TargetRegistry()
with self.assertRaises(InteractionNotSupported):
registry._get_interaction_doc(2.1, int)
[docs] def test_get_default_interaction_doc(self):
class Action:
"""Some action."""
pass
def handler(wrapper, interaction):
pass
registry = TargetRegistry()
registry.register_interaction(
target_class=float,
interaction_class=Action,
handler=handler,
)
actual = registry._get_interaction_doc(
target=21.2,
interaction_class=Action,
)
self.assertEqual(actual, "Some action.")
[docs]class TestLocationRegistry(unittest.TestCase):
[docs] def test_location_registry_empty(self):
class SpecificTarget:
pass
class Locator:
pass
registry = TargetRegistry()
with self.assertRaises(LocationNotSupported) as exception_context:
registry._get_solver(SpecificTarget(), Locator())
self.assertEqual(exception_context.exception.supported, [])
self.assertEqual(
str(exception_context.exception),
f"Location {Locator!r} is not supported for {SpecificTarget!r}. "
"Supported these: []",
)
[docs] def test_register_location(self):
def solver(wrapper, location):
return 1
registry = TargetRegistry()
registry.register_location(
target_class=float, locator_class=str, solver=solver
)
self.assertIs(registry._get_solver(2.1, "dummy"), solver)
[docs] def test_register_location_report_existing(self):
def solver(wrapper, location):
return 1
registry = TargetRegistry()
registry.register_location(
target_class=float, locator_class=str, solver=solver
)
with self.assertRaises(LocationNotSupported) as exception_context:
registry._get_solver(3.4, None)
self.assertEqual(exception_context.exception.supported, [str])
[docs] def test_get_locations_supported(self):
# Test _get_locations return the supported location types.
registry = TargetRegistry()
class SpecificEditor:
pass
class Locator1:
pass
class Locator2:
pass
def solver(wrapper, location):
return 1
# when
registry.register_location(
target_class=SpecificEditor,
locator_class=Locator1,
solver=solver,
)
registry.register_location(
target_class=SpecificEditor,
locator_class=Locator2,
solver=solver,
)
# then
self.assertEqual(
registry._get_locations(SpecificEditor()), {Locator1, Locator2}
)
[docs] def test_get_location_help_default(self):
class Locator:
"""Some default documentation."""
pass
registry = TargetRegistry()
registry.register_location(
target_class=float,
locator_class=Locator,
solver=lambda w, l: 1,
)
help_text = registry._get_location_doc(
target=2.345,
locator_class=Locator,
)
self.assertEqual(help_text, "Some default documentation.")
[docs] def test_error_get_interaction_doc(self):
# The registry is empty
registry = TargetRegistry()
with self.assertRaises(LocationNotSupported):
registry._get_location_doc(3.456, int)