mirror of
https://github.com/laravel-ls/protocol.git
synced 2026-06-16 03:54:56 +02:00
158 lines
4.7 KiB
Go
158 lines
4.7 KiB
Go
package protocol_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/laravel-ls/protocol"
|
|
)
|
|
|
|
func Test_InlayHint_ParamsUnmarshalValidJSON(t *testing.T) {
|
|
data := []byte(`{"textDocument":{"uri":"file:///tmp/main.go"},"range":{"start":{"line":1,"character":2},"end":{"line":1,"character":8}}}`)
|
|
|
|
var params protocol.InlayHintParams
|
|
if err := json.Unmarshal(data, ¶ms); err != nil {
|
|
t.Fatalf("unmarshal InlayHintParams failed: %v", err)
|
|
}
|
|
|
|
if params.TextDocument.URI != "file:///tmp/main.go" {
|
|
t.Fatalf("unexpected textDocument URI: %q", params.TextDocument.URI)
|
|
}
|
|
|
|
if params.Range.Start.Line != 1 || params.Range.End.Character != 8 {
|
|
t.Fatalf("unexpected range: %+v", params.Range)
|
|
}
|
|
}
|
|
|
|
func Test_InlayHintLabel_UnmarshalString(t *testing.T) {
|
|
var label protocol.InlayHintLabel
|
|
if err := json.Unmarshal([]byte(`"x:"`), &label); err != nil {
|
|
t.Fatalf("unmarshal InlayHintLabel string failed: %v", err)
|
|
}
|
|
|
|
if label.String == nil || *label.String != "x:" {
|
|
t.Fatalf("expected string label 'x:', got %+v", label)
|
|
}
|
|
|
|
if label.Parts != nil {
|
|
t.Fatalf("expected parts to be nil for string label")
|
|
}
|
|
}
|
|
|
|
func Test_InlayHintLabel_UnmarshalParts(t *testing.T) {
|
|
data := []byte(`[{"value":"name"},{"value":":","tooltip":"separator"}]`)
|
|
|
|
var label protocol.InlayHintLabel
|
|
if err := json.Unmarshal(data, &label); err != nil {
|
|
t.Fatalf("unmarshal InlayHintLabel parts failed: %v", err)
|
|
}
|
|
|
|
if len(label.Parts) != 2 {
|
|
t.Fatalf("expected 2 label parts, got %d", len(label.Parts))
|
|
}
|
|
|
|
if label.Parts[1].Tooltip == nil || label.Parts[1].Tooltip.String == nil || *label.Parts[1].Tooltip.String != "separator" {
|
|
t.Fatalf("expected second part tooltip string to be set, got %+v", label.Parts[1].Tooltip)
|
|
}
|
|
}
|
|
|
|
func Test_InlayHintTooltip_UnmarshalMarkupContent(t *testing.T) {
|
|
data := []byte(`{"kind":"markdown","value":"**hint**"}`)
|
|
|
|
var tooltip protocol.InlayHintTooltip
|
|
if err := json.Unmarshal(data, &tooltip); err != nil {
|
|
t.Fatalf("unmarshal InlayHintTooltip markup failed: %v", err)
|
|
}
|
|
|
|
if tooltip.MarkupContent == nil || tooltip.MarkupContent.Kind != protocol.MarkupKindMarkdown {
|
|
t.Fatalf("expected markdown tooltip, got %+v", tooltip)
|
|
}
|
|
}
|
|
|
|
func Test_InlayHint_UnmarshalTypedObject(t *testing.T) {
|
|
data := []byte(`{
|
|
"position": {"line": 2, "character": 10},
|
|
"label": [{"value":"x"},{"value":":","tooltip":{"kind":"plaintext","value":"type separator"}}],
|
|
"kind": 1,
|
|
"textEdits": [{"range":{"start":{"line":2,"character":8},"end":{"line":2,"character":9}},"newText":"value"}],
|
|
"tooltip": "inferred type",
|
|
"paddingLeft": true,
|
|
"paddingRight": false,
|
|
"data": {"id": 42}
|
|
}`)
|
|
|
|
var hint protocol.InlayHint
|
|
if err := json.Unmarshal(data, &hint); err != nil {
|
|
t.Fatalf("unmarshal InlayHint failed: %v", err)
|
|
}
|
|
|
|
if hint.Position.Line != 2 || hint.Position.Character != 10 {
|
|
t.Fatalf("unexpected position: %+v", hint.Position)
|
|
}
|
|
|
|
if hint.Kind == nil || *hint.Kind != protocol.InlayHintKindType {
|
|
t.Fatalf("expected kind=InlayHintKindType, got %+v", hint.Kind)
|
|
}
|
|
|
|
if hint.Tooltip == nil || hint.Tooltip.String == nil || *hint.Tooltip.String != "inferred type" {
|
|
t.Fatalf("expected tooltip string 'inferred type', got %+v", hint.Tooltip)
|
|
}
|
|
|
|
if len(hint.TextEdits) != 1 {
|
|
t.Fatalf("expected 1 text edit, got %d", len(hint.TextEdits))
|
|
}
|
|
}
|
|
|
|
func Test_InlayHintResponse_UnmarshalArrayAndNull(t *testing.T) {
|
|
var list protocol.InlayHintResponse
|
|
if err := json.Unmarshal([]byte(`[{"position":{"line":0,"character":1},"label":"x:"}]`), &list); err != nil {
|
|
t.Fatalf("unmarshal InlayHintResponse array failed: %v", err)
|
|
}
|
|
|
|
if list.Null {
|
|
t.Fatalf("expected non-null response for array")
|
|
}
|
|
|
|
if len(list.Hints) != 1 {
|
|
t.Fatalf("expected 1 hint, got %d", len(list.Hints))
|
|
}
|
|
|
|
var nullRes protocol.InlayHintResponse
|
|
if err := json.Unmarshal([]byte(`null`), &nullRes); err != nil {
|
|
t.Fatalf("unmarshal InlayHintResponse null failed: %v", err)
|
|
}
|
|
|
|
if !nullRes.Null {
|
|
t.Fatalf("expected null response flag to be true")
|
|
}
|
|
}
|
|
|
|
func Test_InlayHintResponse_MarshalArrayAndNull(t *testing.T) {
|
|
response := protocol.InlayHintResponse{
|
|
Hints: []protocol.InlayHint{{
|
|
Position: protocol.Position{Line: 0, Character: 0},
|
|
Label: func() protocol.InlayHintLabel {
|
|
label := "a"
|
|
return protocol.InlayHintLabel{String: &label}
|
|
}(),
|
|
}},
|
|
}
|
|
|
|
data, err := json.Marshal(response)
|
|
if err != nil {
|
|
t.Fatalf("marshal InlayHintResponse array failed: %v", err)
|
|
}
|
|
|
|
if string(data) == "null" {
|
|
t.Fatalf("expected array JSON, got null")
|
|
}
|
|
|
|
nullData, err := json.Marshal(protocol.InlayHintResponse{Null: true})
|
|
if err != nil {
|
|
t.Fatalf("marshal InlayHintResponse null failed: %v", err)
|
|
}
|
|
|
|
if string(nullData) != "null" {
|
|
t.Fatalf("expected null JSON, got %s", string(nullData))
|
|
}
|
|
}
|