summaryrefslogtreecommitdiff
path: root/internal/lsp/completion_prefix_strip_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp/completion_prefix_strip_test.go')
-rw-r--r--internal/lsp/completion_prefix_strip_test.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/internal/lsp/completion_prefix_strip_test.go b/internal/lsp/completion_prefix_strip_test.go
new file mode 100644
index 0000000..c8bd642
--- /dev/null
+++ b/internal/lsp/completion_prefix_strip_test.go
@@ -0,0 +1,52 @@
+package lsp
+
+import (
+ "encoding/json"
+ "testing"
+)
+
+func TestStripDuplicateGeneralPrefix_ExactOverlap(t *testing.T) {
+ prefix := "func New "
+ sugg := "func New() *CustData"
+ got := stripDuplicateGeneralPrefix(prefix, sugg)
+ // We expect the already typed prefix to be removed from the suggestion.
+ if got == sugg {
+ t.Fatalf("expected duplicate prefix to be stripped; got unchanged: %q", got)
+ }
+ if got != "() *CustData" {
+ t.Fatalf("got %q want %q", got, "() *CustData")
+ }
+}
+
+func TestStripDuplicateGeneralPrefix_TokenBoundarySuffix(t *testing.T) {
+ prefix := "db."
+ sugg := "db.Query()"
+ got := stripDuplicateGeneralPrefix(prefix, sugg)
+ if got != "Query()" {
+ t.Fatalf("got %q want %q", got, "Query()")
+ }
+}
+
+func TestStripDuplicateAssignmentPrefix_AssignAndWalrus(t *testing.T) {
+ // walrus
+ if out := stripDuplicateAssignmentPrefix("name := ", "name := compute()" ); out != "compute()" {
+ t.Fatalf(":= expected compute(), got %q", out)
+ }
+ // equals
+ if out := stripDuplicateAssignmentPrefix("x = ", "x = y+1" ); out != "y+1" {
+ t.Fatalf("= expected y+1, got %q", out)
+ }
+}
+
+func TestTryLLMCompletion_ManualInvokeAfterWhitespace_Allows(t *testing.T) {
+ s := &Server{ maxTokens: 32, triggerChars: []string{".", ":", "/", "_"}, compCache: make(map[string]string) }
+ s.llmClient = fakeLLM{resp: "() *CustData"}
+ line := "func fib(i int) " // cursor after space
+ p := CompletionParams{ Position: Position{ Line: 0, Character: len(line) }, TextDocument: TextDocumentIdentifier{URI: "file://x.go"} }
+ // Simulate manual user invocation (TriggerKind=1)
+ p.Context = json.RawMessage([]byte(`{"triggerKind":1}`))
+ items, ok, busy := s.tryLLMCompletion(p, "", line, "", "", "", false, "")
+ if busy { t.Fatalf("unexpected busy=true") }
+ if !ok { t.Fatalf("expected ok=true for manual invoke after whitespace") }
+ if len(items) == 0 { t.Fatalf("expected at least one completion item") }
+}