def test_right_click_gives_context_menu_for_plot_without_fit_enabled( self, mocked_figure_type, mocked_qmenu_cls): fig_manager = self._create_mock_fig_manager_to_accept_right_click() fig_manager.fit_browser.tool = None interactor = FigureInteraction(fig_manager) mouse_event = self._create_mock_right_click() mocked_figure_type.return_value = FigureType.Line # Expect a call to QMenu() for the outer menu followed by two more calls # for the Axes and Normalization menus qmenu_call1 = MagicMock() qmenu_call2 = MagicMock() qmenu_call3 = MagicMock() mocked_qmenu_cls.side_effect = [qmenu_call1, qmenu_call2, qmenu_call3] with patch('workbench.plotting.figureinteraction.QActionGroup', autospec=True): with patch.object(interactor.toolbar_manager, 'is_tool_active', lambda: False): with patch.object(interactor.errors_manager, 'add_error_bars_menu', MagicMock()): interactor.on_mouse_button_press(mouse_event) self.assertEqual(0, qmenu_call1.addSeparator.call_count) self.assertEqual(0, qmenu_call1.addAction.call_count) expected_qmenu_calls = [ call(), call("Axes", qmenu_call1), call("Normalization", qmenu_call1) ] self.assertEqual(expected_qmenu_calls, mocked_qmenu_cls.call_args_list) # 4 actions in Axes submenu self.assertEqual(4, qmenu_call2.addAction.call_count) # 2 actions in Normalization submenu self.assertEqual(2, qmenu_call3.addAction.call_count)
def test_add_function(self, mock_view): dialog = AddFunctionDialog(view=mock_view) with patch.object(mock_view.ui.functionBox, 'currentText', lambda: "Gaussian"): with patch.object(mock_view, 'is_text_in_function_list', lambda x: True): dialog.action_add_function() mock_view.function_added.emit.assert_called_once_with( "Gaussian") self.assertEqual(1, dialog.view.accept.call_count)
def test_normalise_data_set_on_fit_menu_shown(self, normaliseData_mock): for normalised in [True, False]: ws_artist_mock = Mock(is_normalized=normalised, workspace_index=0) axes_mock = Mock(tracked_workspaces={'ws_name': [ws_artist_mock]}) property_browser = self._create_widget() with patch.object(property_browser, 'get_axes', lambda: axes_mock): with patch.object(property_browser, 'workspaceName', lambda: 'ws_name'): property_browser.getFitMenu().aboutToShow.emit() property_browser.normaliseData.assert_called_once_with(normalised) normaliseData_mock.reset_mock()
def test_destroy_doesnt_have_fig(self): with patch.object(GlobalFigureManager, 'has_fignum', return_value=False) as mock_has_fignum: num = 123123 GlobalFigureManager.destroy(num) mock_has_fignum.assert_called_once_with(num)
def test_curve_names_not_equal_in_curve_names_dict_if_curves_have_same_labels(self): line = self._get_no_errors_line() # Patch line in ax0 to have same label as the errorbar curve in the # same axes with patch.object(line, 'get_label', lambda: 'Workspace'): presenter = self._generate_presenter() self.assertSequenceEqual(['Workspace', 'Workspace (1)'], sorted(presenter.curve_names_dict.keys()))
def test_figure_visibility_changed(self): mock_figure_number = 99994 with patch.object(GlobalFigureManager, 'notify_observers', return_value=False) as mock_notify_observers: GlobalFigureManager.figure_visibility_changed(mock_figure_number) mock_notify_observers.assert_called_once_with( FigureAction.VisibilityChanged, mock_figure_number)
def test_figure_title_changed(self): mock_figure_number = 312312 with patch.object(GlobalFigureManager, 'notify_observers', return_value=False) as mock_notify_observers: GlobalFigureManager.figure_title_changed(mock_figure_number) mock_notify_observers.assert_called_once_with( FigureAction.Renamed, mock_figure_number)
def test_add_function_give_error_if_function_not_valid(self, mock_view): dialog = AddFunctionDialog(view=mock_view) with patch.object(mock_view, 'is_text_in_function_list', lambda x: False): dialog.action_add_function() self.assertEqual(1, dialog.view.set_error_message.call_count) self.assertEqual(0, mock_view.function_added.emit.call_count) self.assertEqual(0, dialog.view.accept.call_count)
def test_remove_selected_curve_removes_curve_from_curves_names_and_combo_box(self): self.ax2.plot([0], [0], label='new_line') mock_view = Mock(get_selected_ax_name=lambda: "(1, 0)", get_selected_curve_name=lambda: "new_line") presenter = self._generate_presenter(mock_view=mock_view) with patch.object(presenter, 'update_view', lambda: None): presenter.remove_selected_curve() self.assertNotIn('new_line', presenter.curve_names_dict) presenter.view.remove_select_curve_combo_box_selected_item.assert_called_once_with()
def _run_apply_properties_on_figure_with_image(): img_fig = figure() img_ax = img_fig.add_subplot(111) img_ax.imshow([[0, 1], [0, 1]], label='old label') presenter = PlotConfigDialogPresenter(img_fig, view=Mock()) with patch.object(presenter.tab_widget_presenters[1], 'update_view', lambda: None): presenter.apply_properties() return img_ax
def _run_apply_properties_on_figure_with_curve(): fig = figure() ax = fig.add_subplot(111) ax.errorbar([0, 1], [0, 1], yerr=[0.1, 0.2], label='old label') presenter = PlotConfigDialogPresenter(fig, view=Mock()) with patch.object(presenter.tab_widget_presenters[1], 'update_view', lambda: None): presenter.apply_properties() return ax
def test_launch_custom_cpp_gui_creates_interface_if_not_already_open( self, mock_find_window): mock_find_window.return_value = None interface_name = 'ISIS Reflectometry' with patch.object(self.main_window, 'interface_manager') as mock_interface_manager: self.main_window.launch_custom_cpp_gui(interface_name) mock_interface_manager.createSubWindow.assert_called_once_with( interface_name)
def test_normalise_data_set_to_false_for_distribution_workspace( self, normaliseData_mock): fig, canvas = self._create_and_plot_matrix_workspace('ws_name', distribution=True) property_browser = self._create_widget(canvas=canvas) with patch.object(property_browser, 'workspaceName', lambda: 'ws_name'): property_browser.getFitMenu().aboutToShow.emit() property_browser.normaliseData.assert_called_once_with(False)
def test_right_click_gives_marker_menu_when_hovering_over_one( self, mocked_figure_type, mocked_qmenu_cls): mouse_event = self._create_mock_right_click() mouse_event.inaxes.get_xlim.return_value = (1, 2) mouse_event.inaxes.get_ylim.return_value = (1, 2) mocked_figure_type.return_value = FigureType.Line marker1 = MagicMock() marker2 = MagicMock() marker3 = MagicMock() self.interactor.markers = [marker1, marker2, marker3] for marker in self.interactor.markers: marker.is_above.return_value = True # Expect a call to QMenu() for the outer menu followed by two more calls # for the Axes and Normalization menus qmenu_call1 = MagicMock() qmenu_call2 = MagicMock() qmenu_call3 = MagicMock() qmenu_call4 = MagicMock() mocked_qmenu_cls.side_effect = [ qmenu_call1, qmenu_call2, qmenu_call3, qmenu_call4 ] with patch('workbench.plotting.figureinteraction.QActionGroup', autospec=True): with patch.object(self.interactor.toolbar_manager, 'is_tool_active', lambda: False): with patch.object(self.interactor, 'add_error_bars_menu', MagicMock()): self.interactor.on_mouse_button_press(mouse_event) self.assertEqual(0, qmenu_call1.addSeparator.call_count) self.assertEqual(0, qmenu_call1.addAction.call_count) expected_qmenu_calls = [ call(), call(marker1.name, qmenu_call1), call(marker2.name, qmenu_call1), call(marker3.name, qmenu_call1) ] self.assertEqual(expected_qmenu_calls, mocked_qmenu_cls.call_args_list) # 2 Actions in marker menu self.assertEqual(2, qmenu_call2.addAction.call_count) self.assertEqual(2, qmenu_call3.addAction.call_count) self.assertEqual(2, qmenu_call4.addAction.call_count)
def _run_apply_properties_on_figure_with_legend(): fig = figure() ax = fig.add_subplot(111) ax.plot([1, 2, 3], label='old label') legend = ax.legend() legend.get_frame().set_alpha(0.5) presenter = PlotConfigDialogPresenter(fig, view=Mock()) with patch.object(presenter.tab_widget_presenters[1], 'update_view', lambda: None): presenter.apply_properties() return ax
def test_right_click_gives_no_context_menu_for_empty_figure( self, mocked_figure_type, mocked_qmenu): fig_manager = self._create_mock_fig_manager_to_accept_right_click() interactor = FigureInteraction(fig_manager) mouse_event = self._create_mock_right_click() mocked_figure_type.return_value = FigureType.Empty with patch.object(interactor.toolbar_manager, 'is_tool_active', lambda: False): interactor.on_mouse_button_press(mouse_event) self.assertEqual(0, mocked_qmenu.call_count)
def _run_check_axes_distribution_consistency(self, normalization_states): mock_tracked_workspaces = { 'ws': [ Mock(is_normalized=normalization_states[0]), Mock(is_normalized=normalization_states[1]) ], 'ws1': [Mock(is_normalized=normalization_states[2])] } with patch('mantid.kernel.logger.warning', Mock()) as mock_logger: with patch.object(self.ax, 'tracked_workspaces', mock_tracked_workspaces): self.ax.check_axes_distribution_consistency() return mock_logger
def test_different_interfaces_simultaneously_created( self, mock_find_window): mock_find_window.return_value = None interface_name = 'Data Reduction' second_interface_name = 'Settings' with patch.object(self.main_window, 'interface_manager') as mock_interface_manager: self.main_window.launch_custom_cpp_gui(interface_name) mock_interface_manager.createSubWindow.assert_called_with( interface_name) self.main_window.launch_custom_cpp_gui(second_interface_name) mock_interface_manager.createSubWindow.assert_called_with( second_interface_name)
def test_axes_removed_from_axes_names_dict_when_all_curves_removed(self): fig = figure() ax0 = fig.add_subplot(211) ax0.set_title("First Axes") ax1 = fig.add_subplot(212) ax1.set_title("Second Axes") ax0.plot([0, 1], [0, 1], label='ax0 curve') ax1.plot([0], [0], label='ax1 curve') mock_view = Mock(get_selected_ax_name=lambda: "First Axes: (0, 0)", get_selected_curve_name=lambda: "ax0 curve") presenter = self._generate_presenter(fig=fig, mock_view=mock_view) with patch.object(presenter, 'update_view', lambda: None): presenter.remove_selected_curve() self.assertNotIn('First Axes', presenter.axes_names_dict) self.assertNotIn("ax0 curve", presenter.curve_names_dict)
def test_destroy(self, mock_gc_collect): num = 0 mock_manager = MockFigureManager(num) GlobalFigureManager.set_active(mock_manager) self.assertEqual(1, len(GlobalFigureManager._activeQue)) self.assertEqual(1, len(GlobalFigureManager.figs)) with patch.object(GlobalFigureManager, 'notify_observers') as mock_notify_observers: GlobalFigureManager.destroy(num) self.assertEqual(0, len(GlobalFigureManager._activeQue)) self.assertEqual(0, len(GlobalFigureManager.figs)) mock_gc_collect.assert_called_once_with(1) mock_notify_observers.assert_has_calls([ call(FigureAction.Closed, num), call(FigureAction.OrderChanged, -1) ])
def test_right_click_gives_context_menu_for_color_plot( self, mocked_figure_type, mocked_qmenu): fig_manager = self._create_mock_fig_manager_to_accept_right_click() interactor = FigureInteraction(fig_manager) mouse_event = self._create_mock_right_click() mocked_figure_type.return_value = FigureType.Image # Expect a call to QMenu() for the outer menu followed by three more calls # for the Axes, Normalization and Colorbar menus qmenu_call1 = MagicMock() qmenu_call2 = MagicMock() qmenu_call3 = MagicMock() qmenu_call4 = MagicMock() mocked_qmenu.side_effect = [ qmenu_call1, qmenu_call2, qmenu_call3, qmenu_call4 ] with patch('workbench.plotting.figureinteraction.QActionGroup', autospec=True): with patch.object(interactor.toolbar_manager, 'is_tool_active', lambda: False): interactor.on_mouse_button_press(mouse_event) self.assertEqual(0, qmenu_call1.addAction.call_count) expected_qmenu_calls = [ call(), call("Axes", qmenu_call1), call("Normalization", qmenu_call1), call("Color bar", qmenu_call1) ] self.assertEqual(expected_qmenu_calls, mocked_qmenu.call_args_list) # 4 actions in Axes submenu self.assertEqual(4, qmenu_call2.addAction.call_count) # 2 actions in Normalization submenu self.assertEqual(2, qmenu_call3.addAction.call_count) # 2 actions in Colorbar submenu self.assertEqual(2, qmenu_call4.addAction.call_count)
def test_curves_with__no_legend__label_not_in_curves_name_dict(self): line = self.fig.get_axes()[0].get_lines()[1] with patch.object(line, 'get_label', lambda: '_nolegend_'): presenter = self._generate_presenter() self.assertNotIn(line, presenter.curve_names_dict.values())
def test_font_dialog_signals(self): presenter = GeneralSettings(None) with patch.object(presenter.view, 'create_font_dialog', MagicMock()) as font_dialog: presenter.action_main_font_button_clicked() self.assertEqual(1, font_dialog().fontSelected.connect.call_count)