def test_background_plotting_add_callback(qtbot): class CallBack(object): def __init__(self, sphere): self.sphere = sphere def __call__(self): self.sphere.points *= 0.5 plotter = BackgroundPlotter(show=False, off_screen=False, title='Testing Window') sphere = pyvista.Sphere() mycallback = CallBack(sphere) plotter.add_mesh(sphere) plotter.add_callback(mycallback, interval=200, count=3) # check that timers are set properly in add_callback() assert _hasattr(plotter, "app_window", MainWindow) assert _hasattr(plotter, "_callback_timer", QTimer) assert _hasattr(plotter, "counters", list) window = plotter.app_window # MainWindow callback_timer = plotter._callback_timer # QTimer counter = plotter.counters[-1] # Counter # ensure that the window is showed assert not window.isVisible() with qtbot.wait_exposed(window, timeout=500): window.show() assert window.isVisible() # ensure that self.callback_timer send a signal callback_blocker = qtbot.wait_signals([callback_timer.timeout], timeout=300) callback_blocker.wait() # ensure that self.counters send a signal counter_blocker = qtbot.wait_signals([counter.signal_finished], timeout=700) counter_blocker.wait() assert not callback_timer.isActive() # counter stops the callback plotter.add_callback(mycallback, interval=200) callback_timer = plotter._callback_timer # QTimer # ensure that self.callback_timer send a signal callback_blocker = qtbot.wait_signals([callback_timer.timeout], timeout=300) callback_blocker.wait() assert callback_timer.isActive() plotter.close() assert not callback_timer.isActive() # window stops the callback
def test_background_plotting_add_callback(qtbot, monkeypatch, plotting): class CallBack(object): def __init__(self, sphere): self.sphere = sphere def __call__(self): self.sphere.points *= 0.5 update_count = [0] orig_update_app_icon = BackgroundPlotter.update_app_icon def update_app_icon(slf): update_count[0] = update_count[0] + 1 return orig_update_app_icon(slf) monkeypatch.setattr(BackgroundPlotter, 'update_app_icon', update_app_icon) plotter = BackgroundPlotter( show=False, off_screen=False, title='Testing Window', update_app_icon=True, # also does add_callback ) assert plotter._last_update_time == -np.inf sphere = pyvista.Sphere() mycallback = CallBack(sphere) plotter.add_mesh(sphere) plotter.add_callback(mycallback, interval=200, count=3) # check that timers are set properly in add_callback() assert_hasattr(plotter, "app_window", MainWindow) assert_hasattr(plotter, "_callback_timer", QTimer) assert_hasattr(plotter, "counters", list) window = plotter.app_window # MainWindow callback_timer = plotter._callback_timer # QTimer counter = plotter.counters[-1] # Counter # ensure that the window is showed assert not window.isVisible() with qtbot.wait_exposed(window): window.show() assert window.isVisible() assert update_count[0] in [0, 1] # macOS sometimes updates (1) # don't check _last_update_time for non-inf-ness, won't be updated on Win plotter.update_app_icon() # the timer doesn't call it right away, so do it assert update_count[0] in [1, 2] plotter.update_app_icon() # should be a no-op assert update_count[0] in [2, 3] with pytest.raises(ValueError, match="ndarray with shape"): plotter.set_icon(0.) # Maybe someday manually setting "set_icon" should disable update_app_icon? # Strings also supported directly by QIcon plotter.set_icon(os.path.join( os.path.dirname(pyvistaqt.__file__), "data", "pyvista_logo_square.png")) # ensure that self.callback_timer send a signal callback_blocker = qtbot.wait_signals([callback_timer.timeout], timeout=300) callback_blocker.wait() # ensure that self.counters send a signal counter_blocker = qtbot.wait_signals([counter.signal_finished], timeout=700) counter_blocker.wait() assert not callback_timer.isActive() # counter stops the callback plotter.add_callback(mycallback, interval=200) callback_timer = plotter._callback_timer # QTimer # ensure that self.callback_timer send a signal callback_blocker = qtbot.wait_signals([callback_timer.timeout], timeout=300) callback_blocker.wait() assert callback_timer.isActive() plotter.close() assert not callback_timer.isActive() # window stops the callback