Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
60 lines
1.7 KiB
Go
60 lines
1.7 KiB
Go
package cmdutil
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestLevenshtein(t *testing.T) {
|
|
cases := []struct {
|
|
a, b string
|
|
want int
|
|
}{
|
|
{"", "", 0},
|
|
{"abc", "", 3},
|
|
{"", "abc", 3},
|
|
{"list", "list", 0},
|
|
{"list", "listt", 1},
|
|
{"list", "lst", 1},
|
|
{"limit", "limti", 2},
|
|
{"café", "cafe", 1}, // rune-aware: é vs e is one edit
|
|
}
|
|
for _, tc := range cases {
|
|
if got := levenshtein(tc.a, tc.b); got != tc.want {
|
|
t.Errorf("levenshtein(%q,%q) = %d, want %d", tc.a, tc.b, got, tc.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSuggestClosest(t *testing.T) {
|
|
subs := []string{"create", "delete", "edit", "list", "pin", "status", "unpin", "view"}
|
|
cases := []struct {
|
|
target string
|
|
want []string
|
|
}{
|
|
{"lst", []string{"list"}}, // 1 edit
|
|
{"listt", []string{"list"}}, // 1 edit
|
|
{"vieww", []string{"view"}}, // 1 edit
|
|
{"creat", []string{"create"}}, // 1 edit
|
|
{"xyzzy", nil}, // nothing close
|
|
{"", nil}, // empty
|
|
{"pinn", []string{"pin"}}, // 1 edit (pin), unpin is 2
|
|
}
|
|
for _, tc := range cases {
|
|
got := SuggestClosest(tc.target, subs)
|
|
if !reflect.DeepEqual(got, tc.want) {
|
|
t.Errorf("SuggestClosest(%q) = %v, want %v", tc.target, got, tc.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestSuggestClosest_RanksByDistance pins closest-first ordering when
|
|
// candidates are at different distances.
|
|
func TestSuggestClosest_RanksByDistance(t *testing.T) {
|
|
// "creat" → "create" is 1 edit (append e); "delete" is far. create first.
|
|
got := SuggestClosest("creat", []string{"delete", "create"})
|
|
if len(got) == 0 || got[0] != "create" {
|
|
t.Errorf("closest to 'creat' should be 'create' first; got %v", got)
|
|
}
|
|
}
|