mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-25 10:18:59 +02:00
feat: trie implementation
This commit is contained in:
113
internal/utils/trie/walk_test.go
Normal file
113
internal/utils/trie/walk_test.go
Normal file
@@ -0,0 +1,113 @@
|
||||
package trie_test
|
||||
|
||||
import (
|
||||
"maps"
|
||||
"slices"
|
||||
"testing"
|
||||
|
||||
. "github.com/yusing/go-proxy/internal/utils/trie"
|
||||
)
|
||||
|
||||
// Test data for trie tests
|
||||
var (
|
||||
testData = map[string]any{
|
||||
"routes.route1": new(int),
|
||||
"routes.route2": new(int),
|
||||
"routes.route3": new(int),
|
||||
"system.cpu_average": new(int),
|
||||
"system.mem.used": new(int),
|
||||
"system.mem.percentage_used": new(int),
|
||||
"system.disks.disk0.used": new(int),
|
||||
"system.disks.disk0.percentage_used": new(int),
|
||||
"system.disks.disk1.used": new(int),
|
||||
"system.disks.disk1.percentage_used": new(int),
|
||||
}
|
||||
|
||||
testWalkDisksWants = []string{
|
||||
"system.disks.disk0.used",
|
||||
"system.disks.disk0.percentage_used",
|
||||
"system.disks.disk1.used",
|
||||
"system.disks.disk1.percentage_used",
|
||||
}
|
||||
testWalkDisksUsedWants = []string{
|
||||
"system.disks.disk0.used",
|
||||
"system.disks.disk1.used",
|
||||
}
|
||||
testUsedWants = []string{
|
||||
"system.mem.used",
|
||||
"system.disks.disk0.used",
|
||||
"system.disks.disk1.used",
|
||||
}
|
||||
)
|
||||
|
||||
// Helper functions
|
||||
func keys(m map[string]any) []string {
|
||||
return slices.Sorted(maps.Keys(m))
|
||||
}
|
||||
|
||||
func keysEqual(m map[string]any, want []string) bool {
|
||||
slices.Sort(want)
|
||||
return slices.Equal(keys(m), want)
|
||||
}
|
||||
|
||||
func TestWalkAll(t *testing.T) {
|
||||
trie := NewTrie()
|
||||
for key, series := range testData {
|
||||
trie.Store(NewKey(key), series)
|
||||
}
|
||||
|
||||
walked := maps.Collect(trie.Walk)
|
||||
for k, v := range testData {
|
||||
if _, ok := walked[k]; !ok {
|
||||
t.Fatalf("expected key %s not found", k)
|
||||
}
|
||||
if v != walked[k] {
|
||||
t.Fatalf("key %s expected %v, got %v", k, v, walked[k])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWalk(t *testing.T) {
|
||||
trie := NewTrie()
|
||||
for key, series := range testData {
|
||||
trie.Store(NewKey(key), series)
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
query string
|
||||
want []string
|
||||
wantEmpty bool
|
||||
}{
|
||||
{"system.disks.*.used", testWalkDisksUsedWants, false},
|
||||
{"system.*.*.used", testWalkDisksUsedWants, false},
|
||||
{"*.disks.*.used", testWalkDisksUsedWants, false},
|
||||
{"*.*.*.used", testWalkDisksUsedWants, false},
|
||||
{"system.disks.**", testWalkDisksWants, false}, // note: original code uses '*' not '**'
|
||||
{"system.disks", nil, true},
|
||||
{"**.used", testUsedWants, false},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.query, func(t *testing.T) {
|
||||
got := maps.Collect(trie.Query(NewKey(tc.query)))
|
||||
if tc.wantEmpty {
|
||||
if len(got) != 0 {
|
||||
t.Fatalf("expected empty, got %v", keys(got))
|
||||
}
|
||||
return
|
||||
}
|
||||
if !keysEqual(got, tc.want) {
|
||||
t.Fatalf("expected %v, got %v", tc.want, keys(got))
|
||||
}
|
||||
for _, k := range tc.want {
|
||||
want, ok := testData[k]
|
||||
if !ok {
|
||||
t.Fatalf("expected key %s not found", k)
|
||||
}
|
||||
if got[k] != want {
|
||||
t.Fatalf("key %s expected %v, got %v", k, want, got[k])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user