Source code for traitsui.testing.tests.test_exception_handling

# (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!

""" Tests for traitsui.testing._exception_handling """

import unittest

from pyface.api import GUI

from traitsui.tests._tools import (
    requires_toolkit,
    ToolkitName,
)
from traitsui.testing._exception_handling import reraise_exceptions


[docs]class TestExceptionHandling(unittest.TestCase):
[docs] @requires_toolkit([ToolkitName.qt, ToolkitName.wx]) def test_error_from_gui_captured_and_raise(self): def raise_error_1(): raise ZeroDivisionError() def raise_error_2(): raise IndexError() # without the context manager: # - with Qt5, the test run will be aborted prematurely. # - with Qt4, the traceback is printed and the test passes. # - with Wx, the traceback is printed and the test passes. # With the context manager, the exception is always reraised. gui = GUI() with self.assertRaises( RuntimeError ) as exception_context, self.assertLogs("traitsui") as watcher: with reraise_exceptions(): gui.invoke_later(raise_error_1) gui.invoke_later(raise_error_2) gui.invoke_after(100, gui.stop_event_loop) gui.start_event_loop() error_msg = str(exception_context.exception) self.assertIn("ZeroDivisionError", error_msg) self.assertIn("IndexError", error_msg) log_content1, log_content2 = watcher.output self.assertIn("ZeroDivisionError", log_content1) self.assertIn("IndexError", log_content2)