summaryrefslogtreecommitdiff
path: root/internal/lsp/context_test.go
blob: 08a29697f9ccdcae4e7a5ed8d23273000ba6e06a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Tests for context-building logic (window, full-file) and truncation behavior.
package lsp

import (
	"strconv"
	"strings"
	"testing"
)

func TestWindowContext_Bounds(t *testing.T) {
	s := newTestServer()
	s.cfg.ContextWindowLines = 4 // half=2
	s.cfg.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.cfg.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.cfg.ContextMode = "file-on-new-func"
	s.cfg.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.cfg.ContextMode = "always-full"
	s.cfg.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 TestBuildAdditionalContext_UnknownModeFallsBackToMinimal(t *testing.T) {
	s := newTestServer()
	s.cfg.ContextMode = "unknown-mode"
	if ctx, ok := s.buildAdditionalContext(false, "file:///x.go", Position{}); ok || ctx != "" {
		t.Fatalf("expected no context for unknown mode; got 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)
	}
}