a06f331eb8
CI / benchmark (push) Has been skipped
install-script / posix-syntax (push) Successful in 6m1s
CI / build-onnx (push) Failing after 6m43s
init-smoke / dry-run (push) Failing after 15m57s
security / govulncheck (push) Has been cancelled
security / trivy-fs (push) Has been cancelled
CI / test (1.26, ubuntu-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
CI / test (1.26, macos-latest) (push) Has been cancelled
CI / build-windows (push) Has been cancelled
CI / lint (push) Has been cancelled
install-script / powershell-syntax (push) Has been cancelled
install-script / install (macos-14) (push) Has been cancelled
install-script / install (ubuntu-latest) (push) Has been cancelled
92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
package indexer
|
|
|
|
import (
|
|
"sort"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/zzet/gortex/internal/graph"
|
|
)
|
|
|
|
func TestExtractRegexLiterals(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
pattern string
|
|
want []string
|
|
}{
|
|
{"plain literal", "helper", []string{"helper"}},
|
|
{"literal then class", `helper\(`, []string{"helper("}},
|
|
{"concat with class in middle", `func [A-Z]\w+`, []string{"func "}},
|
|
{"short literal dropped", "ab", nil},
|
|
{"alternation drops both", "foo|bar", nil},
|
|
{"star is not mandatory", "x*helper", []string{"helper"}},
|
|
{"plus keeps literal", "(abc)+", []string{"abc"}},
|
|
{"invalid regex yields none", "[unclosed", nil},
|
|
{"anchored literal", "^validateToken$", []string{"validateToken"}},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
got := extractRegexLiterals(tc.pattern)
|
|
sort.Strings(got)
|
|
want := append([]string(nil), tc.want...)
|
|
sort.Strings(want)
|
|
assert.Equal(t, want, got)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGrepRegexp(t *testing.T) {
|
|
dir := setupTestDir(t)
|
|
g := graph.New()
|
|
idx := newTestIndexer(g)
|
|
_, err := idx.Index(dir)
|
|
require.NoError(t, err)
|
|
|
|
t.Run("matches a regex use site", func(t *testing.T) {
|
|
hits, rerr := idx.GrepRegexp(`helper\(\)`, "", 0)
|
|
require.NoError(t, rerr)
|
|
require.NotEmpty(t, hits, "helper() should be found by regex")
|
|
found := false
|
|
for _, h := range hits {
|
|
if h.Path == "main.go" {
|
|
found = true
|
|
}
|
|
}
|
|
assert.True(t, found, "regex match should be located in main.go")
|
|
})
|
|
|
|
t.Run("character-class regex", func(t *testing.T) {
|
|
hits, rerr := idx.GrepRegexp(`func [a-z]+\(\)`, "", 0)
|
|
require.NoError(t, rerr)
|
|
assert.NotEmpty(t, hits, "func helper() should match the lowercase-name regex")
|
|
})
|
|
|
|
t.Run("path prefix scopes the search", func(t *testing.T) {
|
|
hits, rerr := idx.GrepRegexp(`package \w+`, "pkg/", 0)
|
|
require.NoError(t, rerr)
|
|
for _, h := range hits {
|
|
assert.Truef(t, len(h.Path) >= 4 && h.Path[:4] == "pkg/",
|
|
"path-prefixed result %q must be under pkg/", h.Path)
|
|
}
|
|
})
|
|
|
|
t.Run("invalid regex returns an error", func(t *testing.T) {
|
|
_, rerr := idx.GrepRegexp("[unclosed", "", 0)
|
|
require.Error(t, rerr)
|
|
})
|
|
|
|
t.Run("empty pattern yields nothing", func(t *testing.T) {
|
|
hits, rerr := idx.GrepRegexp("", "", 0)
|
|
require.NoError(t, rerr)
|
|
assert.Empty(t, hits)
|
|
})
|
|
|
|
t.Run("limit caps results", func(t *testing.T) {
|
|
hits, rerr := idx.GrepRegexp(`.`, "", 3)
|
|
require.NoError(t, rerr)
|
|
assert.LessOrEqual(t, len(hits), 3)
|
|
})
|
|
}
|