Files
serena/test/multilspy/rust/test_rust_basic.py
T

88 lines
4.8 KiB
Python

import os
import pytest
from multilspy.multilspy_config import Language
def find_symbol_recursive(symbols, name):
for symbol in symbols:
if symbol.get("name") == name:
return True
if symbol.get("children"):
if find_symbol_recursive(symbol["children"], name):
return True
return False
class TestRustLanguageServer:
@pytest.mark.parametrize("language_server", [Language.RUST], indirect=True)
def test_find_references_raw(self, language_server):
# Directly test the request_references method for the add function
file_path = os.path.join("src", "lib.rs")
symbols = language_server.request_document_symbols(file_path)
add_symbol = None
for sym in symbols[0]:
if sym.get("name") == "add":
add_symbol = sym
break
assert add_symbol is not None, "Could not find 'add' function symbol in lib.rs"
sel_start = add_symbol["selectionRange"]["start"]
sel_end = add_symbol["selectionRange"]["end"]
found = False
if sel_start["line"] == sel_end["line"]:
for col in range(sel_start["character"], sel_end["character"]+1):
refs = language_server.request_references(file_path, sel_start["line"], col)
# f"Raw request_references for add in lib.rs at col {col}: {refs}")
if any("main.rs" in ref.get("relativePath", "") for ref in refs):
found = True
else:
refs_start = language_server.request_references(file_path, sel_start["line"], sel_start["character"])
refs_end = language_server.request_references(file_path, sel_end["line"], sel_end["character"])
# f"Raw request_references for add in lib.rs at selectionRange start: {refs_start}")
# f"Raw request_references for add in lib.rs at selectionRange end: {refs_end}")
if any("main.rs" in ref.get("relativePath", "") for ref in refs_start + refs_end):
found = True
assert found, "main.rs should reference add (raw, tried all positions in selectionRange)"
@pytest.mark.parametrize("language_server", [Language.RUST], indirect=True)
def test_find_symbol(self, language_server):
symbols = language_server.request_full_symbol_tree()
assert find_symbol_recursive(symbols, "main"), "main function not found in symbol tree"
assert find_symbol_recursive(symbols, "add"), "add function not found in symbol tree"
# Add more as needed based on test_repo
@pytest.mark.parametrize("language_server", [Language.RUST], indirect=True)
def test_find_referencing_symbols(self, language_server):
# Find references to 'add' defined in lib.rs, should be referenced from main.rs
file_path = os.path.join("src", "lib.rs")
symbols = language_server.request_document_symbols(file_path)
add_symbol = None
for sym in symbols[0]:
if sym.get("name") == "add":
add_symbol = sym
break
assert add_symbol is not None, "Could not find 'add' function symbol in lib.rs"
sel_start = add_symbol["selectionRange"]["start"]
sel_end = add_symbol["selectionRange"]["end"]
# f"add symbol selectionRange: start={sel_start}, end={sel_end}")
found = False
# Try all character positions in the selectionRange (same line, from start to end character)
if sel_start["line"] == sel_end["line"]:
for col in range(sel_start["character"], sel_end["character"]+1):
refs = language_server.request_references(file_path, sel_start["line"], col)
# f"References for add in lib.rs at col {col} (selectionRange): {refs}")
if any("main.rs" in ref.get("relativePath", "") for ref in refs):
found = True
else:
# If the function name spans multiple lines, try start and end
refs_start = language_server.request_references(file_path, sel_start["line"], sel_start["character"])
refs_end = language_server.request_references(file_path, sel_end["line"], sel_end["character"])
# f"References for add in lib.rs at selectionRange start: {refs_start}")
# f"References for add in lib.rs at selectionRange end: {refs_end}")
if any("main.rs" in ref.get("relativePath", "") for ref in refs_start + refs_end):
found = True
assert found, "main.rs should reference add (tried all positions in selectionRange)"
@pytest.mark.parametrize("language_server", [Language.RUST], indirect=True)
def test_overview_methods(self, language_server):
symbols = language_server.request_full_symbol_tree()
assert find_symbol_recursive(symbols, "main"), "main missing from overview"
assert find_symbol_recursive(symbols, "add"), "add missing from overview"