learnlytics-go/templ/lsp/protocol/language_test.go
2025-03-20 12:35:13 +01:00

6061 lines
147 KiB
Go

// SPDX-FileCopyrightText: 2020 The Go Language Server Authors
// SPDX-License-Identifier: BSD-3-Clause
package protocol
import (
"bytes"
"fmt"
"strings"
"testing"
"encoding/json"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/a-h/templ/lsp/uri"
)
func TestCompletionParams(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/test.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","context":{"triggerCharacter":".","triggerKind":1}}`
wantInvalid = `{"textDocument":{"uri":"file:///path/to/test.go"},"position":{"line":2,"character":0},"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","context":{"triggerCharacter":".","triggerKind":1}}`
)
wantType := CompletionParams{
TextDocumentPositionParams: TextDocumentPositionParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
},
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
Context: &CompletionContext{
TriggerCharacter: ".",
TriggerKind: CompletionTriggerKindInvoked,
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CompletionParams
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) {
tests := []struct {
name string
field string
want CompletionParams
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 CompletionParams
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 TestCompletionTriggerKind_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k CompletionTriggerKind
want string
}{
{
name: "Invoked",
k: CompletionTriggerKindInvoked,
want: "Invoked",
},
{
name: "TriggerCharacter",
k: CompletionTriggerKindTriggerCharacter,
want: "TriggerCharacter",
},
{
name: "TriggerForIncompleteCompletions",
k: CompletionTriggerKindTriggerForIncompleteCompletions,
want: "TriggerForIncompleteCompletions",
},
{
name: "Unknown",
k: CompletionTriggerKind(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("CompletionTriggerKind.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestCompletionContext(t *testing.T) {
t.Parallel()
const (
want = `{"triggerCharacter":".","triggerKind":1}`
wantInvalid = `{"triggerCharacter":" ","triggerKind":0}`
)
wantType := CompletionContext{
TriggerCharacter: ".",
TriggerKind: CompletionTriggerKindInvoked,
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CompletionContext
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) {
tests := []struct {
name string
field string
want CompletionContext
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 CompletionContext
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 TestCompletionList(t *testing.T) {
t.Parallel()
const (
want = `{"isIncomplete":true,"items":[{"tags":[1],"detail":"string","documentation":"Detail a human-readable string with additional information about this item, like type or symbol information.","filterText":"Detail","insertTextFormat":2,"kind":5,"label":"Detail","preselect":true,"sortText":"00000","textEdit":{"range":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}},"newText":"Detail: ${1:},"}}]}`
wantInvalid = `{"isIncomplete":false,"items":[]}`
)
wantType := CompletionList{
IsIncomplete: true,
Items: []CompletionItem{
{
AdditionalTextEdits: nil,
Command: nil,
CommitCharacters: nil,
Tags: []CompletionItemTag{
CompletionItemTagDeprecated,
},
Deprecated: false,
Detail: "string",
Documentation: "Detail a human-readable string with additional information about this item, like type or symbol information.",
FilterText: "Detail",
InsertText: "",
InsertTextFormat: InsertTextFormatSnippet,
Kind: CompletionItemKindField,
Label: "Detail",
Preselect: true,
SortText: "00000",
TextEdit: &TextEditOrInsertReplaceEdit{
TextEdit: &TextEdit{
Range: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
NewText: "Detail: ${1:},",
},
},
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CompletionList
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) {
tests := []struct {
name string
field string
want CompletionList
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 CompletionList
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 TestInsertTextFormat_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k InsertTextFormat
want string
}{
{
name: "PlainText",
k: InsertTextFormatPlainText,
want: "PlainText",
},
{
name: "Snippet",
k: InsertTextFormatSnippet,
want: "Snippet",
},
{
name: "Unknown",
k: InsertTextFormat(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("InsertTextFormat.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestInsertReplaceEdit(t *testing.T) {
t.Parallel()
const (
want = `{"newText":"testNewText","insert":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}},"replace":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}}}`
)
wantType := InsertReplaceEdit{
NewText: "testNewText",
Insert: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
Replace: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field InsertReplaceEdit
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) {
tests := []struct {
name string
field string
want InsertReplaceEdit
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 InsertReplaceEdit
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 TestInsertTextMode_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k InsertTextMode
want string
}{
{
name: "AsIs",
k: InsertTextModeAsIs,
want: "AsIs",
},
{
name: "AdjustIndentation",
k: InsertTextModeAdjustIndentation,
want: "AdjustIndentation",
},
{
name: "Unknown",
k: InsertTextMode(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("InsertTextMode.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestCompletionItem(t *testing.T) {
t.Parallel()
const (
wantTextEdit = `{
"additionalTextEdits": [
{
"range": {
"start": {
"line": 255,
"character": 4
},
"end": {
"line": 255,
"character": 10
}
},
"newText": "Detail: ${1:},"
}
],
"command": {
"title": "exec echo",
"command": "echo",
"arguments": [
"hello"
]
},
"commitCharacters": [
"a"
],
"tags": [
1
],
"data": "testData",
"deprecated": true,
"detail": "string",
"documentation": "Detail a human-readable string with additional information about this item, like type or symbol information.",
"filterText": "Detail",
"insertText": "testInsert",
"insertTextFormat": 2,
"insertTextMode": 1,
"kind": 5,
"label": "Detail",
"preselect": true,
"sortText": "00000",
"textEdit": {
"range": {
"start": {
"line": 255,
"character": 4
},
"end": {
"line": 255,
"character": 10
}
},
"newText": "Detail: ${1:},"
}
}`
wantInsertReplaceEdit = `{
"additionalTextEdits": [
{
"range": {
"start": {
"line": 255,
"character": 4
},
"end": {
"line": 255,
"character": 10
}
},
"newText": "Detail: ${1:},"
}
],
"command": {
"title": "exec echo",
"command": "echo",
"arguments": [
"hello"
]
},
"commitCharacters": [
"a"
],
"tags": [
1
],
"data": "testData",
"deprecated": true,
"detail": "string",
"documentation": "Detail a human-readable string with additional information about this item, like type or symbol information.",
"filterText": "Detail",
"insertText": "testInsert",
"insertTextFormat": 2,
"insertTextMode": 1,
"kind": 5,
"label": "Detail",
"preselect": true,
"sortText": "00000",
"textEdit": {
"newText": "Detail: ${1:},",
"insert": {
"start": {
"line": 105,
"character": 65
},
"end": {
"line": 105,
"character": 72
}
},
"replace": {
"start": {
"line": 105,
"character": 65
},
"end": {
"line": 105,
"character": 76
}
}
}
}`
wantNilAll = `{
"label": "Detail"
}`
wantInvalid = `{"items":[]}`
)
wantTypeTextEdit := CompletionItem{
AdditionalTextEdits: []TextEdit{
{
Range: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
NewText: "Detail: ${1:},",
},
},
Command: &Command{
Title: "exec echo",
Command: "echo",
Arguments: []any{"hello"},
},
CommitCharacters: []string{"a"},
Tags: []CompletionItemTag{
CompletionItemTagDeprecated,
},
Data: "testData",
Deprecated: true,
Detail: "string",
Documentation: "Detail a human-readable string with additional information about this item, like type or symbol information.",
FilterText: "Detail",
InsertText: "testInsert",
InsertTextFormat: InsertTextFormatSnippet,
InsertTextMode: InsertTextModeAsIs,
Kind: CompletionItemKindField,
Label: "Detail",
Preselect: true,
SortText: "00000",
TextEdit: &TextEditOrInsertReplaceEdit{
TextEdit: &TextEdit{
Range: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
NewText: "Detail: ${1:},",
},
},
}
wantTypeInsertReplaceEdit := CompletionItem{
AdditionalTextEdits: []TextEdit{
{
Range: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
NewText: "Detail: ${1:},",
},
},
Command: &Command{
Title: "exec echo",
Command: "echo",
Arguments: []any{"hello"},
},
CommitCharacters: []string{"a"},
Tags: []CompletionItemTag{
CompletionItemTagDeprecated,
},
Data: "testData",
Deprecated: true,
Detail: "string",
Documentation: "Detail a human-readable string with additional information about this item, like type or symbol information.",
FilterText: "Detail",
InsertText: "testInsert",
InsertTextFormat: InsertTextFormatSnippet,
InsertTextMode: InsertTextModeAsIs,
Kind: CompletionItemKindField,
Label: "Detail",
Preselect: true,
SortText: "00000",
TextEdit: &TextEditOrInsertReplaceEdit{
InsertReplaceEdit: &InsertReplaceEdit{
NewText: "Detail: ${1:},",
Insert: Range{
Start: Position{
Line: 105,
Character: 65,
},
End: Position{
Line: 105,
Character: 72,
},
},
Replace: Range{
Start: Position{
Line: 105,
Character: 65,
},
End: Position{
Line: 105,
Character: 76,
},
},
},
},
}
wantTypeNilAll := CompletionItem{
Label: "Detail",
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CompletionItem
want string
wantMarshalErr bool
wantErr bool
}{
{
name: "ValidTextEdit",
field: wantTypeTextEdit,
want: wantTextEdit,
wantMarshalErr: false,
wantErr: false,
},
{
name: "ValidInsertReplaceEdit",
field: wantTypeInsertReplaceEdit,
want: wantInsertReplaceEdit,
wantMarshalErr: false,
wantErr: false,
},
{
name: "ValidNilAll",
field: wantTypeNilAll,
want: wantNilAll,
wantMarshalErr: false,
wantErr: false,
},
{
name: "Invalid",
field: wantTypeTextEdit,
want: wantInvalid,
wantMarshalErr: false,
wantErr: true,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
b := new(bytes.Buffer)
enc := json.NewEncoder(b)
enc.SetIndent("", " ")
err := enc.Encode(&tt.field)
if (err != nil) != tt.wantMarshalErr {
t.Fatal(err)
}
got := strings.TrimSpace(b.String())
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) {
tests := []struct {
name string
field string
want CompletionItem
wantUnmarshalErr bool
wantErr bool
}{
{
name: "ValidTextEdit",
field: wantTextEdit,
want: wantTypeTextEdit,
wantUnmarshalErr: false,
wantErr: false,
},
{
name: "ValidInsertReplaceEdit",
field: wantInsertReplaceEdit,
want: wantTypeInsertReplaceEdit,
wantUnmarshalErr: false,
wantErr: false,
},
{
name: "ValidNilAll",
field: wantNilAll,
want: wantTypeNilAll,
wantUnmarshalErr: false,
wantErr: false,
},
{
name: "Invalid",
field: wantInvalid,
want: wantTypeTextEdit,
wantUnmarshalErr: false,
wantErr: true,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
var got CompletionItem
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 TestCompletionItemKind_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k CompletionItemKind
want string
}{
{
name: "Text",
k: CompletionItemKindText,
want: "Text",
},
{
name: "Method",
k: CompletionItemKindMethod,
want: "Method",
},
{
name: "Function",
k: CompletionItemKindFunction,
want: "Function",
},
{
name: "Constructor",
k: CompletionItemKindConstructor,
want: "Constructor",
},
{
name: "Field",
k: CompletionItemKindField,
want: "Field",
},
{
name: "Variable",
k: CompletionItemKindVariable,
want: "Variable",
},
{
name: "Class",
k: CompletionItemKindClass,
want: "Class",
},
{
name: "Interface",
k: CompletionItemKindInterface,
want: "Interface",
},
{
name: "Module",
k: CompletionItemKindModule,
want: "Module",
},
{
name: "Property",
k: CompletionItemKindProperty,
want: "Property",
},
{
name: "Unit",
k: CompletionItemKindUnit,
want: "Unit",
},
{
name: "Value",
k: CompletionItemKindValue,
want: "Value",
},
{
name: "Enum",
k: CompletionItemKindEnum,
want: "Enum",
},
{
name: "Keyword",
k: CompletionItemKindKeyword,
want: "Keyword",
},
{
name: "Snippet",
k: CompletionItemKindSnippet,
want: "Snippet",
},
{
name: "Color",
k: CompletionItemKindColor,
want: "Color",
},
{
name: "File",
k: CompletionItemKindFile,
want: "File",
},
{
name: "Reference",
k: CompletionItemKindReference,
want: "Reference",
},
{
name: "Folder",
k: CompletionItemKindFolder,
want: "Folder",
},
{
name: "EnumMember",
k: CompletionItemKindEnumMember,
want: "EnumMember",
},
{
name: "Constant",
k: CompletionItemKindConstant,
want: "Constant",
},
{
name: "Struct",
k: CompletionItemKindStruct,
want: "Struct",
},
{
name: "Event",
k: CompletionItemKindEvent,
want: "Event",
},
{
name: "Operator",
k: CompletionItemKindOperator,
want: "Operator",
},
{
name: "TypeParameter",
k: CompletionItemKindTypeParameter,
want: "TypeParameter",
},
{
name: "Unknown",
k: CompletionItemKind(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("CompletionItemKind.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestCompletionItemTag_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k CompletionItemTag
want string
}{
{
name: "Deprecated",
k: CompletionItemTagDeprecated,
want: "Deprecated",
},
{
name: "Unknown",
k: CompletionItemTag(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("CompletionItemTag.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestCompletionRegistrationOptions(t *testing.T) {
t.Parallel()
const (
want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"}],"triggerCharacters":["."],"resolveProvider":true}`
wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"}],"triggerCharacters":[" "],"resolveProvider":true}`
)
wantType := CompletionRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
},
},
TriggerCharacters: []string{"."},
ResolveProvider: true,
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CompletionRegistrationOptions
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) {
tests := []struct {
name string
field string
want CompletionRegistrationOptions
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 CompletionRegistrationOptions
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 TestHoverParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
invalidWorkDoneToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `"}`
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":"` + invalidWorkDoneToken + `"}`
)
wantType := HoverParams{
TextDocumentPositionParams: TextDocumentPositionParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/basic.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
},
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
}
wantTypeNilAll := HoverParams{
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 HoverParams
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 HoverParams
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 HoverParams
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 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)
}
}
})
}
})
}
func TestHover(t *testing.T) {
t.Parallel()
const (
want = `{"contents":{"kind":"markdown","value":"example value"},"range":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}}}`
wantInvalid = `{"contents":{"kind":"markdown","value":"example value"},"range":{"start":{"line":25,"character":2},"end":{"line":25,"character":5}}}`
)
wantType := Hover{
Contents: MarkupContent{
Kind: Markdown,
Value: "example value",
},
Range: &Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field Hover
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) {
tests := []struct {
name string
field string
want Hover
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 Hover
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 TestSignatureHelpParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
invalidWorkDoneToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"textDocument":{"uri":"file:///path/to/basic.go"},"position":{"line":25,"character":1},"workDoneToken":"` + wantWorkDoneToken + `","context":{"triggerKind":1,"triggerCharacter":".","isRetrigger":true,"activeSignatureHelp":{"signatures":[{"label":"testLabel","documentation":"testDocumentation","parameters":[{"label":"test label","documentation":"test documentation"}]}],"activeParameter":10,"activeSignature":5}}}`
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":"` + invalidWorkDoneToken + `","context":{"triggerKind":0,"triggerCharacter":"aaa","isRetrigger":false,"activeSignatureHelp":{"signatures":[{"documentationFormat":["markdown"],"parameterInformation":{"label":"test label","documentation":"test documentation"}}],"activeParameter":1,"activeSignature":0}}}`
)
wantType := SignatureHelpParams{
TextDocumentPositionParams: TextDocumentPositionParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/basic.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
},
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
Context: &SignatureHelpContext{
TriggerKind: SignatureHelpTriggerKindInvoked,
TriggerCharacter: ".",
IsRetrigger: true,
ActiveSignatureHelp: &SignatureHelp{
Signatures: []SignatureInformation{
{
Label: "testLabel",
Documentation: "testDocumentation",
Parameters: []ParameterInformation{
{
Label: "test label",
Documentation: "test documentation",
},
},
},
},
ActiveParameter: 10,
ActiveSignature: 5,
},
},
}
wantTypeNilAll := SignatureHelpParams{
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 SignatureHelpParams
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 SignatureHelpParams
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 SignatureHelpParams
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 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)
}
}
})
}
})
}
func TestSignatureHelpTriggerKind_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k SignatureHelpTriggerKind
want string
}{
{
name: "Invoked",
k: SignatureHelpTriggerKindInvoked,
want: "Invoked",
},
{
name: "TriggerCharacter",
k: SignatureHelpTriggerKindTriggerCharacter,
want: "TriggerCharacter",
},
{
name: "ContentChange",
k: SignatureHelpTriggerKindContentChange,
want: "ContentChange",
},
{
name: "Unknown",
k: SignatureHelpTriggerKind(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("SignatureHelpTriggerKind.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestSignatureHelp(t *testing.T) {
t.Parallel()
const (
want = `{"signatures":[{"label":"testLabel","documentation":"testDocumentation","parameters":[{"label":"test label","documentation":"test documentation"}]}],"activeParameter":10,"activeSignature":5}`
wantNilAll = `{"signatures":[]}`
wantInvalid = `{"signatures":[{"label":"invalidLabel","documentation":"invalidDocumentation","parameters":[{"label":"test label","documentation":"test documentation"}]}],"activeParameter":1,"activeSignature":0}`
)
wantType := SignatureHelp{
Signatures: []SignatureInformation{
{
Label: "testLabel",
Documentation: "testDocumentation",
Parameters: []ParameterInformation{
{
Label: "test label",
Documentation: "test documentation",
},
},
},
},
ActiveParameter: 10,
ActiveSignature: 5,
}
wantTypeNilAll := SignatureHelp{
Signatures: []SignatureInformation{},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field SignatureHelp
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) {
tests := []struct {
name string
field string
want SignatureHelp
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 SignatureHelp
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 TestSignatureInformation(t *testing.T) {
t.Parallel()
const (
want = `{"label":"testLabel","documentation":"testDocumentation","parameters":[{"label":"test label","documentation":"test documentation"}],"activeParameter":5}`
wantInvalid = `{"label":"testLabel","documentation":"invalidDocumentation","parameters":[{"label":"test label","documentation":"test documentation"}],"activeParameter":50}`
)
wantType := SignatureInformation{
Label: "testLabel",
Documentation: "testDocumentation",
Parameters: []ParameterInformation{
{
Label: "test label",
Documentation: "test documentation",
},
},
ActiveParameter: uint32(5),
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field SignatureInformation
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) {
tests := []struct {
name string
field string
want SignatureInformation
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 SignatureInformation
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 TestParameterInformation(t *testing.T) {
t.Parallel()
const (
want = `{"label":"test label","documentation":"test documentation"}`
wantInvalid = `{"label":"invalid","documentation":"invalid"}`
)
wantType := ParameterInformation{
Label: "test label",
Documentation: "test documentation",
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field ParameterInformation
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) {
tests := []struct {
name string
field string
want ParameterInformation
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 ParameterInformation
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 TestSignatureHelpRegistrationOptions(t *testing.T) {
t.Parallel()
const (
want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"}],"triggerCharacters":["."]}`
wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"}],"triggerCharacters":[" "]}`
)
wantType := SignatureHelpRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
},
},
TriggerCharacters: []string{"."},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field SignatureHelpRegistrationOptions
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) {
tests := []struct {
name string
field string
want SignatureHelpRegistrationOptions
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 SignatureHelpRegistrationOptions
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 TestReferenceParams(t *testing.T) {
t.Parallel()
const (
want = `{"textDocument":{"uri":"file:///path/to/test.go"},"position":{"line":25,"character":1},"context":{"includeDeclaration":true}}`
wantInvalid = `{"textDocument":{"uri":"file:///path/to/test.go"},"position":{"line":2,"character":0},"context":{"includeDeclaration":false}}`
)
wantType := ReferenceParams{
TextDocumentPositionParams: TextDocumentPositionParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
},
Context: ReferenceContext{
IncludeDeclaration: true,
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field ReferenceParams
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) {
tests := []struct {
name string
field string
want ReferenceParams
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 ReferenceParams
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 TestReferenceContext(t *testing.T) {
t.Parallel()
const (
want = `{"includeDeclaration":true}`
wantInvalid = `{"includeDeclaration":false}`
)
wantType := ReferenceContext{
IncludeDeclaration: true,
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field ReferenceContext
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) {
tests := []struct {
name string
field string
want ReferenceContext
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 ReferenceContext
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 TestDocumentHighlight(t *testing.T) {
t.Parallel()
const (
want = `{"range":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}},"kind":1}`
wantInvalid = `{"range":{"start":{"line":25,"character":2},"end":{"line":25,"character":5}},"kind":1}`
)
wantType := DocumentHighlight{
Range: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
Kind: DocumentHighlightKindText,
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentHighlight
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) {
tests := []struct {
name string
field string
want DocumentHighlight
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 DocumentHighlight
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 TestDocumentHighlightKind_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k DocumentHighlightKind
want string
}{
{
name: "Text",
k: DocumentHighlightKindText,
want: "Text",
},
{
name: "Read",
k: DocumentHighlightKindRead,
want: "Read",
},
{
name: "Write",
k: DocumentHighlightKindWrite,
want: "Write",
},
{
name: "Unknown",
k: DocumentHighlightKind(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("DocumentHighlightKind.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestDocumentSymbolParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
wantType := DocumentSymbolParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
}
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","textDocument":{"uri":"file:///path/to/test.go"}}`
wantInvalid = `{"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","textDocument":{"uri":"file:///path/to/nottest.go"}}`
)
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentSymbolParams
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) {
tests := []struct {
name string
field string
want DocumentSymbolParams
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 DocumentSymbolParams
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 TestSymbolKind_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k SymbolKind
want string
}{
{
name: "File",
k: SymbolKindFile,
want: "File",
},
{
name: "Module",
k: SymbolKindModule,
want: "Module",
},
{
name: "Namespace",
k: SymbolKindNamespace,
want: "Namespace",
},
{
name: "Package",
k: SymbolKindPackage,
want: "Package",
},
{
name: "Class",
k: SymbolKindClass,
want: "Class",
},
{
name: "Method",
k: SymbolKindMethod,
want: "Method",
},
{
name: "Property",
k: SymbolKindProperty,
want: "Property",
},
{
name: "Field",
k: SymbolKindField,
want: "Field",
},
{
name: "Constructor",
k: SymbolKindConstructor,
want: "Constructor",
},
{
name: "Enum",
k: SymbolKindEnum,
want: "Enum",
},
{
name: "Interface",
k: SymbolKindInterface,
want: "Interface",
},
{
name: "Function",
k: SymbolKindFunction,
want: "Function",
},
{
name: "Variable",
k: SymbolKindVariable,
want: "Variable",
},
{
name: "Constant",
k: SymbolKindConstant,
want: "Constant",
},
{
name: "String",
k: SymbolKindString,
want: "String",
},
{
name: "Number",
k: SymbolKindNumber,
want: "Number",
},
{
name: "Boolean",
k: SymbolKindBoolean,
want: "Boolean",
},
{
name: "Array",
k: SymbolKindArray,
want: "Array",
},
{
name: "Object",
k: SymbolKindObject,
want: "Object",
},
{
name: "Key",
k: SymbolKindKey,
want: "Key",
},
{
name: "Null",
k: SymbolKindNull,
want: "Null",
},
{
name: "EnumMember",
k: SymbolKindEnumMember,
want: "EnumMember",
},
{
name: "Struct",
k: SymbolKindStruct,
want: "Struct",
},
{
name: "Event",
k: SymbolKindEvent,
want: "Event",
},
{
name: "Operator",
k: SymbolKindOperator,
want: "Operator",
},
{
name: "TypeParameter",
k: SymbolKindTypeParameter,
want: "TypeParameter",
},
{
name: "Unknown",
k: SymbolKind(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("SymbolKind.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestSymbolTag_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k SymbolTag
want string
}{
{
name: "Deprecated",
k: SymbolTagDeprecated,
want: "Deprecated",
},
{
name: "Unknown",
k: SymbolTag(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("SymbolTag.String() = %v, want %v", tt.want, got)
}
})
}
}
func TestDocumentSymbol(t *testing.T) {
t.Parallel()
const (
want = `{"name":"test symbol","detail":"test detail","kind":1,"tags":[1],"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":6}},"selectionRange":{"start":{"line":25,"character":3},"end":{"line":26,"character":10}},"children":[{"name":"child symbol","detail":"child detail","kind":11,"deprecated":true,"range":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}},"selectionRange":{"start":{"line":255,"character":5},"end":{"line":255,"character":8}}}]}`
wantInvalid = `{"name":"invalid symbol","detail":"invalid detail","kind":1,"tags":[0],"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"selectionRange":{"start":{"line":2,"character":5},"end":{"line":3,"character":1}},"children":[{"name":"invalid child symbol","kind":1,"detail":"invalid child detail","range":{"start":{"line":255,"character":4},"end":{"line":255,"character":10}},"selectionRange":{"start":{"line":255,"character":5},"end":{"line":255,"character":8}}}]}`
)
wantType := DocumentSymbol{
Name: "test symbol",
Detail: "test detail",
Kind: SymbolKindFile,
Tags: []SymbolTag{
SymbolTagDeprecated,
},
Deprecated: false,
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 6,
},
},
SelectionRange: Range{
Start: Position{
Line: 25,
Character: 3,
},
End: Position{
Line: 26,
Character: 10,
},
},
Children: []DocumentSymbol{
{
Name: "child symbol",
Detail: "child detail",
Kind: SymbolKindInterface,
Deprecated: true,
Range: Range{
Start: Position{
Line: 255,
Character: 4,
},
End: Position{
Line: 255,
Character: 10,
},
},
SelectionRange: Range{
Start: Position{
Line: 255,
Character: 5,
},
End: Position{
Line: 255,
Character: 8,
},
},
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentSymbol
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) {
tests := []struct {
name string
field string
want DocumentSymbol
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 DocumentSymbol
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 TestSymbolInformation(t *testing.T) {
t.Parallel()
const (
want = `{"name":"test symbol","kind":1,"tags":[1],"deprecated":true,"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}},"containerName":"testContainerName"}`
wantNilAll = `{"name":"test symbol","kind":1,"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}}}`
wantInvalid = `{"name":"invalid symbol","kind":1,"tags":[0],"deprecated":false,"location":{"uri":"file:///path/to/test_test.go","range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}}},"containerName":"invalidContainerName"}`
)
wantType := SymbolInformation{
Name: "test symbol",
Kind: 1,
Tags: []SymbolTag{
SymbolTagDeprecated,
},
Deprecated: true,
Location: Location{
URI: uri.File("/path/to/test.go"),
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
},
ContainerName: "testContainerName",
}
wantTypeNilAll := SymbolInformation{
Name: "test symbol",
Kind: 1,
Deprecated: false,
Location: Location{
URI: uri.File("/path/to/test.go"),
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field SymbolInformation
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) {
tests := []struct {
name string
field string
want SymbolInformation
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 SymbolInformation
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 TestCodeActionParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","textDocument":{"uri":"file:///path/to/test.go"},"context":{"diagnostics":[{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"severity":1,"code":"foo/bar","source":"test foo bar","message":"foo bar","relatedInformation":[{"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}},"message":"test.go"}]}],"only":["quickfix"]},"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":6}}}`
wantInvalid = `{"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","textDocument":{"uri":"file:///path/to/test.go"},"context":{"diagnostics":[{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"severity":1,"code":"foo/bar","source":"test foo bar","message":"foo bar","relatedInformation":[{"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}},"message":"test.go"}]}],"only":["quickfix"]},"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}}}`
)
wantType := CodeActionParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Context: CodeActionContext{
Diagnostics: []Diagnostic{
{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
Severity: DiagnosticSeverityError,
Code: "foo/bar",
Source: "test foo bar",
Message: "foo bar",
RelatedInformation: []DiagnosticRelatedInformation{
{
Location: Location{
URI: uri.File("/path/to/test.go"),
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
},
Message: "test.go",
},
},
},
},
Only: []CodeActionKind{
QuickFix,
},
},
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 6,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CodeActionParams
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) {
tests := []struct {
name string
field string
want CodeActionParams
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 CodeActionParams
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 TestCodeActionKind_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
k CodeActionKind
want string
}{
{
name: "QuickFix",
k: QuickFix,
want: "quickfix",
},
{
name: "Refactor",
k: Refactor,
want: "refactor",
},
{
name: "RefactorExtract",
k: RefactorExtract,
want: "refactor.extract",
},
{
name: "RefactorInline",
k: RefactorInline,
want: "refactor.inline",
},
{
name: "RefactorRewrite",
k: RefactorRewrite,
want: "refactor.rewrite",
},
{
name: "Source",
k: Source,
want: "source",
},
{
name: "SourceOrganizeImports",
k: SourceOrganizeImports,
want: "source.organizeImports",
},
{
name: "Unknown",
k: CodeActionKind(""),
want: "",
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if got := tt.k; got != CodeActionKind(tt.want) {
t.Errorf("CodeActionKind = %v, want %v", tt.want, got)
}
})
}
}
func TestCodeActionContext(t *testing.T) {
t.Parallel()
const (
want = `{"diagnostics":[{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"severity":1,"code":"foo/bar","source":"test foo bar","message":"foo bar","relatedInformation":[{"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}},"message":"test.go"}]}],"only":["quickfix"]}`
wantInvalid = `{"diagnostics":[{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"severity":1,"code":"foo/bar","source":"test foo bar","message":"foo bar","relatedInformation":[{"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}},"message":"test.go"}]}],"only":["quickfix"]}`
)
wantType := CodeActionContext{
Diagnostics: []Diagnostic{
{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
Severity: DiagnosticSeverityError,
Code: "foo/bar",
Source: "test foo bar",
Message: "foo bar",
RelatedInformation: []DiagnosticRelatedInformation{
{
Location: Location{
URI: uri.File("/path/to/test.go"),
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
},
Message: "test.go",
},
},
},
},
Only: []CodeActionKind{
QuickFix,
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CodeActionContext
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) {
tests := []struct {
name string
field string
want CodeActionContext
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 CodeActionContext
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 TestCodeAction(t *testing.T) {
t.Parallel()
const (
want = `{"title":"Refactoring","kind":"refactor.rewrite","diagnostics":[{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"severity":1,"code":"foo/bar","source":"test foo bar","message":"foo bar","relatedInformation":[{"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}},"message":"test.go"}]}],"isPreferred":true,"disabled":{"reason":"testReason"},"edit":{"changes":{"file:///path/to/test.go":[{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"newText":"foo bar"}]},"documentChanges":[{"textDocument":{"uri":"file:///path/to/test.go","version":10},"edits":[{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"newText":"foo bar"}]}]},"command":{"title":"rewrite","command":"rewriter","arguments":["-w"]},"data":"testData"}`
wantInvalid = `{"title":"Refactoring","kind":"refactor","diagnostics":[{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"severity":1,"code":"foo/bar","source":"test foo bar","message":"foo bar","relatedInformation":[{"location":{"uri":"file:///path/to/test.go","range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}},"message":"test.go"}]}],"isPreferred":false,"disabled":{"reason":"invalidReason"},"edit":{"changes":{"file:///path/to/test.go":[{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"newText":"foo bar"}]},"documentChanges":[{"textDocument":{"uri":"file:///path/to/test.go","version":10},"edits":[{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"newText":"foo bar"}]}]},"command":{"title":"rewrite","command":"rewriter","arguments":["-w"]}}`
)
wantType := CodeAction{
Title: "Refactoring",
Kind: RefactorRewrite,
Diagnostics: []Diagnostic{
{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
Severity: DiagnosticSeverityError,
Code: "foo/bar",
Source: "test foo bar",
Message: "foo bar",
RelatedInformation: []DiagnosticRelatedInformation{
{
Location: Location{
URI: uri.File("/path/to/test.go"),
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
},
Message: "test.go",
},
},
},
},
IsPreferred: true,
Disabled: &CodeActionDisable{
Reason: "testReason",
},
Edit: &WorkspaceEdit{
Changes: map[uri.URI][]TextEdit{
uri.File("/path/to/test.go"): {
{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
NewText: "foo bar",
},
},
},
DocumentChanges: []TextDocumentEdit{
{
TextDocument: OptionalVersionedTextDocumentIdentifier{
TextDocumentIdentifier: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Version: NewVersion(int32(10)),
},
Edits: []TextEdit{
{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
NewText: "foo bar",
},
},
},
},
},
Command: &Command{
Title: "rewrite",
Command: "rewriter",
Arguments: []any{"-w"},
},
Data: "testData",
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CodeAction
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) {
tests := []struct {
name string
field string
want CodeAction
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 CodeAction
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 TestCodeActionRegistrationOptions(t *testing.T) {
t.Parallel()
const (
want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"},{"language":"cpp","scheme":"untitled","pattern":"*.{cpp,hpp}"}],"codeActionKinds":["quickfix","refactor"]}`
wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"},{"language":"c","scheme":"untitled","pattern":"*.{c,h}"}],"codeActionKinds":["quickfix","refactor"]}`
)
wantType := CodeActionRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
{
Language: "cpp",
Scheme: "untitled",
Pattern: "*.{cpp,hpp}",
},
},
},
CodeActionOptions: CodeActionOptions{
CodeActionKinds: []CodeActionKind{
QuickFix,
Refactor,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CodeActionRegistrationOptions
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) {
tests := []struct {
name string
field string
want CodeActionRegistrationOptions
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 CodeActionRegistrationOptions
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 TestCodeLensParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","textDocument":{"uri":"file:///path/to/test.go"}}`
wantInvalid = `{"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","textDocument":{"uri":"file:///path/to/invalid.go"}}`
)
wantType := CodeLensParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CodeLensParams
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) {
tests := []struct {
name string
field string
want CodeLensParams
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 CodeLensParams
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 TestCodeLens(t *testing.T) {
t.Parallel()
const (
want = `{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"command":{"title":"rewrite","command":"rewriter","arguments":["-w"]},"data":"testData"}`
wantNilAll = `{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}}`
wantInvalid = `{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"command":{"title":"rewrite","command":"rewriter","arguments":["-w"]},"data":"invalidData"}`
)
wantType := CodeLens{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
Command: &Command{
Title: "rewrite",
Command: "rewriter",
Arguments: []any{"-w"},
},
Data: "testData",
}
wantTypeNilAll := CodeLens{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CodeLens
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) {
tests := []struct {
name string
field string
want CodeLens
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 CodeLens
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 TestCodeLensRegistrationOptions(t *testing.T) {
t.Parallel()
const (
want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"},{"language":"cpp","scheme":"untitled","pattern":"*.{cpp,hpp}"}],"resolveProvider":true}`
wantNilAll = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"},{"language":"cpp","scheme":"untitled","pattern":"*.{cpp,hpp}"}]}`
wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"},{"language":"c","scheme":"untitled","pattern":"*.{c,h}"}],"resolveProvider":false}`
)
wantType := CodeLensRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
{
Language: "cpp",
Scheme: "untitled",
Pattern: "*.{cpp,hpp}",
},
},
},
ResolveProvider: true,
}
wantTypeNilAll := CodeLensRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
{
Language: "cpp",
Scheme: "untitled",
Pattern: "*.{cpp,hpp}",
},
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field CodeLensRegistrationOptions
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) {
tests := []struct {
name string
field string
want CodeLensRegistrationOptions
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 CodeLensRegistrationOptions
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 TestDocumentLinkParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","textDocument":{"uri":"file:///path/to/test.go"}}`
wantNilAll = `{"textDocument":{"uri":"file:///path/to/test.go"}}`
wantInvalid = `{"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","textDocument":{"uri":"file:///path/to/invalid.go"}}`
)
wantType := DocumentLinkParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentLinkParams
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) {
tests := []struct {
name string
field string
want DocumentLinkParams
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 DocumentLinkParams
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 TestDocumentLink(t *testing.T) {
t.Parallel()
const (
want = `{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"target":"file:///path/to/test.go","tooltip":"testTooltip","data":"testData"}`
wantNilAll = `{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}}`
wantInvalid = `{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"target":"file:///path/to/test.go","tooltip":"invalidTooltip","data":"testData"}`
)
wantType := DocumentLink{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
Target: uri.File("/path/to/test.go"),
Tooltip: "testTooltip",
Data: "testData",
}
wantTypeNilAll := DocumentLink{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentLink
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) {
tests := []struct {
name string
field string
want DocumentLink
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 DocumentLink
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 TestDocumentColorParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","textDocument":{"uri":"file:///path/to/test.go"}}`
wantInvalid = `{"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","textDocument":{"uri":"file:///path/to/invalid.go"}}`
)
wantType := DocumentColorParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentColorParams
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) {
tests := []struct {
name string
field string
want DocumentColorParams
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 DocumentColorParams
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 TestColorInformation(t *testing.T) {
t.Parallel()
const (
want = `{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"color":{"alpha":1,"blue":0.2,"green":0.3,"red":0.4}}`
wantInvalid = `{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"color":{"alpha":0,"blue":0.4,"green":0.3,"red":0.2}}`
)
wantType := ColorInformation{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
Color: Color{
Alpha: 1,
Blue: 0.2,
Green: 0.3,
Red: 0.4,
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field ColorInformation
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) {
tests := []struct {
name string
field string
want ColorInformation
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 ColorInformation
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 TestColor(t *testing.T) {
t.Parallel()
const (
want = `{"alpha":1,"blue":0.2,"green":0.3,"red":0.4}`
wantInvalid = `{"alpha":0,"blue":0.4,"green":0.3,"red":0.2}`
)
wantType := Color{
Alpha: 1,
Blue: 0.2,
Green: 0.3,
Red: 0.4,
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field Color
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) {
tests := []struct {
name string
field string
want Color
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 Color
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 TestColorPresentationParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
wantPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","partialResultToken":"` + wantPartialResultToken + `","textDocument":{"uri":"file:///path/to/test.go"},"color":{"alpha":1,"blue":0.2,"green":0.3,"red":0.4},"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}}}`
wantInvalid = `{"workDoneToken":"` + wantPartialResultToken + `","partialResultToken":"` + wantWorkDoneToken + `","textDocument":{"uri":"file:///path/to/test.go"},"color":{"alpha":0,"blue":0.4,"green":0.3,"red":0.2},"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}}}`
)
wantType := ColorPresentationParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Color: Color{
Alpha: 1,
Blue: 0.2,
Green: 0.3,
Red: 0.4,
},
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field ColorPresentationParams
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) {
tests := []struct {
name string
field string
want ColorPresentationParams
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 ColorPresentationParams
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 TestColorPresentation(t *testing.T) {
t.Parallel()
const (
want = `{"label":"testLabel","textEdit":{"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"newText":"foo bar"},"additionalTextEdits":[{"range":{"start":{"line":100,"character":10},"end":{"line":102,"character":15}},"newText":"baz qux"}]}`
wantNilAll = `{"label":"testLabel"}`
wantInvalid = `{"label":"invalidLabel","textEdit":{"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"newText":"quux quuz"},"additionalTextEdits":[{"range":{"start":{"line":105,"character":15},"end":{"line":107,"character":20}},"newText":"corge grault"}]}`
)
wantType := ColorPresentation{
Label: "testLabel",
TextEdit: &TextEdit{
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
NewText: "foo bar",
},
AdditionalTextEdits: []TextEdit{
{
Range: Range{
Start: Position{
Line: 100,
Character: 10,
},
End: Position{
Line: 102,
Character: 15,
},
},
NewText: "baz qux",
},
},
}
wantTypeNilAll := ColorPresentation{
Label: "testLabel",
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field ColorPresentation
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) {
tests := []struct {
name string
field string
want ColorPresentation
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 ColorPresentation
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 TestDocumentFormattingParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
invalidWorkDoneToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","options":{"insertSpaces":true,"tabSize":4},"textDocument":{"uri":"file:///path/to/test.go"}}`
wantInvalid = `{"workDoneToken":"` + invalidWorkDoneToken + `","options":{"insertSpaces":false,"tabSize":2},"textDocument":{"uri":"file:///path/to/invalid.go"}}`
)
wantType := DocumentFormattingParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
Options: FormattingOptions{
InsertSpaces: true,
TabSize: 4,
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentFormattingParams
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) {
tests := []struct {
name string
field string
want DocumentFormattingParams
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 DocumentFormattingParams
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 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)
}
}
})
}
})
}
func TestFormattingOptions(t *testing.T) {
t.Parallel()
const (
want = `{"insertSpaces":true,"tabSize":4,"trimTrailingWhitespace":true,"insertFinalNewline":true,"trimFinalNewlines":true,"key":{"test":"key"}}`
wantInvalid = `{"insertSpaces":false,"tabSize":2,"trimTrailingWhitespace":false,"insertFinalNewline":false,"trimFinalNewlines":false}`
)
wantType := FormattingOptions{
InsertSpaces: true,
TabSize: 4,
TrimTrailingWhitespace: true,
InsertFinalNewline: true,
TrimFinalNewlines: true,
Key: map[string]any{
"test": "key",
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field FormattingOptions
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) {
tests := []struct {
name string
field string
want FormattingOptions
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 FormattingOptions
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 TestDocumentRangeFormattingParams(t *testing.T) {
t.Parallel()
const (
wantWorkDoneToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
invalidWorkDoneToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"workDoneToken":"` + wantWorkDoneToken + `","textDocument":{"uri":"file:///path/to/test.go"},"range":{"start":{"line":25,"character":1},"end":{"line":27,"character":3}},"options":{"insertSpaces":true,"tabSize":4}}`
wantInvalid = `{"workDoneToken":"` + invalidWorkDoneToken + `","textDocument":{"uri":"file:///path/to/invalid.go"},"range":{"start":{"line":2,"character":1},"end":{"line":3,"character":2}},"options":{"insertSpaces":false,"tabSize":2}}`
)
wantType := DocumentRangeFormattingParams{
WorkDoneProgressParams: WorkDoneProgressParams{
WorkDoneToken: NewProgressToken(wantWorkDoneToken),
},
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Range: Range{
Start: Position{
Line: 25,
Character: 1,
},
End: Position{
Line: 27,
Character: 3,
},
},
Options: FormattingOptions{
InsertSpaces: true,
TabSize: 4,
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentRangeFormattingParams
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) {
tests := []struct {
name string
field string
want DocumentRangeFormattingParams
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 DocumentRangeFormattingParams
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 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)
}
}
})
}
})
}
func TestDocumentOnTypeFormattingParams(t *testing.T) {
t.Parallel()
const (
want = `{"textDocument":{"uri":"file:///path/to/test.go"},"position":{"line":25,"character":1},"ch":"character","options":{"insertSpaces":true,"tabSize":4}}`
wantInvalid = `{"textDocument":{"uri":"file:///path/to/invalid.go"},"position":{"line":2,"character":1},"ch":"invalidChar","options":{"insertSpaces":false,"tabSize":2}}`
)
wantType := DocumentOnTypeFormattingParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
Ch: "character",
Options: FormattingOptions{
InsertSpaces: true,
TabSize: 4,
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentOnTypeFormattingParams
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) {
tests := []struct {
name string
field string
want DocumentOnTypeFormattingParams
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 DocumentOnTypeFormattingParams
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 TestDocumentOnTypeFormattingRegistrationOptions(t *testing.T) {
t.Parallel()
const (
want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"},{"language":"cpp","scheme":"untitled","pattern":"*.{cpp,hpp}"}],"firstTriggerCharacter":"}","moreTriggerCharacter":[".","{"]}`
wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"},{"language":"c","scheme":"untitled","pattern":"*.{c,h}"}],"firstTriggerCharacter":"{","moreTriggerCharacter":[" ","("]}`
)
wantType := DocumentOnTypeFormattingRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
{
Language: "cpp",
Scheme: "untitled",
Pattern: "*.{cpp,hpp}",
},
},
},
FirstTriggerCharacter: "}",
MoreTriggerCharacter: []string{".", "{"},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field DocumentOnTypeFormattingRegistrationOptions
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) {
tests := []struct {
name string
field string
want DocumentOnTypeFormattingRegistrationOptions
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 DocumentOnTypeFormattingRegistrationOptions
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 TestRenameParams(t *testing.T) {
t.Parallel()
const (
wantPartialResultToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
invalidPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"textDocument":{"uri":"file:///path/to/test.go"},"position":{"line":25,"character":1},"partialResultToken":"` + wantPartialResultToken + `","newName":"newNameSymbol"}`
wantInvalid = `{"textDocument":{"uri":"file:///path/to/invalid.go"},"position":{"line":2,"character":1},"partialResultToken":"` + invalidPartialResultToken + `","newName":"invalidSymbol"}`
)
wantType := RenameParams{
TextDocumentPositionParams: TextDocumentPositionParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
NewName: "newNameSymbol",
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field RenameParams
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) {
tests := []struct {
name string
field string
want RenameParams
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 RenameParams
if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr {
t.Fatal(err)
}
if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(PartialResultParams{})); (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 TestRenameRegistrationOptions(t *testing.T) {
t.Parallel()
const (
want = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"},{"language":"cpp","scheme":"untitled","pattern":"*.{cpp,hpp}"}],"prepareProvider":true}`
wantNilAll = `{"documentSelector":[{"language":"go","scheme":"file","pattern":"*.go"},{"language":"cpp","scheme":"untitled","pattern":"*.{cpp,hpp}"}]}`
wantInvalid = `{"documentSelector":[{"language":"typescript","scheme":"file","pattern":"*.{ts,js}"},{"language":"c","scheme":"untitled","pattern":"*.{c,h}"}],"prepareProvider":false}`
)
wantType := RenameRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
{
Language: "cpp",
Scheme: "untitled",
Pattern: "*.{cpp,hpp}",
},
},
},
PrepareProvider: true,
}
wantTypeNilAll := RenameRegistrationOptions{
TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
DocumentSelector: DocumentSelector{
{
Language: "go",
Scheme: "file",
Pattern: "*.go",
},
{
Language: "cpp",
Scheme: "untitled",
Pattern: "*.{cpp,hpp}",
},
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field RenameRegistrationOptions
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) {
tests := []struct {
name string
field string
want RenameRegistrationOptions
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 RenameRegistrationOptions
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 TestPrepareRenameParams(t *testing.T) {
t.Parallel()
const (
want = `{"textDocument":{"uri":"file:///path/to/test.go"},"position":{"line":25,"character":1}}`
wantInvalid = `{"textDocument":{"uri":"file:///path/to/invalid.go"},"position":{"line":2,"character":0}}`
)
wantType := PrepareRenameParams{
TextDocumentPositionParams: TextDocumentPositionParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field PrepareRenameParams
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) {
tests := []struct {
name string
field string
want PrepareRenameParams
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 PrepareRenameParams
if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr {
t.Fatal(err)
}
if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(PartialResultParams{})); (diff != "") != tt.wantErr {
t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff)
}
})
}
})
}
func TestFoldingRangeParams(t *testing.T) {
t.Parallel()
const (
wantPartialResultToken = "156edea9-9d8d-422f-b7ee-81a84594afbb"
invalidPartialResultToken = "dd134d84-c134-4d7a-a2a3-f8af3ef4a568"
)
const (
want = `{"textDocument":{"uri":"file:///path/to/test.go"},"position":{"line":25,"character":1},"partialResultToken":"` + wantPartialResultToken + `"}`
wantInvalid = `{"textDocument":{"uri":"file:///path/to/invalid.go"},"position":{"line":2,"character":0},"partialResultToken":"` + invalidPartialResultToken + `"}`
)
wantType := FoldingRangeParams{
TextDocumentPositionParams: TextDocumentPositionParams{
TextDocument: TextDocumentIdentifier{
URI: uri.File("/path/to/test.go"),
},
Position: Position{
Line: 25,
Character: 1,
},
},
PartialResultParams: PartialResultParams{
PartialResultToken: NewProgressToken(wantPartialResultToken),
},
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field FoldingRangeParams
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) {
tests := []struct {
name string
field string
want FoldingRangeParams
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 FoldingRangeParams
if err := json.Unmarshal([]byte(tt.field), &got); (err != nil) != tt.wantUnmarshalErr {
t.Fatal(err)
}
if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreTypes(PartialResultParams{})); (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 TestFoldingRangeKind_String(t *testing.T) {
t.Parallel()
tests := []struct {
name string
s FoldingRangeKind
want string
}{
{
name: "Comment",
s: CommentFoldingRange,
want: "comment",
},
{
name: "Imports",
s: ImportsFoldingRange,
want: "imports",
},
{
name: "Region",
s: RegionFoldingRange,
want: "region",
},
{
name: "Unknown",
s: FoldingRangeKind(""),
want: "",
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
if got := tt.s; !strings.EqualFold(tt.want, string(got)) {
t.Errorf("FoldingRangeKind(%v), want %v", tt.want, got)
}
})
}
}
func TestFoldingRange(t *testing.T) {
t.Parallel()
const (
want = `{"startLine":10,"startCharacter":1,"endLine":10,"endCharacter":8,"kind":"imports"}`
wantNilAll = `{"startLine":10,"endLine":10}`
wantInvalid = `{"startLine":0,"startCharacter":1,"endLine":0,"endCharacter":8,"kind":"comment"}`
)
wantType := FoldingRange{
StartLine: 10,
StartCharacter: 1,
EndLine: 10,
EndCharacter: 8,
Kind: ImportsFoldingRange,
}
wantTypeNilAll := FoldingRange{
StartLine: 10,
EndLine: 10,
}
t.Run("Marshal", func(t *testing.T) {
tests := []struct {
name string
field FoldingRange
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) {
tests := []struct {
name string
field string
want FoldingRange
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 FoldingRange
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)
}
})
}
})
}