1 import os 2 import importlib 3 4 import pytest 5 6 from IPython.terminal.pt_inputhooks import set_qt_api, get_inputhook_name_and_func 7 8 9 guis_avail = [] 10 11 12 def _get_qt_vers(): 13 """If any version of Qt is available, this will populate `guis_avail` with 'qt' and 'qtx'. Due 14 to the import mechanism, we can't import multiple versions of Qt in one session.""" 15 for gui in ["qt", "qt6", "qt5"]: 16 print(f"Trying {gui}") 17 try: 18 set_qt_api(gui) 19 importlib.import_module("IPython.terminal.pt_inputhooks.qt") 20 guis_avail.append(gui) 21 if "QT_API" in os.environ.keys(): 22 del os.environ["QT_API"] 23 except ImportError: 24 pass # that version of Qt isn't available. 25 except RuntimeError: 26 pass # the version of IPython doesn't know what to do with this Qt version. 27 28 29 _get_qt_vers() 30 31 32 @pytest.mark.skipif( 33 len(guis_avail) == 0, reason="No viable version of PyQt or PySide installed." 34 ) 35 def test_inputhook_qt(): 36 # Choose the "best" Qt version. 37 gui_ret, _ = get_inputhook_name_and_func("qt") 38 39 assert gui_ret != "qt" # you get back the specific version that was loaded. 40 assert gui_ret in guis_avail 41 42 if len(guis_avail) > 2: 43 # ...and now we're stuck with this version of Qt for good; can't switch. 44 for not_gui in ["qt6", "qt5"]: 45 if not_gui != gui_ret: 46 break 47 # Try to import the other gui; it won't work. 48 gui_ret2, _ = get_inputhook_name_and_func(not_gui) 49 assert gui_ret2 == gui_ret 50 assert gui_ret2 != not_gui 51