grep_test.go

 1package tools
 2
 3import (
 4	"regexp"
 5	"testing"
 6)
 7
 8func TestRegexCache(t *testing.T) {
 9	cache := newRegexCache()
10
11	// Test basic caching
12	pattern := "test.*pattern"
13	regex1, err := cache.get(pattern)
14	if err != nil {
15		t.Fatalf("Failed to compile regex: %v", err)
16	}
17
18	regex2, err := cache.get(pattern)
19	if err != nil {
20		t.Fatalf("Failed to get cached regex: %v", err)
21	}
22
23	// Should be the same instance (cached)
24	if regex1 != regex2 {
25		t.Error("Expected cached regex to be the same instance")
26	}
27
28	// Test that it actually works
29	if !regex1.MatchString("test123pattern") {
30		t.Error("Regex should match test string")
31	}
32}
33
34func TestGlobToRegexCaching(t *testing.T) {
35	// Test that globToRegex uses pre-compiled regex
36	pattern1 := globToRegex("*.{js,ts}")
37
38	// Should not panic and should work correctly
39	regex1, err := regexp.Compile(pattern1)
40	if err != nil {
41		t.Fatalf("Failed to compile glob regex: %v", err)
42	}
43
44	if !regex1.MatchString("test.js") {
45		t.Error("Glob regex should match .js files")
46	}
47	if !regex1.MatchString("test.ts") {
48		t.Error("Glob regex should match .ts files")
49	}
50	if regex1.MatchString("test.go") {
51		t.Error("Glob regex should not match .go files")
52	}
53}
54
55// Benchmark to show performance improvement
56func BenchmarkRegexCacheVsCompile(b *testing.B) {
57	cache := newRegexCache()
58	pattern := "test.*pattern.*[0-9]+"
59
60	b.Run("WithCache", func(b *testing.B) {
61		for b.Loop() {
62			_, err := cache.get(pattern)
63			if err != nil {
64				b.Fatal(err)
65			}
66		}
67	})
68
69	b.Run("WithoutCache", func(b *testing.B) {
70		for b.Loop() {
71			_, err := regexp.Compile(pattern)
72			if err != nil {
73				b.Fatal(err)
74			}
75		}
76	})
77}