|
|
@@ -0,0 +1,95 @@
|
|
|
+import { describe, expect, test, beforeEach } from "bun:test"
|
|
|
+import path from "path"
|
|
|
+import { LSPClient } from "../../src/lsp/client"
|
|
|
+import { LSPServer } from "../../src/lsp/server"
|
|
|
+import { Instance } from "../../src/project/instance"
|
|
|
+import { Log } from "../../src/util/log"
|
|
|
+
|
|
|
+// Minimal fake LSP server that speaks JSON-RPC over stdio
|
|
|
+function spawnFakeServer() {
|
|
|
+ const { spawn } = require("child_process")
|
|
|
+ const serverPath = path.join(__dirname, "../fixture/lsp/fake-lsp-server.js")
|
|
|
+ return {
|
|
|
+ process: spawn(process.execPath, [serverPath], {
|
|
|
+ stdio: "pipe",
|
|
|
+ }),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+describe("LSPClient interop", () => {
|
|
|
+ beforeEach(async () => {
|
|
|
+ await Log.init({ print: true })
|
|
|
+ })
|
|
|
+
|
|
|
+ test("handles workspace/workspaceFolders request", async () => {
|
|
|
+ const handle = spawnFakeServer() as any
|
|
|
+
|
|
|
+ const client = await Instance.provide({
|
|
|
+ directory: process.cwd(),
|
|
|
+ fn: () =>
|
|
|
+ LSPClient.create({
|
|
|
+ serverID: "fake",
|
|
|
+ server: handle as unknown as LSPServer.Handle,
|
|
|
+ root: process.cwd(),
|
|
|
+ }),
|
|
|
+ })
|
|
|
+
|
|
|
+ await client.connection.sendNotification("test/trigger", {
|
|
|
+ method: "workspace/workspaceFolders",
|
|
|
+ })
|
|
|
+
|
|
|
+ await new Promise((r) => setTimeout(r, 100))
|
|
|
+
|
|
|
+ expect(client.connection).toBeDefined()
|
|
|
+
|
|
|
+ await client.shutdown()
|
|
|
+ })
|
|
|
+
|
|
|
+ test("handles client/registerCapability request", async () => {
|
|
|
+ const handle = spawnFakeServer() as any
|
|
|
+
|
|
|
+ const client = await Instance.provide({
|
|
|
+ directory: process.cwd(),
|
|
|
+ fn: () =>
|
|
|
+ LSPClient.create({
|
|
|
+ serverID: "fake",
|
|
|
+ server: handle as unknown as LSPServer.Handle,
|
|
|
+ root: process.cwd(),
|
|
|
+ }),
|
|
|
+ })
|
|
|
+
|
|
|
+ await client.connection.sendNotification("test/trigger", {
|
|
|
+ method: "client/registerCapability",
|
|
|
+ })
|
|
|
+
|
|
|
+ await new Promise((r) => setTimeout(r, 100))
|
|
|
+
|
|
|
+ expect(client.connection).toBeDefined()
|
|
|
+
|
|
|
+ await client.shutdown()
|
|
|
+ })
|
|
|
+
|
|
|
+ test("handles client/unregisterCapability request", async () => {
|
|
|
+ const handle = spawnFakeServer() as any
|
|
|
+
|
|
|
+ const client = await Instance.provide({
|
|
|
+ directory: process.cwd(),
|
|
|
+ fn: () =>
|
|
|
+ LSPClient.create({
|
|
|
+ serverID: "fake",
|
|
|
+ server: handle as unknown as LSPServer.Handle,
|
|
|
+ root: process.cwd(),
|
|
|
+ }),
|
|
|
+ })
|
|
|
+
|
|
|
+ await client.connection.sendNotification("test/trigger", {
|
|
|
+ method: "client/unregisterCapability",
|
|
|
+ })
|
|
|
+
|
|
|
+ await new Promise((r) => setTimeout(r, 100))
|
|
|
+
|
|
|
+ expect(client.connection).toBeDefined()
|
|
|
+
|
|
|
+ await client.shutdown()
|
|
|
+ })
|
|
|
+})
|