molc

molc is a mock (fake) language client for testing language servers.

Usage

You can see specific examples of molc use in ELS.

```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.stdoutredirect.asref() } }

impl Server { fn bindfakeclient() -> 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 testreferences() -> Result<(), Box> { let mut client = Server::bindfakeclient(); client.requestinitialize()?; let uri = Url::fromfilepath(Path::new(FILEA).canonicalize()?).unwrap(); client.notifyopen(FILEA)?; let locations = client.requestreferences(uri, 1, 4)?.unwrap(); asserteq!(locations.len(), 1); asserteq!(&locations[0].range, &oneline_range(1, 4, 5)); Ok(()) } ```