@@ -10,6 +10,8 @@ open Newtonsoft.Json
1010open Ionide.LanguageServerProtocol .JsonRpc
1111open System.Collections .Generic
1212open System.Runtime .Serialization
13+ open System.Text
14+ open System.IO
1315
1416type Record1 = { Name: string ; Value: int }
1517type Record2 = { Name: string ; Position: int }
@@ -88,6 +90,16 @@ type ExtensionDataField =
8890 if isNull x.AdditionalData then
8991 x.AdditionalData <- Map.empty
9092
93+ let private formatter = jsonRpcFormatter ()
94+
95+ let serialize item =
96+ let sb = new StringBuilder()
97+ use writer = new JsonTextWriter( new StringWriter( sb))
98+ formatter.JsonSerializer.Serialize( writer, item)
99+ JToken.Parse( sb.ToString())
100+
101+ let deserialize < 'T > ( json : JToken ) = json.ToObject< 'T>( formatter.JsonSerializer)
102+
91103let private serializationTests =
92104 testList
93105 " (de)serialization"
@@ -674,71 +686,7 @@ let private serializationTests =
674686 testCase " can deserialize null Version in VersionedTextDocumentIdentifier"
675687 <| fun _ ->
676688 let textDoc = { VersionedTextDocumentIdentifier.Uri = " ..." ; Version = None }
677- testThereAndBackAgain textDoc
678-
679- testCase " serialize to name specified in JsonProperty in Response"
680- <| fun _ ->
681- let response : Response = { Version = " 123" ; Id = None; Error = None; Result = None }
682- let json = response |> serialize
683- // Version -> jsonrpc
684- Expect.isNone
685- ( json |> tryGetProperty ( nameof response.Version))
686- " Version should exist, but instead as jsonrpc"
687-
688- Expect.isSome ( json |> tryGetProperty " jsonrpc" ) " jsonrcp should exist because of Version"
689- // Id & Error optional -> not in json
690- Expect.isNone ( json |> tryGetProperty ( nameof response.Id)) " None Id shouldn't be in json"
691- Expect.isNone ( json |> tryGetProperty ( nameof response.Error)) " None Error shouldn't be in json"
692- // Result even when null/None
693- let prop =
694- json
695- |> tryGetProperty ( nameof response.Result)
696- |> Flip.Expect.wantSome " Result should exist even when null/None"
697-
698- Expect.equal prop.Value.Type ( JTokenType.Null) " Result should be null"
699- testCase " can (de)serialize empty response"
700- <| fun _ ->
701- let response : Response = { Version = " 123" ; Id = None; Error = None; Result = None }
702- testThereAndBackAgain response
703- testCase " can (de)serialize Response.Result"
704- <| fun _ ->
705- let response : Response =
706- { Version = " 123"
707- Id = None
708- Error = None
709- Result = Some( JToken.Parse " \" some result\" " ) }
710-
711- testThereAndBackAgain response
712- testCase " can (de)serialize Result when Error is None"
713- <| fun _ ->
714- // Note: It's either `Error` or `Result`, but not both together
715- let response : Response =
716- { Version = " 123"
717- Id = Some 42
718- Error = None
719- Result = Some( JToken.Parse " \" some result\" " ) }
720-
721- testThereAndBackAgain response
722- testCase " can (de)serialize Error when error is Some"
723- <| fun _ ->
724- let response : Response =
725- { Version = " 123"
726- Id = Some 42
727- Error = Some { Code = 13 ; Message = " oh no" ; Data = Some( JToken.Parse " \" some data\" " ) }
728- Result = None }
729-
730- testThereAndBackAgain response
731- testCase " doesn't serialize Result when Error is Some"
732- <| fun _ ->
733- let response : Response =
734- { Version = " 123"
735- Id = Some 42
736- Error = Some { Code = 13 ; Message = " oh no" ; Data = Some( JToken.Parse " \" some data\" " ) }
737- Result = Some( JToken.Parse " \" some result\" " ) }
738-
739- let output = thereAndBackAgain response
740- Expect.isSome output.Error " Error should be serialized"
741- Expect.isNone output.Result " Result should not be serialized when Error is Some" ]
689+ testThereAndBackAgain textDoc ]
742690
743691 testList
744692 ( nameof InlayHint)
0 commit comments