Skip to content

Commit 7466912

Browse files
committed
Add tests for workspace/diagnostic handler
1 parent 470fad6 commit 7466912

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

tests/CSharpLanguageServer.Tests/DiagnosticTests.fs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ open System.Threading
44

55
open NUnit.Framework
66
open Ionide.LanguageServerProtocol.Types
7+
open Ionide.LanguageServerProtocol.Server
78

89
open CSharpLanguageServer.Tests.Tooling
910

@@ -117,3 +118,83 @@ let testPullDiagnosticsWork () =
117118
Assert.AreEqual(0, report.Items.Length)
118119
| _ -> failwith "U2.C1 is expected"
119120
()
121+
122+
123+
[<TestCase>]
124+
let testWorkspaceDiagnosticsWork() =
125+
use client = setupServerClient defaultClientProfile
126+
"TestData/testWorkspaceDiagnosticsWork"
127+
client.StartAndWaitForSolutionLoad()
128+
129+
let diagnosticParams: WorkspaceDiagnosticParams =
130+
{ WorkDoneToken = None
131+
PartialResultToken = None
132+
Identifier = None
133+
PreviousResultIds = Array.empty }
134+
135+
let report0: WorkspaceDiagnosticReport option =
136+
client.Request("workspace/diagnostic", diagnosticParams)
137+
138+
match report0 with
139+
| Some report0 ->
140+
Assert.AreEqual(3, report0.Items.Length)
141+
142+
match report0.Items[0] with
143+
| U2.C1 fullReport ->
144+
Assert.AreEqual("full", fullReport.Kind)
145+
Assert.AreEqual(None, fullReport.ResultId)
146+
Assert.AreEqual(3, fullReport.Items.Length)
147+
148+
let diagnostic0 = fullReport.Items[0]
149+
Assert.AreEqual(true, diagnostic0.Code.IsSome)
150+
Assert.AreEqual("Identifier expected", diagnostic0.Message)
151+
152+
| _ -> failwith "'U2.C1' was expected"
153+
154+
| _ -> failwith "'Some' was expected"
155+
156+
157+
[<TestCase>]
158+
let testWorkspaceDiagnosticsWorkWithStreaming() =
159+
use client = setupServerClient defaultClientProfile
160+
"TestData/testWorkspaceDiagnosticsWork"
161+
client.StartAndWaitForSolutionLoad()
162+
163+
let partialResultToken: ProgressToken =
164+
System.Guid.NewGuid() |> string |> U2.C2
165+
166+
let diagnosticParams: WorkspaceDiagnosticParams =
167+
{ WorkDoneToken = None
168+
PartialResultToken = Some partialResultToken
169+
Identifier = None
170+
PreviousResultIds = Array.empty }
171+
172+
let report0: WorkspaceDiagnosticReport option =
173+
client.Request("workspace/diagnostic", diagnosticParams)
174+
175+
// report should have 0 results, all of them streamed to lsp client via $/progress instead
176+
match report0 with
177+
| Some report0 ->
178+
Assert.AreEqual(0, report0.Items.Length)
179+
| _ -> failwith "'Some' was expected"
180+
181+
let progress = client.GetProgressParams partialResultToken
182+
Assert.AreEqual(3, progress.Length)
183+
184+
let report0 = progress[0].Value |> deserialize<WorkspaceDiagnosticReport>
185+
Assert.AreEqual(1, report0.Items.Length)
186+
187+
match report0.Items[0] with
188+
| U2.C1 fullReport ->
189+
Assert.AreEqual("full", fullReport.Kind)
190+
Assert.AreEqual(None, fullReport.ResultId)
191+
Assert.AreEqual(3, fullReport.Items.Length)
192+
193+
let diagnostic0 = fullReport.Items[0]
194+
Assert.AreEqual(true, diagnostic0.Code.IsSome)
195+
Assert.AreEqual("Identifier expected", diagnostic0.Message)
196+
197+
| _ -> failwith "'U2.C1' was expected"
198+
199+
let report1 = progress[1].Value |> deserialize<WorkspaceDiagnosticReportPartialResult>
200+
Assert.AreEqual(1, report1.Items.Length)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
XXX
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<OutputType>Exe</OutputType>
4+
<TargetFramework>net9.0</TargetFramework>
5+
</PropertyGroup>
6+
</Project>

tests/CSharpLanguageServer.Tests/Tooling.fs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,17 @@ type ClientController (client: MailboxProcessor<ClientEvent>, testDataDir: Direc
673673
member __.GetState () =
674674
client.PostAndReply(fun rc -> GetState rc)
675675

676+
member __.GetRpcLog () =
677+
client.PostAndReply(fun rc -> GetRpcLog rc)
678+
679+
member __.GetProgressParams (token: ProgressToken) =
680+
client.PostAndReply(fun rc -> GetRpcLog rc)
681+
|> Seq.filter (fun m -> m.Source = Server)
682+
|> Seq.filter (fun m -> (string m.Message["method"]) = "$/progress")
683+
|> Seq.map (fun m -> m.Message["params"] |> deserialize<ProgressParams>)
684+
|> Seq.filter (fun pp -> pp.Token = token)
685+
|> List.ofSeq
686+
676687
member __.DumpRpcLog () =
677688
let rpcLog = client.PostAndReply(fun rc -> GetRpcLog rc)
678689
for m in rpcLog do

0 commit comments

Comments
 (0)