def test_signature_help_integrated( language_server_io: ILanguageServerClient, ws_root_path, data_regression ): from robocorp_ls_core.workspace import Document language_server = language_server_io language_server.initialize(ws_root_path, process_id=os.getpid()) uri = "untitled:Untitled-1" txt = """ *** Test Cases *** Log It Log """ doc = Document("", txt) language_server.open_doc(uri, 1, txt) line, col = doc.get_last_line_col() ret = language_server.request_signature_help(uri, line, col) result = ret["result"] signatures = result["signatures"] # Don't check the signature documentation in the data regression so that the # test doesn't become brittle. docs = signatures[0].pop("documentation") assert "Log" in docs data_regression.check(result)
def test_variables_completions_integrated( language_server_tcp: ILanguageServerClient, ws_root_path, data_regression ): from robocorp_ls_core.workspace import Document language_server = language_server_tcp language_server.initialize(ws_root_path, process_id=os.getpid()) uri = "untitled:Untitled-1" language_server.open_doc(uri, 1) contents = """ *** Variables *** ${NAME} Robot Framework ${VERSION} 2.0 ${ROBOT} ${NAME} ${VERSION} *** Test Cases *** List Variable Log ${NAME} Should Contain ${""" language_server.change_doc(uri, 2, contents) doc = Document("", source=contents) line, col = doc.get_last_line_col() completions = language_server.get_completions(uri, line, col) del completions["id"] data_regression.check(completions, "variable_completions") # Note: for libraries, if we found it, we keep it in memory (so, even though # we removed the entry, it'll still be accessible). language_server_tcp.settings({"settings": {"robot": {"variables": {"myvar1": 10}}}}) completions = language_server.get_completions(uri, line, col) labels = [x["label"] for x in completions["result"]] assert "${myvar1}" in labels
def test_hover_browser_integration( language_server_initialized: IRobocorpLanguageServerClient, cases: CasesFixture): from robocorp_ls_core.workspace import Document client = language_server_initialized uri = "x/y/locators.json" txt = """ "Browser.Locator.01": { "screenshot": "iVBORw0KGgoAAAANSUhEUgAAACgAAAA" """ doc = Document("", txt) client.open_doc(uri, 1, txt) line, col = doc.get_last_line_col() ret = client.hover(uri, line, col) assert ret["result"] == { "contents": { "kind": "markdown", "value": "![Screenshot](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAA)", }, "range": { "start": { "line": 2, "character": 56 }, "end": { "line": 2, "character": 56 }, }, }
def test_keyword_completions_params_complete_existing_no_chars_with_empty_new_line_after( check): from robocorp_ls_core.workspace import Document base = CASE_TEMPLATE + " arg2=10 " doc = Document("", base) line, col = doc.get_last_line_col() check(base + "\n ", line_col=(line, col))
def test_robotframework_integrated_completions(rf_configured_api, rf_root): from robocorp_ls_core import uris from robocorp_ls_core.workspace import Document api = rf_configured_api doc_uri = uris.from_fs_path( str(rf_root / "atest" / "robot" / "cli" / "dryrun" / "args.robot")) text = """*** Settings *** Suite Setup Run Tests --dryrun cli/dryrun/args.robot Resource atest_resource.robot *** Test Cases *** Valid positional args Check Test Case ${TESTNAME} Too few arguments Check Test Case ${TESTNAME} Too few arguments for UK Check Test Case ${TESTNAME} Too many arguments Check Test Case ${TESTNAME} Valid named args Check Test Case ${TESTNAME} Invalid named args Check Test Case ${TESTNAME} Ch""" api.m_text_document__did_open(textDocument={"uri": doc_uri, "text": text}) api.workspace.wait_for_check_done(10) doc = Document("") doc.source = text PRINT_TIMES = False if PRINT_TIMES: import time curtime = time.time() for i in range(5): line, col = doc.get_last_line_col() func = api.m_complete_all(doc_uri, line, col) assert len(func(monitor=NULL)) > 10 if PRINT_TIMES: print("Total %s: %.2fs" % (i, time.time() - curtime)) curtime = time.time()
def test_env_variables_resolved_on_completion_integrated( language_server_tcp: ILanguageServerClient, workspace_dir, data_regression, cases): from robocorp_ls_core.workspace import Document language_server = language_server_tcp language_server.initialize(workspace_dir, process_id=os.getpid()) uri = "untitled:Untitled-1" language_server.open_doc(uri, 1) contents = """*** Settings *** Library %{ROOT}/directory/my_library.py *** Keywords *** Some Keyword In Lib""" language_server.change_doc(uri, 2, contents) # Note: for libraries, if we found it, we keep it in memory (so, even though # we removed the entry, it'll still be accessible). language_server_tcp.settings({ "settings": { "robot": { "python": { "env": { "ROOT": cases.get_path("case_same_basename") } } } } }) doc = Document("", source=contents) line, col = doc.get_last_line_col() completions = language_server.get_completions(uri, line, col) data_regression.check(completions) contents = """*** Settings *** Library %{ROOT}/directory/my_library.py *** Keywords *** Some Keyword In Lib 2""" language_server.change_doc(uri, 2, contents) definitions = language_server.find_definitions(uri, line, col) found = definitions["result"] assert len(found) == 1 assert found[0]["uri"].endswith("my_library.py")
def threaded_monaco_completions_from_code_full( self, prefix: str, full_code: str, position: PositionTypedDict, uri: str, indent: str, monitor: Optional[IMonitor] = None, ): from robotframework_ls.impl.robot_workspace import RobotDocument from robotframework_ls.impl.completion_context import CompletionContext from robocorp_ls_core.workspace import Document from robotframework_ls.impl import section_completions from robotframework_ls.impl import snippets_completions from robotframework_ls.server_api.monaco_conversions import ( convert_to_monaco_completion, ) from robotframework_ls.impl.completion_context import CompletionType d = Document(uri, prefix) last_line, _last_col = d.get_last_line_col() line = last_line + position["line"] col = position["character"] col += len(indent) document = RobotDocument(uri, full_code) completion_context = CompletionContext( document, line, col, config=self.config, monitor=monitor, workspace=self.workspace, ) completion_context.type = CompletionType.shell completions = self._complete_from_completion_context(completion_context) completions.extend(section_completions.complete(completion_context)) completions.extend(snippets_completions.complete(completion_context)) return { "suggestions": [ convert_to_monaco_completion( c, line_delta=last_line, col_delta=len(indent), uri=uri ) for c in completions ] }
def test_hover_image_integration( language_server_initialized: IRobocorpLanguageServerClient, tmpdir): from robocorp_ls_core.workspace import Document from robocorp_code_tests.fixtures import IMAGE_IN_BASE64 import base64 from robocorp_ls_core import uris locators_json = tmpdir.join("locators.json") locators_json.write_text("", "utf-8") imgs_dir = tmpdir.join(".images") imgs_dir.mkdir() img1 = imgs_dir.join("img1.png") with img1.open("wb") as stream: stream.write(base64.b64decode(IMAGE_IN_BASE64)) client = language_server_initialized uri = uris.from_fs_path(str(locators_json)) txt = """ "Image.Locator.01": { "path": ".images/img1.png", "source": ".images/img1.png" """ doc = Document("", txt) client.open_doc(uri, 1, txt) line, col = doc.get_last_line_col() ret = client.hover(uri, line, col) result = ret["result"] value = result["contents"].pop("value") assert value.startswith("![Screenshot](file://") assert value.endswith("/.images/img1.png)") assert ret["result"] == { "contents": { "kind": "markdown", # "value": "![Screenshot](file:///c:/Users/fabio/AppData/Local/Temp/pytest-of-fabio/pytest-5202/test_hover_image_integration0/.images/img1.png)", }, "range": { "start": { "line": 3, "character": 37 }, "end": { "line": 3, "character": 37 }, }, }
def test_snippets_completions_integrated(language_server_tcp, ws_root_path, data_regression): from robocorp_ls_core.workspace import Document language_server = language_server_tcp language_server.initialize(ws_root_path, process_id=os.getpid()) uri = "untitled:Untitled-1" language_server.open_doc(uri, 1) contents = """ *** Test Cases *** List Variable for in""" language_server.change_doc(uri, 2, contents) doc = Document("", source=contents) line, col = doc.get_last_line_col() completions = language_server.get_completions(uri, line, col) del completions["id"] data_regression.check(completions, "snippet_completions")
def test_robotframework_integrated_go_to_def(rf_configured_api, rf_root): from robocorp_ls_core import uris from robocorp_ls_core.workspace import Document api = rf_configured_api doc_uri = uris.from_fs_path( str(rf_root / "atest" / "resources" / "foobar.robot")) text = """*** Settings *** Library TestCheckerLibrary""" api.m_text_document__did_open(textDocument={"uri": doc_uri, "text": text}) doc = Document("") doc.source = text line, col = doc.get_last_line_col() func = api.m_find_definition(doc_uri, line, col) found = func(monitor=NULL) assert len(found) == 1 found[0]["uri"].endswith("TestCheckerLibrary.py")
def test_hover_integrated(language_server_io: ILanguageServerClient, ws_root_path, data_regression): from robocorp_ls_core.workspace import Document from robocorp_ls_core.lsp import HoverTypedDict language_server = language_server_io language_server.initialize(ws_root_path, process_id=os.getpid()) uri = "untitled:Untitled-1" txt = """ *** Test Cases *** Log It Log """ doc = Document("", txt) language_server.open_doc(uri, 1, txt) line, col = doc.get_last_line_col() ret = language_server.request_hover(uri, line, col) result: HoverTypedDict = ret["result"] contents = result["contents"] assert "Log" in contents["value"] assert contents["kind"] == "markdown"
def test_rf_interactive_integrated_fs_completions( language_server_io: ILanguageServerClient, rf_interpreter_startup: _RfInterpreterInfo, data_regression, ): from robocorp_ls_core import uris from robocorp_ls_core.workspace import Document # Check that we're able to get completions based on the current dir. from robotframework_ls.commands import ROBOT_INTERNAL_RFINTERACTIVE_COMPLETIONS from robocorp_ls_core.lsp import Position uri = rf_interpreter_startup.uri fs_path = uris.to_fs_path(uri) dirname = os.path.dirname(fs_path) with open(os.path.join(dirname, "my_lib_03.py"), "w") as stream: stream.write(""" def some_method(): pass """) language_server = language_server_io code = "*** Settings ***\nLibrary ./my_" doc = Document(uri, code) completions = language_server.execute_command( ROBOT_INTERNAL_RFINTERACTIVE_COMPLETIONS, [{ "interpreter_id": rf_interpreter_startup.interpreter_id, "code": code, "position": Position(*doc.get_last_line_col()).to_dict(), }], ) suggestions = completions["result"]["suggestions"] assert suggestions data_regression.check(suggestions)
def request_completion(): doc = Document("", source=contents) line, col = doc.get_last_line_col() completions = language_server.get_completions(uri, line, col) del completions["id"] return completions