Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 29 additions & 6 deletions mne/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,17 +192,40 @@ def backend_name(request):
def renderer(backend_name):
"""Yield the 3D backends."""
from mne.viz.backends.renderer import _use_test_3d_backend
_check_skip_backend(backend_name)
with _use_test_3d_backend(backend_name):
from mne.viz.backends import renderer
yield renderer
renderer._close_all()


@pytest.fixture(scope="module", params=[
"pyvista",
])
def backend_name_interactive(request):
"""Get the backend name."""
yield request.param


@pytest.yield_fixture
def renderer_interactive(backend_name_interactive):
"""Yield the 3D backends."""
from mne.viz.backends.renderer import _use_test_3d_backend
_check_skip_backend(backend_name_interactive)
with _use_test_3d_backend(backend_name_interactive, interactive=True):
from mne.viz.backends import renderer
yield renderer
renderer._close_all()


def _check_skip_backend(name):
from mne.viz.backends.tests._utils import has_mayavi, has_pyvista
if backend_name == 'mayavi':
if name == 'mayavi':
if not has_mayavi():
pytest.skip("Test skipped, requires mayavi.")
elif backend_name == 'pyvista':
elif name == 'pyvista':
if not has_pyvista():
pytest.skip("Test skipped, requires pyvista.")
with _use_test_3d_backend(backend_name):
from mne.viz.backends import renderer
yield renderer
renderer._close_all()


@pytest.fixture(scope='function', params=[testing._pytest_param()])
Expand Down
15 changes: 1 addition & 14 deletions mne/viz/_brain/tests/test_brain.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,18 +137,8 @@ def test_brain_add_text(renderer):


@testing.requires_testing_data
def test_brain_timeviewer(renderer):
def test_brain_timeviewer(renderer_interactive):
"""Test _TimeViewer primitives."""
if renderer.get_3d_backend() == "mayavi":
pytest.skip() # Skip PySurfer.TimeViewer
elif renderer.get_3d_backend() == "pyvista":
# Widgets are not available offscreen
import pyvista
orig_offscreen = pyvista.OFF_SCREEN
pyvista.OFF_SCREEN = False
# Disable testing to allow interactive window
renderer.MNE_3D_BACKEND_TESTING = False

sample_src = read_source_spaces(src_fname)

# dense version
Expand Down Expand Up @@ -195,9 +185,6 @@ def test_brain_timeviewer(renderer):
link_viewer.set_playback_speed(value=0.1)
link_viewer.toggle_playback()

if renderer.get_3d_backend() == "pyvista":
pyvista.OFF_SCREEN = orig_offscreen


def test_brain_colormap():
"""Test brain's colormap functions."""
Expand Down
2 changes: 1 addition & 1 deletion mne/viz/backends/_pysurfer_mayavi.py
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ def _take_3d_screenshot(figure, mode='rgb', filename=None):


@contextmanager
def _testing_context():
def _testing_context(interactive):
mlab = _import_mlab()
orig_backend = mlab.options.backend
mlab.options.backend = 'test'
Expand Down
16 changes: 11 additions & 5 deletions mne/viz/backends/_pyvista.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=DeprecationWarning)
import pyvista
from pyvista import (Plotter, BackgroundPlotter, PolyData,
Line, close_all, UnstructuredGrid)
from pyvista.utilities import try_callback
Expand Down Expand Up @@ -114,7 +115,6 @@ class _Renderer(_BaseRenderer):

def __init__(self, fig=None, size=(600, 600), bgcolor='black',
name="PyVista Scene", show=False, shape=(1, 1)):
from pyvista import OFF_SCREEN
from .renderer import MNE_3D_BACKEND_TESTING
figure = _Figure(title=name, size=size, shape=shape,
background_color=bgcolor, notebook=None)
Expand All @@ -133,7 +133,7 @@ def __init__(self, fig=None, size=(600, 600), bgcolor='black',
self.figure = fig

# Enable off_screen if sphinx-gallery or testing
if OFF_SCREEN:
if pyvista.OFF_SCREEN:
self.figure.store['off_screen'] = True

with warnings.catch_warnings():
Expand Down Expand Up @@ -615,11 +615,17 @@ def _the_callback(widget, event):


@contextmanager
def _testing_context():
import pyvista
def _testing_context(interactive):
from . import renderer
orig_offscreen = pyvista.OFF_SCREEN
pyvista.OFF_SCREEN = True
orig_testing = renderer.MNE_3D_BACKEND_TESTING
if interactive:
pyvista.OFF_SCREEN = False
renderer.MNE_3D_BACKEND_TESTING = False
else:
pyvista.OFF_SCREEN = True
try:
yield
finally:
pyvista.OFF_SCREEN = orig_offscreen
renderer.MNE_3D_BACKEND_TESTING = orig_testing
6 changes: 4 additions & 2 deletions mne/viz/backends/renderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,20 +159,22 @@ def use_3d_backend(backend_name):


@contextmanager
def _use_test_3d_backend(backend_name):
def _use_test_3d_backend(backend_name, interactive=False):
"""Create a testing viz context.

Parameters
----------
backend_name : str
The 3d backend to use in the context.
interactive : bool
If True, ensure interactive elements are accessible.
"""
global MNE_3D_BACKEND_TESTING
orig_testing = MNE_3D_BACKEND_TESTING
MNE_3D_BACKEND_TESTING = True
try:
with use_3d_backend(backend_name):
with _testing_context(): # noqa: F821
with _testing_context(interactive): # noqa: F821
yield
finally:
MNE_3D_BACKEND_TESTING = orig_testing
Expand Down
14 changes: 1 addition & 13 deletions mne/viz/tests/test_3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -668,17 +668,8 @@ def test_mixed_sources_plot_surface():

@testing.requires_testing_data
@traits_test
def test_link_brains(renderer):
def test_link_brains(renderer_interactive):
"""Test plotting linked brains."""
if renderer.get_3d_backend() == "mayavi":
pytest.skip() # Skip PySurfer.TimeViewer
elif renderer.get_3d_backend() == "pyvista":
# Widgets are not available offscreen
import pyvista
orig_offscreen = pyvista.OFF_SCREEN
pyvista.OFF_SCREEN = False
# Disable testing to allow interactive window
renderer.MNE_3D_BACKEND_TESTING = False
with pytest.raises(ValueError, match='is empty'):
link_brains([])
with pytest.raises(TypeError, match='type is Brain'):
Expand All @@ -704,8 +695,5 @@ def test_link_brains(renderer):
)
link_brains(brain)

if renderer.get_3d_backend() == "pyvista":
pyvista.OFF_SCREEN = orig_offscreen


run_tests_if_main()