summaryrefslogtreecommitdiff
path: root/internal/lsp/context_test.go
blob: 32834b8f03e35826701de8ffa918ae853546fbe9 (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
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)
    }
}