summaryrefslogtreecommitdiff
path: root/internal/textutil/textutil_test.go
blob: 3a8cd90b26bb0a7f54de5197a0259beb2542e1cd (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
79
80
81
82
83
84
85
86
87
package textutil

import (
    "regexp"
    "strings"
    "testing"
)

func TestRenderTemplate_Basic(t *testing.T) {
    out := RenderTemplate("Hello, {{name}}!", map[string]string{"name": "Hex"})
    if out != "Hello, Hex!" {
        t.Fatalf("render failed: %q", out)
    }
    // No vars
    if RenderTemplate("x", nil) != "x" { t.Fatal("nil vars changed output") }
}

func TestStripCodeFences_Variants(t *testing.T) {
    cases := []struct{ in, want string }{
        {"```\ncode\n```", "code"},
        {"```go\npackage x\n```", "package x"},
        {"no fences", "no fences"},
        {"\n\n```\ntrim\n```\n", "trim"},
    }
    for _, c := range cases {
        if got := StripCodeFences(c.in); got != c.want {
            t.Fatalf("strip mismatch: %q != %q", got, c.want)
        }
    }
}

func TestInstructionFromSelection_Markers(t *testing.T) {
    inputs := []string{
        ";do it;\ncode",
        "/* fix */\ncode",
        "<!-- doc -->\ncode",
        "// change\ncode",
        "# tweak\ncode",
        "-- op\ncode",
    }
    for _, in := range inputs {
        instr, cleaned := InstructionFromSelection(in)
        if strings.TrimSpace(instr) == "" {
            t.Fatalf("no instruction for input: %q", in)
        }
        // cleaned should not contain the instruction token
        if strings.Contains(cleaned, instr) {
            // Allow coincidence only if separated differently; require not exact match on same line
            first := strings.Split(in, "\n")[0]
            if strings.Contains(first, instr) {
                t.Fatalf("instruction not removed: %q", cleaned)
            }
        }
    }
}

func TestFindFirstInstructionInLine_EarliestWins(t *testing.T) {
    // Both markers present, earliest should win (strict tag first)
    line := ";first;  // later"
    instr, cleaned, ok := FindFirstInstructionInLine(line)
    if !ok || instr != "first" {
        t.Fatalf("expected 'first', got %q ok=%v", instr, ok)
    }
    if strings.Contains(cleaned, instr) {
        t.Fatalf("expected cleaned line to remove instr: %q", cleaned)
    }
}

func TestFindStrictInlineTag(t *testing.T) {
    if txt, l, r, ok := FindStrictInlineTag("pre;do;post"); !ok || txt != "do" || l != 3 || r != 7 {
        t.Fatalf("strict tag parse failed: %q %d %d %v", txt, l, r, ok)
    }
    if _, _, _, ok := FindStrictInlineTag("; spaced ;"); ok {
        t.Fatalf("should reject spaced strict tag")
    }
}

// optional: ensure no ANSI codes appear in plain helpers
func TestNoANSIInHelpers(t *testing.T) {
    ansi := regexp.MustCompile(`\x1b\[[0-9;]*m`)
    if ansi.MatchString(RenderTemplate("x", nil)) {
        t.Fatalf("unexpected ansi in RenderTemplate")
    }
    if ansi.MatchString(StripCodeFences("x")) {
        t.Fatalf("unexpected ansi in StripCodeFences")
    }
}