summaryrefslogtreecommitdiff
path: root/internal/lsp/rewrite_diagnostics_realism_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-09-04 16:04:58 +0300
committerPaul Buetow <paul@buetow.org>2025-09-04 16:04:58 +0300
commitbf53cf2a673af254d7a08bc3b2ab815a08f66117 (patch)
tree3c29faaaaa6777d9a9346c90bc7cba88978d8477 /internal/lsp/rewrite_diagnostics_realism_test.go
parent448d4b169904cfd6e1f701524539a27d8de18734 (diff)
tests: add shared test fixtures, expand provider breadth (multi-choice, error bodies), add LSP rewrite/diagnostics realism and table-driven tests
Diffstat (limited to 'internal/lsp/rewrite_diagnostics_realism_test.go')
-rw-r--r--internal/lsp/rewrite_diagnostics_realism_test.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/lsp/rewrite_diagnostics_realism_test.go b/internal/lsp/rewrite_diagnostics_realism_test.go
new file mode 100644
index 0000000..87ff571
--- /dev/null
+++ b/internal/lsp/rewrite_diagnostics_realism_test.go
@@ -0,0 +1,62 @@
+package lsp
+
+import (
+ "encoding/json"
+ "testing"
+)
+
+func TestResolveRewrite_MultiLine_PreservesRange(t *testing.T) {
+ s := newTestServer()
+ s.llmClient = fakeLLM{resp: "line1\nline2"}
+ uri := "file:///x.go"
+ s.setDocument(uri, "package p\nvar a=1\n")
+ r := Range{Start: Position{Line:1, Character:0}, End: Position{Line:1, Character:5}}
+ payload := struct {
+ Type string `json:"type"`
+ URI string `json:"uri"`
+ Range Range `json:"range"`
+ Instruction string `json:"instruction"`
+ Selection string `json:"selection"`
+ }{Type: "rewrite", URI: uri, Range: r, Instruction: "expand", Selection: "var a"}
+ raw, _ := json.Marshal(payload)
+ ca := CodeAction{Title: "Hexai: rewrite selection", Data: raw}
+ resolved, ok := s.resolveCodeAction(ca)
+ if !ok || resolved.Edit == nil { t.Fatalf("expected resolved rewrite edit") }
+ edits := resolved.Edit.Changes[uri]
+ if len(edits) != 1 { t.Fatalf("expected 1 edit") }
+ if edits[0].Range != r { t.Fatalf("range mismatch: got %+v want %+v", edits[0].Range, r) }
+ if edits[0].NewText == "" || !containsNewline(edits[0].NewText) {
+ t.Fatalf("expected multi-line replacement text, got %q", edits[0].NewText)
+ }
+}
+
+func TestResolveDiagnostics_MultiLine_PreservesRange(t *testing.T) {
+ s := newTestServer()
+ s.llmClient = fakeLLM{resp: "fixed\nvalue"}
+ uri := "file:///x.go"
+ s.setDocument(uri, "package p\nvar x = 1\n")
+ r := Range{Start: Position{Line:1, Character:0}, End: Position{Line:1, Character:10}}
+ payload := struct {
+ Type string `json:"type"`
+ URI string `json:"uri"`
+ Range Range `json:"range"`
+ Selection string `json:"selection"`
+ Diagnostics []Diagnostic `json:"diagnostics"`
+ }{Type: "diagnostics", URI: uri, Range: r, Selection: "var x = 1", Diagnostics: []Diagnostic{{Range: Range{Start: Position{Line:1}, End: Position{Line:1, Character:5}}, Message: "msg"}}}
+ raw, _ := json.Marshal(payload)
+ ca := CodeAction{Title: "Hexai: resolve diagnostics", Data: raw}
+ resolved, ok := s.resolveCodeAction(ca)
+ if !ok || resolved.Edit == nil { t.Fatalf("expected resolved diagnostics edit") }
+ edits := resolved.Edit.Changes[uri]
+ if len(edits) != 1 { t.Fatalf("expected 1 edit") }
+ if edits[0].Range != r { t.Fatalf("range mismatch: got %+v want %+v", edits[0].Range, r) }
+ if edits[0].NewText == "" || !containsNewline(edits[0].NewText) {
+ t.Fatalf("expected multi-line replacement text, got %q", edits[0].NewText)
+ }
+}
+
+func containsNewline(s string) bool {
+ for i := 0; i < len(s); i++ { if s[i] == '\n' { return true } }
+ return false
+}
+