mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 12:42:34 +02:00
113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
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])
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|