Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 43b5894

Browse files
committed
TST: Defer loading Qt framework until test is run.
If Qt4 and Qt5 are both available, then `test_backend_qt4.py` will force the loading of the Qt4 framework. If the user selected Qt5 tests only, they will not be able to run even though the Qt4 tests never ran either.
1 parent 70a55db commit 43b5894

File tree

2 files changed

+112
-56
lines changed

2 files changed

+112
-56
lines changed

lib/matplotlib/tests/test_backend_qt4.py

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,59 @@
77

88
import pytest
99

10-
try:
11-
import PyQt4
12-
except (ImportError, RuntimeError): # RuntimeError if PyQt5 already imported.
10+
11+
@pytest.fixture(autouse=True)
12+
def qt4_module():
13+
try:
14+
import PyQt4
15+
# RuntimeError if PyQt5 already imported.
16+
except (ImportError, RuntimeError):
17+
try:
18+
import PySide
19+
except ImportError:
20+
pytest.skip("Failed to import a Qt4 binding.")
21+
22+
qt_compat = pytest.importorskip('matplotlib.backends.qt_compat')
23+
QtCore = qt_compat.QtCore
24+
1325
try:
14-
import PySide
15-
except ImportError:
16-
pytestmark = pytest.mark.skip("Failed to import a Qt4 binding.")
26+
py_qt_ver = int(QtCore.PYQT_VERSION_STR.split('.')[0])
27+
except AttributeError:
28+
py_qt_ver = QtCore.__version_info__[0]
29+
30+
if py_qt_ver != 4:
31+
pytest.skip(reason='Qt4 is not available')
32+
33+
from matplotlib.backends.backend_qt4 import (
34+
MODIFIER_KEYS, SUPER, ALT, CTRL, SHIFT) # noqa
35+
36+
mods = {}
37+
keys = {}
38+
for name, index in zip(['Alt', 'Control', 'Shift', 'Super'],
39+
[ALT, CTRL, SHIFT, SUPER]):
40+
_, mod, key = MODIFIER_KEYS[index]
41+
mods[name + 'Modifier'] = mod
42+
keys[name + 'Key'] = key
1743

18-
qt_compat = pytest.importorskip('matplotlib.backends.qt_compat')
19-
QtCore = qt_compat.QtCore
44+
return QtCore, mods, keys
2045

21-
from matplotlib.backends.backend_qt4 import (
22-
MODIFIER_KEYS, SUPER, ALT, CTRL, SHIFT) # noqa
2346

24-
_, ControlModifier, ControlKey = MODIFIER_KEYS[CTRL]
25-
_, AltModifier, AltKey = MODIFIER_KEYS[ALT]
26-
_, SuperModifier, SuperKey = MODIFIER_KEYS[SUPER]
27-
_, ShiftModifier, ShiftKey = MODIFIER_KEYS[SHIFT]
47+
@pytest.fixture
48+
def qt_key(request):
49+
QtCore, _, keys = request.getfixturevalue('qt4_module')
50+
if request.param.startswith('Key'):
51+
return getattr(QtCore.Qt, request.param)
52+
else:
53+
return keys[request.param]
2854

29-
try:
30-
py_qt_ver = int(QtCore.PYQT_VERSION_STR.split('.')[0])
31-
except AttributeError:
32-
py_qt_ver = QtCore.__version_info__[0]
3355

34-
if py_qt_ver != 4:
35-
pytestmark = pytest.mark.skipif(reason='Qt4 is not available')
56+
@pytest.fixture
57+
def qt_mods(request):
58+
QtCore, mods, _ = request.getfixturevalue('qt4_module')
59+
result = QtCore.Qt.NoModifier
60+
for mod in request.param:
61+
result |= mods[mod]
62+
return result
3663

3764

3865
@pytest.mark.backend('Qt4Agg')
@@ -55,21 +82,22 @@ def test_fig_close():
5582
@pytest.mark.parametrize(
5683
'qt_key, qt_mods, answer',
5784
[
58-
(QtCore.Qt.Key_A, ShiftModifier, 'A'),
59-
(QtCore.Qt.Key_A, QtCore.Qt.NoModifier, 'a'),
60-
(QtCore.Qt.Key_A, ControlModifier, 'ctrl+a'),
61-
(QtCore.Qt.Key_Aacute, ShiftModifier,
85+
('Key_A', ['ShiftModifier'], 'A'),
86+
('Key_A', [], 'a'),
87+
('Key_A', ['ControlModifier'], 'ctrl+a'),
88+
('Key_Aacute', ['ShiftModifier'],
6289
'\N{LATIN CAPITAL LETTER A WITH ACUTE}'),
63-
(QtCore.Qt.Key_Aacute, QtCore.Qt.NoModifier,
90+
('Key_Aacute', [],
6491
'\N{LATIN SMALL LETTER A WITH ACUTE}'),
65-
(ControlKey, AltModifier, 'alt+control'),
66-
(AltKey, ControlModifier, 'ctrl+alt'),
67-
(QtCore.Qt.Key_Aacute, (ControlModifier | AltModifier | SuperModifier),
92+
('ControlKey', ['AltModifier'], 'alt+control'),
93+
('AltKey', ['ControlModifier'], 'ctrl+alt'),
94+
('Key_Aacute', ['ControlModifier', 'AltModifier', 'SuperModifier'],
6895
'ctrl+alt+super+\N{LATIN SMALL LETTER A WITH ACUTE}'),
69-
(QtCore.Qt.Key_Backspace, QtCore.Qt.NoModifier, 'backspace'),
70-
(QtCore.Qt.Key_Backspace, ControlModifier, 'ctrl+backspace'),
71-
(QtCore.Qt.Key_Play, QtCore.Qt.NoModifier, None),
96+
('Key_Backspace', [], 'backspace'),
97+
('Key_Backspace', ['ControlModifier'], 'ctrl+backspace'),
98+
('Key_Play', [], None),
7299
],
100+
indirect=['qt_key', 'qt_mods'],
73101
ids=[
74102
'shift',
75103
'lower',

lib/matplotlib/tests/test_backend_qt5.py

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,51 @@
77

88
import pytest
99

10-
try:
11-
import PyQt5
12-
except (ImportError, RuntimeError): # RuntimeError if PyQt4 already imported.
10+
11+
@pytest.fixture(autouse=True)
12+
def qt5_module():
1313
try:
14-
import PySide2
15-
except ImportError:
16-
pytestmark = pytest.mark.skip("Failed to import a Qt5 binding.")
14+
import PyQt5
15+
# RuntimeError if PyQt4 already imported.
16+
except (ImportError, RuntimeError):
17+
try:
18+
import PySide2
19+
except ImportError:
20+
pytest.skip("Failed to import a Qt5 binding.")
21+
22+
qt_compat = pytest.importorskip('matplotlib.backends.qt_compat')
23+
QtCore = qt_compat.QtCore
24+
25+
from matplotlib.backends.backend_qt5 import (
26+
MODIFIER_KEYS, SUPER, ALT, CTRL, SHIFT) # noqa
27+
28+
mods = {}
29+
keys = {}
30+
for name, index in zip(['Alt', 'Control', 'Shift', 'Super'],
31+
[ALT, CTRL, SHIFT, SUPER]):
32+
_, mod, key = MODIFIER_KEYS[index]
33+
mods[name + 'Modifier'] = mod
34+
keys[name + 'Key'] = key
35+
36+
return QtCore, mods, keys
37+
1738

18-
qt_compat = pytest.importorskip('matplotlib.backends.qt_compat')
19-
QtCore = qt_compat.QtCore
39+
@pytest.fixture
40+
def qt_key(request):
41+
QtCore, _, keys = request.getfixturevalue('qt5_module')
42+
if request.param.startswith('Key'):
43+
return getattr(QtCore.Qt, request.param)
44+
else:
45+
return keys[request.param]
2046

21-
from matplotlib.backends.backend_qt5 import (
22-
MODIFIER_KEYS, SUPER, ALT, CTRL, SHIFT) # noqa
2347

24-
_, ControlModifier, ControlKey = MODIFIER_KEYS[CTRL]
25-
_, AltModifier, AltKey = MODIFIER_KEYS[ALT]
26-
_, SuperModifier, SuperKey = MODIFIER_KEYS[SUPER]
27-
_, ShiftModifier, ShiftKey = MODIFIER_KEYS[SHIFT]
48+
@pytest.fixture
49+
def qt_mods(request):
50+
QtCore, mods, _ = request.getfixturevalue('qt5_module')
51+
result = QtCore.Qt.NoModifier
52+
for mod in request.param:
53+
result |= mods[mod]
54+
return result
2855

2956

3057
@pytest.mark.backend('Qt5Agg')
@@ -47,21 +74,22 @@ def test_fig_close():
4774
@pytest.mark.parametrize(
4875
'qt_key, qt_mods, answer',
4976
[
50-
(QtCore.Qt.Key_A, ShiftModifier, 'A'),
51-
(QtCore.Qt.Key_A, QtCore.Qt.NoModifier, 'a'),
52-
(QtCore.Qt.Key_A, ControlModifier, 'ctrl+a'),
53-
(QtCore.Qt.Key_Aacute, ShiftModifier,
77+
('Key_A', ['ShiftModifier'], 'A'),
78+
('Key_A', [], 'a'),
79+
('Key_A', ['ControlModifier'], 'ctrl+a'),
80+
('Key_Aacute', ['ShiftModifier'],
5481
'\N{LATIN CAPITAL LETTER A WITH ACUTE}'),
55-
(QtCore.Qt.Key_Aacute, QtCore.Qt.NoModifier,
82+
('Key_Aacute', [],
5683
'\N{LATIN SMALL LETTER A WITH ACUTE}'),
57-
(ControlKey, AltModifier, 'alt+control'),
58-
(AltKey, ControlModifier, 'ctrl+alt'),
59-
(QtCore.Qt.Key_Aacute, (ControlModifier | AltModifier | SuperModifier),
84+
('ControlKey', ['AltModifier'], 'alt+control'),
85+
('AltKey', ['ControlModifier'], 'ctrl+alt'),
86+
('Key_Aacute', ['ControlModifier', 'AltModifier', 'SuperModifier'],
6087
'ctrl+alt+super+\N{LATIN SMALL LETTER A WITH ACUTE}'),
61-
(QtCore.Qt.Key_Backspace, QtCore.Qt.NoModifier, 'backspace'),
62-
(QtCore.Qt.Key_Backspace, ControlModifier, 'ctrl+backspace'),
63-
(QtCore.Qt.Key_Play, QtCore.Qt.NoModifier, None),
88+
('Key_Backspace', [], 'backspace'),
89+
('Key_Backspace', ['ControlModifier'], 'ctrl+backspace'),
90+
('Key_Play', [], None),
6491
],
92+
indirect=['qt_key', 'qt_mods'],
6593
ids=[
6694
'shift',
6795
'lower',

0 commit comments

Comments
 (0)