summaryrefslogtreecommitdiff
path: root/internal/lsp/context_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp/context_test.go')
-rw-r--r--internal/lsp/context_test.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/internal/lsp/context_test.go b/internal/lsp/context_test.go
new file mode 100644
index 0000000..32834b8
--- /dev/null
+++ b/internal/lsp/context_test.go
@@ -0,0 +1,69 @@
+package lsp
+
+import (
+ "strconv"
+ "strings"
+ "testing"
+)
+
+func TestWindowContext_Bounds(t *testing.T) {
+ s := newTestServer()
+ s.windowLines = 4 // half=2
+ s.maxContextTokens = 9999
+ lines := make([]string, 10)
+ for i := 0; i < 10; i++ {
+ lines[i] = "L" + strconv.Itoa(i)
+ }
+ text := strings.Join(lines, "\n")
+ uri := "file:///w.go"
+ s.setDocument(uri, text)
+ got := s.windowContext(uri, Position{Line: 5, Character: 0})
+ // expect lines 3..7 inclusive
+ want := strings.Join(lines[3:8], "\n")
+ if got != want {
+ t.Fatalf("window context got %q want %q", got, want)
+ }
+}
+
+func TestBuildAdditionalContext_Minimal(t *testing.T) {
+ s := newTestServer()
+ s.contextMode = "minimal"
+ if ctx, ok := s.buildAdditionalContext(false, "file:///x.go", Position{}); ok || ctx != "" {
+ t.Fatalf("expected no context in minimal mode; got ok=%v ctx=%q", ok, ctx)
+ }
+}
+
+func TestBuildAdditionalContext_FileOnNewFunc(t *testing.T) {
+ s := newTestServer()
+ s.contextMode = "file-on-new-func"
+ s.maxContextTokens = 9999
+ uri := "file:///x.go"
+ body := "package x\n\nfunc a(){}\n"
+ s.setDocument(uri, body)
+ if ctx, ok := s.buildAdditionalContext(true, uri, Position{}); !ok || ctx == "" {
+ t.Fatalf("expected full context when new func; ok=%v ctx=%q", ok, ctx)
+ }
+ if ctx, ok := s.buildAdditionalContext(false, uri, Position{}); ok || ctx != "" {
+ t.Fatalf("expected no context when not new func; ok=%v ctx=%q", ok, ctx)
+ }
+}
+
+func TestBuildAdditionalContext_AlwaysFull(t *testing.T) {
+ s := newTestServer()
+ s.contextMode = "always-full"
+ s.maxContextTokens = 9999
+ uri := "file:///x.go"
+ body := "line1\nline2\n"
+ s.setDocument(uri, body)
+ if ctx, ok := s.buildAdditionalContext(false, uri, Position{}); !ok || ctx == "" {
+ t.Fatalf("expected context in always-full; ok=%v ctx=%q", ok, ctx)
+ }
+}
+
+func TestTruncateToApproxTokens(t *testing.T) {
+ text := strings.Repeat("abcd", 10) // 40 chars
+ got := truncateToApproxTokens(text, 5) // ~20 chars
+ if len(got) > 5*4 {
+ t.Fatalf("truncate exceeded budget: got len=%d budget=%d", len(got), 5*4)
+ }
+}