diff options
| author | Paul Buetow <paul@buetow.org> | 2025-08-16 15:35:02 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-08-16 15:35:02 +0300 |
| commit | 6c8eb6876fe87553770de114ebd34649a0c6ec10 (patch) | |
| tree | 064517edaf9d59522bec7191a61362a853c195bd /internal/lsp/context_test.go | |
| parent | 1e1df8c204f6771719f85d8402128d72138bb863 (diff) | |
lsp: split monolithic server.go into modules; add configurable max tokens and context strategies (minimal|window|file-on-new-func|always-full); provide flags/env fallbacks; add unit tests for helpers and context; update README; remove obsolete files
Diffstat (limited to 'internal/lsp/context_test.go')
| -rw-r--r-- | internal/lsp/context_test.go | 69 |
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) + } +} |
