// SPDX-FileCopyrightText: 2019 The Go Language Server Authors // SPDX-License-Identifier: BSD-3-Clause package protocol import ( "fmt" "path/filepath" "testing" "encoding/json" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/a-h/templ/lsp/uri" ) func TestWorkspaceFolders(t *testing.T) { t.Parallel() const want = `[{"uri":"file:///Users/zchee/go/src/github.com/a-h/templ/lsp/protocol","name":"protocol"},{"uri":"file:///Users/zchee/go/src/github.com/a-h/templ/lsp/jsonrpc2","name":"jsonrpc2"}]` wantType := WorkspaceFolders{ { URI: string(uri.File("/Users/zchee/go/src/github.com/a-h/templ/lsp/protocol")), Name: "protocol", }, { URI: string(uri.File("/Users/zchee/go/src/github.com/a-h/templ/lsp/jsonrpc2")), Name: "jsonrpc2", }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field WorkspaceFolders want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want WorkspaceFolders wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got WorkspaceFolders if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestClientInfo(t *testing.T) { t.Parallel() const ( want = `{"name":"testClient","version":"v0.0.0"}` wantNilAll = `{"name":"testClient"}` ) wantType := ClientInfo{ Name: "testClient", Version: "v0.0.0", } wantTypeNilAll := ClientInfo{ Name: "testClient", } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ClientInfo want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ClientInfo wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ClientInfo if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestInitializeParams(t *testing.T) { t.Parallel() const wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb" const ( want = `{"workDoneToken":"` + wantWorkDoneToken + `","processId":25556,"clientInfo":{"name":"testClient","version":"v0.0.0"},"locale":"en-US","rootPath":"~/go/src/github.com/a-h/templ/lsp/protocol","rootUri":"file:///Users/zchee/go/src/github.com/a-h/templ/lsp/protocol","initializationOptions":"testdata","capabilities":{},"trace":"on","workspaceFolders":[{"uri":"file:///Users/zchee/go/src/github.com/a-h/templ/lsp/protocol","name":"protocol"},{"uri":"file:///Users/zchee/go/src/github.com/a-h/templ/lsp/jsonrpc2","name":"jsonrpc2"}]}` wantNil = `{"processId":25556,"rootUri":"file:///Users/zchee/go/src/github.com/a-h/templ/lsp/protocol","capabilities":{}}` ) wantType := InitializeParams{ WorkDoneProgressParams: WorkDoneProgressParams{ WorkDoneToken: NewProgressToken(wantWorkDoneToken), }, ProcessID: 25556, ClientInfo: &ClientInfo{ Name: "testClient", Version: "v0.0.0", }, Locale: "en-US", RootPath: "~/go/src/github.com/a-h/templ/lsp/protocol", RootURI: uri.File("/Users/zchee/go/src/github.com/a-h/templ/lsp/protocol"), InitializationOptions: "testdata", Capabilities: ClientCapabilities{}, Trace: "on", WorkspaceFolders: []WorkspaceFolder{ { Name: filepath.Base("/Users/zchee/go/src/github.com/a-h/templ/lsp/protocol"), URI: string(uri.File("/Users/zchee/go/src/github.com/a-h/templ/lsp/protocol")), }, { Name: filepath.Base("/Users/zchee/go/src/github.com/a-h/templ/lsp/jsonrpc2"), URI: string(uri.File("/Users/zchee/go/src/github.com/a-h/templ/lsp/jsonrpc2")), }, }, } wantTypeNilAll := InitializeParams{ ProcessID: 25556, RootURI: uri.File("//Users/zchee/go/src/github.com/a-h/templ/lsp/protocol"), Capabilities: ClientCapabilities{}, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field InitializeParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want InitializeParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got InitializeParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(WorkDoneProgressParams{})); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } if token := got.WorkDoneToken; token != nil { if diff := cmp.Diff(fmt.Sprint(token), wantWorkDoneToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } }) } }) } func TestLogTraceParams(t *testing.T) { t.Parallel() const ( want = `{"message":"testMessage","verbose":"verbose"}` wantNil = `{"message":"testMessage"}` ) wantType := LogTraceParams{ Message: "testMessage", Verbose: TraceVerbose, } wantTypeNil := LogTraceParams{ Message: "testMessage", } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field LogTraceParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Nil", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want LogTraceParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Nil", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got LogTraceParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestSetTraceParams(t *testing.T) { t.Parallel() const ( want = `{"value":"verbose"}` wantInvalid = `{"value":"invalid"}` ) wantType := SetTraceParams{ Value: TraceVerbose, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field SetTraceParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want SetTraceParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got SetTraceParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestCreateFilesParams(t *testing.T) { t.Parallel() const ( want = `{"files":[{"uri":"file:///path/to/basic.go"}]}` wantInvalid = `{"files":[{"uri":"file:///path/to/invalid.go"}]}` ) wantType := CreateFilesParams{ Files: []FileCreate{ { URI: "file:///path/to/basic.go", }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field CreateFilesParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want CreateFilesParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got CreateFilesParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestRenameFilesParams(t *testing.T) { t.Parallel() const ( want = `{"files":[{"oldUri":"file:///path/to/old.go","newUri":"file:///path/to/new.go"}]}` wantInvalid = `{"files":[{"oldUri":"file:///path/to/invalidOld.go","newUri":"file:///path/to/invalidNew.go"}]}` ) wantType := RenameFilesParams{ Files: []FileRename{ { OldURI: "file:///path/to/old.go", NewURI: "file:///path/to/new.go", }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field RenameFilesParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want RenameFilesParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got RenameFilesParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDeleteFilesParams(t *testing.T) { t.Parallel() const ( want = `{"files":[{"uri":"file:///path/to/basic.go"}]}` wantInvalid = `{"files":[{"uri":"file:///path/to/invalid.go"}]}` ) wantType := DeleteFilesParams{ Files: []FileDelete{ { URI: "file:///path/to/basic.go", }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DeleteFilesParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DeleteFilesParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DeleteFilesParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestReferencesParams(t *testing.T) { t.Parallel() const ( wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb" wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568" ) const ( want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","context":{"includeDeclaration":true}}` wantNilAll = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"context":{"includeDeclaration":true}}` wantInvalid = `{"textDocument":{"uri":"file:///path/to/basic_gen.go"},"position":{"line":2,"character":1},"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","context":{"includeDeclaration":false}}` ) wantType := ReferenceParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, WorkDoneProgressParams: WorkDoneProgressParams{ WorkDoneToken: NewProgressToken(wantWorkDoneToken), }, PartialResultParams: PartialResultParams{ PartialResultToken: NewProgressToken(wantPartialResultToken), }, Context: ReferenceContext{ IncludeDeclaration: true, }, } wantTypeNilAll := ReferenceParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, Context: ReferenceContext{ IncludeDeclaration: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ReferenceParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ReferenceParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ReferenceParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(WorkDoneProgressParams{}, PartialResultParams{})); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } if workDoneToken := got.WorkDoneToken; workDoneToken != nil { if diff := cmp.Diff(fmt.Sprint(workDoneToken), wantWorkDoneToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } if partialResultToken := got.PartialResultToken; partialResultToken != nil { if diff := cmp.Diff(fmt.Sprint(partialResultToken), wantPartialResultToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } }) } }) } func TestDocumentHighlightOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` wantInvalid = `{"workDoneProgress":false}` ) wantType := DocumentHighlightOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentHighlightOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: DocumentHighlightOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentHighlightOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: DocumentHighlightOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentHighlightOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDocumentHighlightParams(t *testing.T) { t.Parallel() const ( wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb" wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568" ) const ( want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `"}` wantNilAll = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1}}` wantInvalid = `{"textDocument":{"uri":"file:///path/to/basic_gen.go"},"position":{"line":2,"character":1},"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `"}` ) wantType := DocumentHighlightParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, WorkDoneProgressParams: WorkDoneProgressParams{ WorkDoneToken: NewProgressToken(wantWorkDoneToken), }, PartialResultParams: PartialResultParams{ PartialResultToken: NewProgressToken(wantPartialResultToken), }, } wantTypeNilAll := DocumentHighlightParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentHighlightParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentHighlightParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentHighlightParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(WorkDoneProgressParams{}, PartialResultParams{})); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } if workDoneToken := got.WorkDoneToken; workDoneToken != nil { if diff := cmp.Diff(fmt.Sprint(workDoneToken), wantWorkDoneToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } if partialResultToken := got.PartialResultToken; partialResultToken != nil { if diff := cmp.Diff(fmt.Sprint(partialResultToken), wantPartialResultToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } }) } }) } func TestDocumentSymbolOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true,"label":"testLabel"}` wantInvalid = `{"workDoneProgress":false}` wantNil = `{}` ) wantType := DocumentSymbolOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, Label: "testLabel", } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentSymbolOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: DocumentSymbolOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentSymbolOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: DocumentSymbolOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentSymbolOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestWorkspaceSymbolOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantInvalid = `{"workDoneProgress":false}` wantNil = `{}` ) wantType := WorkspaceSymbolOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field WorkspaceSymbolOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: WorkspaceSymbolOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want WorkspaceSymbolOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: WorkspaceSymbolOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got WorkspaceSymbolOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDocumentFormattingOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantInvalid = `{"workDoneProgress":false}` wantNil = `{}` ) wantType := DocumentFormattingOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentFormattingOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: DocumentFormattingOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentFormattingOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: DocumentFormattingOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentFormattingOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDocumentRangeFormattingOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` wantInvalid = `{"workDoneProgress":false}` ) wantType := DocumentRangeFormattingOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentRangeFormattingOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: DocumentRangeFormattingOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentRangeFormattingOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: DocumentRangeFormattingOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentRangeFormattingOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDeclarationOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` wantInvalid = `{"workDoneProgress":false}` ) wantType := DeclarationOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DeclarationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: DeclarationOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DeclarationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: DeclarationOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DeclarationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDeclarationRegistrationOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true,"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}],"id":"1"}` wantNil = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}]}` wantInvalid = `{"workDoneProgress":false,"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"}],"id":"0"}` ) wantType := DeclarationRegistrationOptions{ DeclarationOptions: DeclarationOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, }, TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, StaticRegistrationOptions: StaticRegistrationOptions{ ID: "1", }, } wantTypeNil := DeclarationRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DeclarationRegistrationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DeclarationRegistrationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DeclarationRegistrationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDeclarationParams(t *testing.T) { t.Parallel() const ( wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb" wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568" ) const ( want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `"}` wantNilAll = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1}}` wantInvalid = `{"textDocument":{"uri":"file:///path/to/basic_gen.go"},"position":{"line":2,"character":1},"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `"}` ) wantType := DeclarationParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, WorkDoneProgressParams: WorkDoneProgressParams{ WorkDoneToken: NewProgressToken(wantWorkDoneToken), }, PartialResultParams: PartialResultParams{ PartialResultToken: NewProgressToken(wantPartialResultToken), }, } wantTypeNilAll := DeclarationParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DeclarationParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DeclarationParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DeclarationParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(WorkDoneProgressParams{}, PartialResultParams{})); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } if workDoneToken := got.WorkDoneToken; workDoneToken != nil { if diff := cmp.Diff(fmt.Sprint(workDoneToken), wantWorkDoneToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } if partialResultToken := got.PartialResultToken; partialResultToken != nil { if diff := cmp.Diff(fmt.Sprint(partialResultToken), wantPartialResultToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } }) } }) } func TestDefinitionOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` wantInvalid = `{"workDoneProgress":false}` ) wantType := DefinitionOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DefinitionOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: DefinitionOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DefinitionOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: DefinitionOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DefinitionOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDefinitionParams(t *testing.T) { t.Parallel() const ( wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb" wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568" ) const ( want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `"}` wantNilAll = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1}}` wantInvalid = `{"textDocument":{"uri":"file:///path/to/basic_gen.go"},"position":{"line":2,"character":1},"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `"}` ) wantType := DefinitionParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, WorkDoneProgressParams: WorkDoneProgressParams{ WorkDoneToken: NewProgressToken(wantWorkDoneToken), }, PartialResultParams: PartialResultParams{ PartialResultToken: NewProgressToken(wantPartialResultToken), }, } wantTypeNilAll := DefinitionParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DefinitionParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DefinitionParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DefinitionParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(WorkDoneProgressParams{}, PartialResultParams{})); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } if workDoneToken := got.WorkDoneToken; workDoneToken != nil { if diff := cmp.Diff(fmt.Sprint(workDoneToken), wantWorkDoneToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } if partialResultToken := got.PartialResultToken; partialResultToken != nil { if diff := cmp.Diff(fmt.Sprint(partialResultToken), wantPartialResultToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } }) } }) } func TestTypeDefinitionOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` wantInvalid = `{"workDoneProgress":false}` ) wantType := TypeDefinitionOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field TypeDefinitionOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: TypeDefinitionOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want TypeDefinitionOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: TypeDefinitionOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got TypeDefinitionOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestTypeDefinitionRegistrationOptions(t *testing.T) { t.Parallel() const ( want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}],"workDoneProgress":true,"id":"1"}` wantNil = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}]}` wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"}],"workDoneProgress":false,"id":"0"}` ) wantType := TypeDefinitionRegistrationOptions{ TypeDefinitionOptions: TypeDefinitionOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, }, TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, StaticRegistrationOptions: StaticRegistrationOptions{ ID: "1", }, } wantTypeNil := TypeDefinitionRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field TypeDefinitionRegistrationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want TypeDefinitionRegistrationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got TypeDefinitionRegistrationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestTypeDefinitionParams(t *testing.T) { t.Parallel() const ( wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb" wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568" ) const ( want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `"}` wantNilAll = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1}}` wantInvalid = `{"textDocument":{"uri":"file:///path/to/basic_gen.go"},"position":{"line":2,"character":1},"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `"}` ) wantType := TypeDefinitionParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, WorkDoneProgressParams: WorkDoneProgressParams{ WorkDoneToken: NewProgressToken(wantWorkDoneToken), }, PartialResultParams: PartialResultParams{ PartialResultToken: NewProgressToken(wantPartialResultToken), }, } wantTypeNilAll := TypeDefinitionParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field TypeDefinitionParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want TypeDefinitionParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got TypeDefinitionParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(WorkDoneProgressParams{}, PartialResultParams{})); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } if workDoneToken := got.WorkDoneToken; workDoneToken != nil { if diff := cmp.Diff(fmt.Sprint(workDoneToken), wantWorkDoneToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } if partialResultToken := got.PartialResultToken; partialResultToken != nil { if diff := cmp.Diff(fmt.Sprint(partialResultToken), wantPartialResultToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } }) } }) } func TestImplementationOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNilAll = `{}` ) wantType := ImplementationOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } wantTypeNilAll := ImplementationOptions{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ImplementationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ImplementationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ImplementationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestImplementationRegistrationOptions(t *testing.T) { t.Parallel() const ( want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}],"workDoneProgress":true,"id":"1"}` wantNilAll = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}]}` wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"}],"workDoneProgress":false,"id":"0"}` ) wantType := ImplementationRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, ImplementationOptions: ImplementationOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, }, StaticRegistrationOptions: StaticRegistrationOptions{ ID: "1", }, } wantTypeNilAll := ImplementationRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ImplementationRegistrationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ImplementationRegistrationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ImplementationRegistrationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestImplementationParams(t *testing.T) { t.Parallel() const ( wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb" wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568" ) const ( want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `"}` wantNilAll = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1}}` wantInvalid = `{"textDocument":{"uri":"file:///path/to/basic_gen.go"},"position":{"line":2,"character":1},"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `"}` ) wantType := ImplementationParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, WorkDoneProgressParams: WorkDoneProgressParams{ WorkDoneToken: NewProgressToken(wantWorkDoneToken), }, PartialResultParams: PartialResultParams{ PartialResultToken: NewProgressToken(wantPartialResultToken), }, } wantTypeNilAll := ImplementationParams{ TextDocumentPositionParams: TextDocumentPositionParams{ TextDocument: TextDocumentIdentifier{ URI: uri.File("/path/to/basic.go"), }, Position: Position{ Line: 25, Character: 1, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ImplementationParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNilAll, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ImplementationParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNilAll, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ImplementationParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(WorkDoneProgressParams{}, PartialResultParams{})); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } if workDoneToken := got.WorkDoneToken; workDoneToken != nil { if diff := cmp.Diff(fmt.Sprint(workDoneToken), wantWorkDoneToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } if partialResultToken := got.PartialResultToken; partialResultToken != nil { if diff := cmp.Diff(fmt.Sprint(partialResultToken), wantPartialResultToken); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } } }) } }) } func TestDocumentColorOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` wantInvalid = `{"workDoneProgress":false}` ) wantType := DocumentColorOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentColorOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: DocumentColorOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentColorOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: DocumentColorOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentColorOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDocumentColorRegistrationOptions(t *testing.T) { t.Parallel() const ( want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}],"id":"1","workDoneProgress":true}` wantNil = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}]}` wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"}],"id":"0","workDoneProgress":false}` ) wantType := DocumentColorRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, StaticRegistrationOptions: StaticRegistrationOptions{ ID: "1", }, DocumentColorOptions: DocumentColorOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, }, } wantTypeNil := DocumentColorRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentColorRegistrationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentColorRegistrationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentColorRegistrationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestPrepareSupportDefaultBehavior_String(t *testing.T) { t.Parallel() tests := []struct { name string k PrepareSupportDefaultBehavior want string }{ { name: "Identifier", k: PrepareSupportDefaultBehaviorIdentifier, want: "Identifier", }, { name: "UnknownKind", k: PrepareSupportDefaultBehavior(0), want: "0", }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() if got := tt.k.String(); got != tt.want { t.Errorf("PrepareSupportDefaultBehavior.String() = %v, want %v", tt.want, got) } }) } } func TestFoldingRangeOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` wantInvalid = `{"workDoneProgress":false}` ) wantType := FoldingRangeOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field FoldingRangeOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: FoldingRangeOptions{}, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want FoldingRangeOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: FoldingRangeOptions{}, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got FoldingRangeOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestFoldingRangeRegistrationOptions(t *testing.T) { t.Parallel() const ( want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}],"workDoneProgress":true,"id":"1"}` wantNil = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}]}` wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"}],"workDoneProgress":false,"id":"0"}` ) wantType := FoldingRangeRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, FoldingRangeOptions: FoldingRangeOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, }, StaticRegistrationOptions: StaticRegistrationOptions{ ID: "1", }, } wantTypeNil := FoldingRangeRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field FoldingRangeRegistrationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantType, want: wantInvalid, wantMarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want FoldingRangeRegistrationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, { name: "Invalid", field: wantInvalid, want: wantType, wantUnmarshalErr: false, wantErr: true, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got FoldingRangeRegistrationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestInitializeResult(t *testing.T) { t.Parallel() const ( want = `{"capabilities":{"textDocumentSync":1,"completionProvider":{"resolveProvider":true,"triggerCharacters":["Tab"]},"hoverProvider":true,"signatureHelpProvider":{"triggerCharacters":["C-K"],"retriggerCharacters":["."]},"declarationProvider":true,"definitionProvider":true,"typeDefinitionProvider":true,"implementationProvider":true,"referencesProvider":true,"documentHighlightProvider":true,"documentSymbolProvider":true,"codeActionProvider":true,"codeLensProvider":{"resolveProvider":true},"documentLinkProvider":{"resolveProvider":true},"colorProvider":true,"workspaceSymbolProvider":true,"documentFormattingProvider":true,"documentRangeFormattingProvider":true,"documentOnTypeFormattingProvider":{"firstTriggerCharacter":".","moreTriggerCharacter":["f"]},"renameProvider":true,"foldingRangeProvider":true,"selectionRangeProvider":true,"executeCommandProvider":{"commands":["test","command"]},"callHierarchyProvider":true,"linkedEditingRangeProvider":true,"workspace":{"workspaceFolders":{"supported":true,"changeNotifications":"testNotifications"},"fileOperations":{"didCreate":{"filters":[{"scheme":"file","pattern":{"glob":"*","matches":"file","options":{"ignoreCase":true}}}]},"willCreate":{"filters":[{"scheme":"file","pattern":{"glob":"*","matches":"folder","options":{"ignoreCase":true}}}]},"didRename":{"filters":[{"scheme":"file","pattern":{"glob":"*","matches":"file","options":{"ignoreCase":true}}}]},"willRename":{"filters":[{"scheme":"file","pattern":{"glob":"*","matches":"folder","options":{"ignoreCase":true}}}]},"didDelete":{"filters":[{"scheme":"file","pattern":{"glob":"*","matches":"file","options":{"ignoreCase":true}}}]},"willDelete":{"filters":[{"scheme":"file","pattern":{"glob":"*","matches":"folder","options":{"ignoreCase":true}}}]}}},"monikerProvider":true,"experimental":"Awesome Experimentals"},"serverInfo":{"name":"testServer","version":"v0.0.0"}}` wantNil = `{"capabilities":{}}` ) wantType := InitializeResult{ Capabilities: ServerCapabilities{ TextDocumentSync: float64(1), CompletionProvider: &CompletionOptions{ ResolveProvider: true, TriggerCharacters: []string{"Tab"}, }, HoverProvider: true, SignatureHelpProvider: &SignatureHelpOptions{ TriggerCharacters: []string{"C-K"}, RetriggerCharacters: []string{"."}, }, DeclarationProvider: true, DefinitionProvider: true, TypeDefinitionProvider: true, ImplementationProvider: true, ReferencesProvider: true, DocumentHighlightProvider: true, DocumentSymbolProvider: true, WorkspaceSymbolProvider: true, CodeActionProvider: true, CodeLensProvider: &CodeLensOptions{ ResolveProvider: true, }, DocumentFormattingProvider: true, DocumentRangeFormattingProvider: true, DocumentOnTypeFormattingProvider: &DocumentOnTypeFormattingOptions{ FirstTriggerCharacter: ".", MoreTriggerCharacter: []string{"f"}, }, RenameProvider: true, DocumentLinkProvider: &DocumentLinkOptions{ ResolveProvider: true, }, ColorProvider: true, FoldingRangeProvider: true, SelectionRangeProvider: true, ExecuteCommandProvider: &ExecuteCommandOptions{ Commands: []string{"test", "command"}, }, Workspace: &ServerCapabilitiesWorkspace{ WorkspaceFolders: &ServerCapabilitiesWorkspaceFolders{ Supported: true, ChangeNotifications: "testNotifications", }, FileOperations: &ServerCapabilitiesWorkspaceFileOperations{ DidCreate: &FileOperationRegistrationOptions{ Filters: []FileOperationFilter{ { Scheme: "file", Pattern: FileOperationPattern{ Glob: "*", Matches: FileOperationPatternKindFile, Options: FileOperationPatternOptions{ IgnoreCase: true, }, }, }, }, }, WillCreate: &FileOperationRegistrationOptions{ Filters: []FileOperationFilter{ { Scheme: "file", Pattern: FileOperationPattern{ Glob: "*", Matches: FileOperationPatternKindFolder, Options: FileOperationPatternOptions{ IgnoreCase: true, }, }, }, }, }, DidRename: &FileOperationRegistrationOptions{ Filters: []FileOperationFilter{ { Scheme: "file", Pattern: FileOperationPattern{ Glob: "*", Matches: FileOperationPatternKindFile, Options: FileOperationPatternOptions{ IgnoreCase: true, }, }, }, }, }, WillRename: &FileOperationRegistrationOptions{ Filters: []FileOperationFilter{ { Scheme: "file", Pattern: FileOperationPattern{ Glob: "*", Matches: FileOperationPatternKindFolder, Options: FileOperationPatternOptions{ IgnoreCase: true, }, }, }, }, }, DidDelete: &FileOperationRegistrationOptions{ Filters: []FileOperationFilter{ { Scheme: "file", Pattern: FileOperationPattern{ Glob: "*", Matches: FileOperationPatternKindFile, Options: FileOperationPatternOptions{ IgnoreCase: true, }, }, }, }, }, WillDelete: &FileOperationRegistrationOptions{ Filters: []FileOperationFilter{ { Scheme: "file", Pattern: FileOperationPattern{ Glob: "*", Matches: FileOperationPatternKindFolder, Options: FileOperationPatternOptions{ IgnoreCase: true, }, }, }, }, }, }, }, LinkedEditingRangeProvider: true, CallHierarchyProvider: true, SemanticTokensProvider: nil, MonikerProvider: true, Experimental: "Awesome Experimentals", }, ServerInfo: &ServerInfo{ Name: "testServer", Version: "v0.0.0", }, } wantTypeNil := InitializeResult{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field InitializeResult want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Logf("got: %s", string(got)) t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want InitializeResult wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got InitializeResult if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } // cmpOpts := cmpopts.IgnoreFields(ServerCapabilities{}, "SelectionRangeProvider") // ignore SelectionRangeProvider field but assert below if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } // if srp := got.Capabilities.SelectionRangeProvider; srp != nil { // switch srp := srp.(type) { // case bool: // EnableSelectionRange // if diff := cmp.Diff(EnableSelectionRange(srp), enableSelectionRange); (diff != "") != tt.wantErr { // t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) // } // default: // t.Fatalf("srp type is %[1]T, not bool: %#[1]v\n", srp) // } // } }) } }) } func TestInitializeError(t *testing.T) { t.Parallel() const want = `{"retry":true}` wantType := InitializeError{ Retry: true, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field InitializeError want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want InitializeError wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got InitializeError if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestShowDocumentParams(t *testing.T) { t.Parallel() const ( want = `{"uri":"file:///path/to/basic.go","external":true,"takeFocus":true,"selection":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}}}` wantNil = `{"uri":"file:///path/to/basic.go"}` ) wantType := ShowDocumentParams{ URI: uri.File("/path/to/basic.go"), External: true, TakeFocus: true, Selection: &Range{ Start: Position{ Line: 255, Character: 4, }, End: Position{ Line: 255, Character: 10, }, }, } wantTypeNilAll := ShowDocumentParams{ URI: uri.File("/path/to/basic.go"), } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ShowDocumentParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ShowDocumentParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ShowDocumentParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestShowDocumentResult(t *testing.T) { t.Parallel() const want = `{"success":true}` wantType := ShowDocumentResult{ Success: true, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ShowDocumentResult want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ShowDocumentResult wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ShowDocumentResult if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestTextDocumentSyncKind_String(t *testing.T) { t.Parallel() tests := []struct { name string k TextDocumentSyncKind want string }{ { name: "NoneKind", k: TextDocumentSyncKindNone, want: "None", }, { name: "FullKind", k: TextDocumentSyncKindFull, want: "Full", }, { name: "IncrementalKind", k: TextDocumentSyncKindIncremental, want: "Incremental", }, { name: "UnknownKind", k: TextDocumentSyncKind(99), want: "99", }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() if got := tt.k.String(); got != tt.want { t.Errorf("TextDocumentSyncKind.String() = %v, want %v", tt.want, got) } }) } } func TestReferencesOptions(t *testing.T) { t.Parallel() const want = `{"workDoneProgress":true}` wantType := ReferencesOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field ReferencesOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want ReferencesOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got ReferencesOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestCodeActionOptions(t *testing.T) { t.Parallel() const ( want = `{"codeActionKinds":["quickfix","refactor"],"resolveProvider":true}` wantNil = `{}` ) wantType := CodeActionOptions{ CodeActionKinds: []CodeActionKind{ QuickFix, Refactor, }, ResolveProvider: true, } wantTypeNil := CodeActionOptions{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field CodeActionOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Nil", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want CodeActionOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Nil", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got CodeActionOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestRenameOptions(t *testing.T) { t.Parallel() const ( want = `{"prepareProvider":true}` wantNil = `{}` ) wantType := RenameOptions{ PrepareProvider: true, } wantTypeNil := RenameOptions{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field RenameOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Nil", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want RenameOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Nil", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got RenameOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestSaveOptions(t *testing.T) { t.Parallel() const ( want = `{"includeText":true}` wantNil = `{}` ) wantType := SaveOptions{ IncludeText: true, } wantTypeNil := SaveOptions{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field SaveOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Nil", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want SaveOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Nil", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got SaveOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestTextDocumentSyncOptions(t *testing.T) { t.Parallel() const ( want = `{"openClose":true,"change":1,"willSave":true,"willSaveWaitUntil":true,"save":{"includeText":true}}` wantNil = `{}` ) wantType := TextDocumentSyncOptions{ OpenClose: true, Change: TextDocumentSyncKindFull, WillSave: true, WillSaveWaitUntil: true, Save: &SaveOptions{ IncludeText: true, }, } wantTypeNil := TextDocumentSyncOptions{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field TextDocumentSyncOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Nil", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want TextDocumentSyncOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Nil", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got TextDocumentSyncOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestHoverOptions(t *testing.T) { t.Parallel() const ( want = `{"workDoneProgress":true}` wantNil = `{}` ) wantType := HoverOptions{ WorkDoneProgressOptions: WorkDoneProgressOptions{ WorkDoneProgress: true, }, } wantTypeNil := HoverOptions{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field HoverOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Nil", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want HoverOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Nil", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got HoverOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestStaticRegistrationOptions(t *testing.T) { t.Parallel() const ( want = `{"id":"testID"}` wantNil = `{}` ) wantType := StaticRegistrationOptions{ ID: "testID", } wantTypeNil := StaticRegistrationOptions{} t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field StaticRegistrationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "Nil", field: wantTypeNil, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want StaticRegistrationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "Nil", field: wantNil, want: wantTypeNil, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got StaticRegistrationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestDocumentLinkRegistrationOptions(t *testing.T) { t.Parallel() const ( want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*"}],"resolveProvider":true}` wantNil = `{"documentSelector":[]}` ) wantType := DocumentLinkRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{ { Language: "go", Scheme: "file", Pattern: `*`, }, }, }, ResolveProvider: true, } wantTypeNilAll := DocumentLinkRegistrationOptions{ TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{ DocumentSelector: DocumentSelector{}, }, } t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field DocumentLinkRegistrationOptions want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: wantType, want: want, wantMarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantTypeNilAll, want: wantNil, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want DocumentLinkRegistrationOptions wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: wantType, wantUnmarshalErr: false, wantErr: false, }, { name: "ValidNilAll", field: wantNil, want: wantTypeNilAll, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got DocumentLinkRegistrationOptions if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) } func TestInitializedParams(t *testing.T) { t.Parallel() const want = `{}` t.Run("Marshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field InitializedParams want string wantMarshalErr bool wantErr bool }{ { name: "Valid", field: InitializedParams{}, want: want, wantMarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got, err := json.Marshal(&tt.field) if (err != nil) != tt.wantMarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) t.Run("Unmarshal", func(t *testing.T) { t.Parallel() tests := []struct { name string field string want InitializedParams wantUnmarshalErr bool wantErr bool }{ { name: "Valid", field: want, want: InitializedParams{}, wantUnmarshalErr: false, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() var got InitializedParams if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr { t.Fatal(err) } if diff := cmp.Diff(tt.want, got); (diff != "") != tt.wantErr { t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff) } }) } }) }