https://github.com/erg-lang/molc
A mock language client for testing language servers
https://github.com/erg-lang/molc
language-server lsp lsp-client rust testing
Last synced: about 1 year ago
JSON representation
A mock language client for testing language servers
- Host: GitHub
- URL: https://github.com/erg-lang/molc
- Owner: erg-lang
- Created: 2023-09-07T17:34:01.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2024-02-18T02:17:33.000Z (over 2 years ago)
- Last Synced: 2024-05-01T11:15:51.744Z (about 2 years ago)
- Topics: language-server, lsp, lsp-client, rust, testing
- Language: Rust
- Homepage: https://docs.rs/molc/
- Size: 26.4 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# `molc`
`molc` provides a mock (fake) language client for testing language servers.
## Usage
You can see specific examples of molc use in [ELS](https://github.com/erg-lang/erg/blob/main/crates/els/tests/test.rs).
```rust
use lsp_types::{Url, Value};
use molc::{FakeClient, LangServer, RedirectableStdout};
use molc::oneline_range;
pub struct Server {
stdout_redirect: Option>,
...
}
impl LangServer for Server {
fn dispatch(&mut self, msg: impl Into) -> Result<(), Box> {
self.dispatch(msg)
}
}
impl RedirectableStdout for Server {
fn sender(&self) -> Option<&std::sync::mpsc::Sender> {
self.stdout_redirect.as_ref()
}
}
impl Server {
fn bind_fake_client() -> FakeClient {
// The server should send responses to this channel at least during testing.
let (sender, receiver) = std::sync::mpsc::channel();
DummyClient::new(
Server::new(Some(sender)),
receiver,
)
}
fn init(&mut self, msg: &Value, id: i64) -> ELSResult<()> {
self.send_log("initializing the language server")?;
let result = InitializeResult {
...
};
self.init_services();
self.send_stdout(&json!({
"jsonrpc": "2.0",
"id": id,
"result": result,
}))
}
...
}
#[test]
fn test_references() -> Result<(), Box> {
let mut client = Server::bind_fake_client();
client.request_initialize()?;
let uri = Url::from_file_path(Path::new(FILE_A).canonicalize()?).unwrap();
client.notify_open(FILE_A)?;
let locations = client.request_references(uri, 1, 4)?.unwrap();
assert_eq!(locations.len(), 1);
assert_eq!(&locations[0].range, &oneline_range(1, 4, 5));
Ok(())
}
```