def lsp_codeeditor(lsp_manager, qtbot_module, request): """CodeEditor instance with LSP services activated.""" # Create a CodeEditor instance editor = CodeEditor(parent=None) editor.setup_editor(language='Python', tab_mode=False, markers=True, close_quotes=True, close_parentheses=True, color_scheme='spyder/dark', font=QFont("Monospace", 10)) editor.resize(640, 480) qtbot_module.addWidget(editor) editor.show() # Redirect editor LSP requests to lsp_manager editor.sig_perform_lsp_request.connect(lsp_manager.send_request) editor.filename = 'test.py' editor.language = 'Python' lsp_manager.register_file('python', 'test.py', editor) server_settings = lsp_manager.main.editor.lsp_editor_settings['python'] editor.start_lsp_services(server_settings) with qtbot_module.waitSignal(editor.lsp_response_signal, timeout=30000): editor.document_did_open() def teardown(): editor.hide() editor.completion_widget.hide() request.addfinalizer(teardown) return editor, lsp_manager
def lsp_codeeditor(lsp_manager, qtbot_module, request): """CodeEditor instance with LSP services activated.""" # Create a CodeEditor instance editor = CodeEditor(parent=None) editor.setup_editor(language='Python', tab_mode=False, markers=True, color_scheme='spyder/dark', font=QFont("Monospace", 10)) editor.resize(640, 480) qtbot_module.addWidget(editor) editor.show() # Redirect editor LSP requests to lsp_manager editor.sig_perform_lsp_request.connect(lsp_manager.send_request) editor.filename = 'test.py' editor.language = 'Python' lsp_manager.register_file('python', 'test.py', editor) server_settings = lsp_manager.main.editor.lsp_editor_settings['python'] editor.start_lsp_services(server_settings) with qtbot_module.waitSignal(editor.lsp_response_signal, timeout=30000): editor.document_did_open() def teardown(): editor.hide() editor.completion_widget.hide() request.addfinalizer(teardown) return editor, lsp_manager
def construct_editor(qtbot): """Construct editor for testing decorations.""" editor = CodeEditor(parent=None) editor.setup_editor( language='Python', color_scheme='spyder/dark', font=QFont("Monospace", 10), ) editor.resize(640, 480) editor.show() qtbot.addWidget(editor) return editor
def codeeditor(qtbot): widget = CodeEditor(None) widget.setup_editor(linenumbers=True, markers=True, tab_mode=False, font=QFont("Courier New", 10), show_blanks=True, color_scheme='spyder/dark', scroll_past_end=True) widget.setup_editor(language='Python') widget.resize(640, 480) widget.show() yield widget widget.close()
def lsp_codeeditor(qtbot): """CodeEditor instance with LSP services activated.""" # Activate pycodestyle and pydocstyle CONF.set('lsp-server', 'pycodestyle', True) CONF.set('lsp-server', 'pydocstyle', True) # Tell CodeEditor to use introspection os.environ['SPY_TEST_USE_INTROSPECTION'] = 'True' # Create an LSPManager instance to be able to start an LSP client lsp_manager = LSPManager(parent=None) # Create a CodeEditor instance editor = CodeEditor(parent=None) editor.setup_editor(language='Python', tab_mode=False, markers=True, color_scheme='spyder/dark', font=QFont("Monospace", 10)) editor.resize(640, 480) qtbot.addWidget(editor) editor.show() # Redirect editor LSP requests to lsp_manager editor.sig_perform_lsp_request.connect(lsp_manager.send_request) # Create wrapper lsp_wrapper = LSPWrapper(editor, lsp_manager) # Start LSP Python client with qtbot.waitSignal(lsp_wrapper.sig_lsp_services_started, timeout=30000): editor.filename = 'test.py' editor.language = 'Python' lsp_manager.start_client('python') python_client = lsp_manager.clients['python']['instance'] python_client.sig_initialize.connect(lsp_wrapper.start_lsp_services) # Send a textDocument/didOpen request to the server with qtbot.waitSignal(editor.lsp_response_signal, timeout=30000): editor.document_did_open() yield editor # Tear down operations os.environ['SPY_TEST_USE_INTROSPECTION'] = 'False' CONF.set('lsp-server', 'pycodestyle', False) CONF.set('lsp-server', 'pydocstyle', False) lsp_manager.shutdown()
def test_update_decorations_when_scrolling(qtbot): """ Test how many calls we're doing to update decorations when scrolling. """ # NOTE: Here we need to use `patch` from unittest.mock, instead of the # mocker fixture, to have the same results when running the test # alone and with the other tests in this file. patched_object = ('spyder.plugins.editor.utils.decoration.' 'TextDecorationsManager._update') with patch(patched_object) as _update: # NOTE: We can't use a fixture to build a CodeEditor instance here # because the testing results are not consistent. editor = CodeEditor(parent=None) editor.setup_editor( language='Python', color_scheme='spyder/dark', font=QFont("Monospace", 10), ) editor.resize(640, 480) editor.show() qtbot.addWidget(editor) # If there's no waiting after CodeEditor is created, there shouldn't # be a call to _update. assert _update.call_count == 0 with open(osp.join(PARENT, 'codeeditor.py'), 'r') as f: text = f.read() editor.set_text(text) # If there's no waiting after setting text, there shouldn't be a # call to _update either. assert _update.call_count == 0 # Simulate scrolling scrollbar = editor.verticalScrollBar() for i in range(6): scrollbar.setValue(i * 70) qtbot.wait(100) # A new call is done here due to __cursor_position_changed being # called, which in turn calls highlight_current_cell and # highlight_current_line assert _update.call_count == 1 # Wait for decorations to update qtbot.wait(editor.UPDATE_DECORATIONS_TIMEOUT + 100) # Assert a new call to _update was done assert _update.call_count == 2 # Simulate grabbing and moving the scrollbar with the mouse scrollbar = editor.verticalScrollBar() value = scrollbar.value() for __ in range(400): scrollbar.setValue(value + 1) value = scrollbar.value() # No calls should be done after this. assert _update.call_count == 2 # Wait for decorations to update qtbot.wait(editor.UPDATE_DECORATIONS_TIMEOUT + 100) # Assert a new call to _update was done assert _update.call_count == 3 # Move to the last visible line _, last = editor.get_visible_block_numbers() editor.go_to_line(last) # Simulate continuously pressing the down arrow key. for __ in range(200): qtbot.keyPress(editor, Qt.Key_Down) if sys.platform.startswith('linux'): qtbot.wait(5) # Only one call to _update should be done, after releasing the key. qtbot.wait(editor.UPDATE_DECORATIONS_TIMEOUT + 100) assert _update.call_count == 4 # Simulate continuously pressing the up arrow key. for __ in range(200): qtbot.keyPress(editor, Qt.Key_Up) if sys.platform.startswith('linux'): qtbot.wait(5) # Only one call to _update should be done, after releasing the key. qtbot.wait(editor.UPDATE_DECORATIONS_TIMEOUT + 100) assert _update.call_count == 5