580 lines
13 KiB
Go
580 lines
13 KiB
Go
|
// SPDX-FileCopyrightText: 2020 The Go Language Server Authors
|
||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
|
||
|
package protocol
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"encoding/json"
|
||
|
"github.com/google/go-cmp/cmp"
|
||
|
)
|
||
|
|
||
|
func TestRegistration(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
const (
|
||
|
want = `{"id":"1","method":"testMethod","registerOptions":{"foo":"bar"}}`
|
||
|
wantInterfaces = `{"id":"1","method":"testMethod","registerOptions":["foo","bar"]}`
|
||
|
wantNil = `{"id":"1","method":"testMethod"}`
|
||
|
wantInvalid = `{"id":"2","method":"invalidMethod","registerOptions":{"baz":"qux"}}`
|
||
|
)
|
||
|
wantTypeStringInterface := Registration{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
RegisterOptions: map[string]any{
|
||
|
"foo": "bar",
|
||
|
},
|
||
|
}
|
||
|
wantTypeStringString := Registration{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
RegisterOptions: map[string]string{
|
||
|
"foo": "bar",
|
||
|
},
|
||
|
}
|
||
|
wantTypeInterfaces := Registration{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
RegisterOptions: []any{
|
||
|
"foo",
|
||
|
"bar",
|
||
|
},
|
||
|
}
|
||
|
wantTypeNil := Registration{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
}
|
||
|
|
||
|
t.Run("Marshal", func(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
field Registration
|
||
|
want string
|
||
|
wantMarshalErr bool
|
||
|
wantErr bool
|
||
|
}{
|
||
|
{
|
||
|
name: "ValidStringInterface",
|
||
|
field: wantTypeStringInterface,
|
||
|
want: want,
|
||
|
wantMarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "ValidStringString",
|
||
|
field: wantTypeStringString,
|
||
|
want: want,
|
||
|
wantMarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "ValidInterfaces",
|
||
|
field: wantTypeInterfaces,
|
||
|
want: wantInterfaces,
|
||
|
wantMarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "ValidNilAll",
|
||
|
field: wantTypeNil,
|
||
|
want: wantNil,
|
||
|
wantMarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "Invalid",
|
||
|
field: wantTypeStringInterface,
|
||
|
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 Registration
|
||
|
wantUnmarshalErr bool
|
||
|
wantErr bool
|
||
|
}{
|
||
|
{
|
||
|
name: "ValidStringInterface",
|
||
|
field: want,
|
||
|
want: wantTypeStringInterface,
|
||
|
wantUnmarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "ValidInterfaces",
|
||
|
field: wantInterfaces,
|
||
|
want: wantTypeInterfaces,
|
||
|
wantUnmarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "ValidNilAll",
|
||
|
field: wantNil,
|
||
|
want: wantTypeNil,
|
||
|
wantUnmarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "Invalid",
|
||
|
field: wantInvalid,
|
||
|
want: wantTypeStringInterface,
|
||
|
wantUnmarshalErr: false,
|
||
|
wantErr: true,
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
tt := tt
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
var got Registration
|
||
|
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 TestRegistrationParams(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
const (
|
||
|
want = `{"registrations":[{"id":"1","method":"testMethod","registerOptions":{"foo":"bar"}}]}`
|
||
|
wantNil = `{"registrations":[{"id":"1","method":"testMethod"}]}`
|
||
|
wantInvalid = `{"registrations":[{"id":"2","method":"invalidMethod","registerOptions":{"baz":"qux"}}]}`
|
||
|
)
|
||
|
wantType := RegistrationParams{
|
||
|
Registrations: []Registration{
|
||
|
{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
RegisterOptions: map[string]any{
|
||
|
"foo": "bar",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
wantTypeNil := RegistrationParams{
|
||
|
Registrations: []Registration{
|
||
|
{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
t.Run("Marshal", func(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
field RegistrationParams
|
||
|
want string
|
||
|
wantMarshalErr bool
|
||
|
wantErr bool
|
||
|
}{
|
||
|
{
|
||
|
name: "Valid",
|
||
|
field: wantType,
|
||
|
want: want,
|
||
|
wantMarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "ValidNilAll",
|
||
|
field: wantTypeNil,
|
||
|
want: wantNil,
|
||
|
wantMarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "Invalid",
|
||
|
field: wantType,
|
||
|
want: wantInvalid,
|
||
|
wantMarshalErr: false,
|
||
|
wantErr: true,
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
tt := tt
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
got, err := json.Marshal(&tt.field)
|
||
|
if (err != nil) != tt.wantMarshalErr {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
if diff := cmp.Diff(tt.want, string(got)); (diff != "") != tt.wantErr {
|
||
|
t.Errorf("%s: wantErr: %t\n(-want +got)\n%s", tt.name, tt.wantErr, diff)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
})
|
||
|
|
||
|
t.Run("Unmarshal", func(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
field string
|
||
|
want RegistrationParams
|
||
|
wantUnmarshalErr bool
|
||
|
wantErr bool
|
||
|
}{
|
||
|
{
|
||
|
name: "Valid",
|
||
|
field: want,
|
||
|
want: wantType,
|
||
|
wantUnmarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "ValidNilAll",
|
||
|
field: wantNil,
|
||
|
want: wantTypeNil,
|
||
|
wantUnmarshalErr: false,
|
||
|
wantErr: false,
|
||
|
},
|
||
|
{
|
||
|
name: "Invalid",
|
||
|
field: wantInvalid,
|
||
|
want: wantType,
|
||
|
wantUnmarshalErr: false,
|
||
|
wantErr: true,
|
||
|
},
|
||
|
}
|
||
|
for _, tt := range tests {
|
||
|
tt := tt
|
||
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
var got RegistrationParams
|
||
|
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 TestTextDocumentRegistrationOptions(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
const (
|
||
|
want = `{"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}"}]}`
|
||
|
)
|
||
|
wantType := 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 TextDocumentRegistrationOptions
|
||
|
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 TextDocumentRegistrationOptions
|
||
|
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 TextDocumentRegistrationOptions
|
||
|
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 TestUnregistration(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
const (
|
||
|
want = `{"id":"1","method":"testMethod"}`
|
||
|
wantInvalid = `{"id":"2","method":"invalidMethod"}`
|
||
|
)
|
||
|
wantType := Unregistration{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
}
|
||
|
|
||
|
t.Run("Marshal", func(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
field Unregistration
|
||
|
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 Unregistration
|
||
|
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 Unregistration
|
||
|
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 TestUnregistrationParams(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
const (
|
||
|
want = `{"unregisterations":[{"id":"1","method":"testMethod"}]}`
|
||
|
wantInvalid = `{"unregisterations":[{"id":"2","method":"invalidMethod"}]}`
|
||
|
)
|
||
|
wantType := UnregistrationParams{
|
||
|
Unregisterations: []Unregistration{
|
||
|
{
|
||
|
ID: "1",
|
||
|
Method: "testMethod",
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
t.Run("Marshal", func(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
field UnregistrationParams
|
||
|
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 UnregistrationParams
|
||
|
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 UnregistrationParams
|
||
|
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)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
})
|
||
|
}
|