Poindexter/examples/dht_ping_1d/example_test.go

49 lines
1.2 KiB
Go

package main
import (
"fmt"
poindexter "github.com/Snider/Poindexter"
"testing"
)
type peer struct {
Addr string
Ping int
}
// TestExample1D ensures the 1D example logic runs and exercises KDTree paths.
func TestExample1D(t *testing.T) {
// Same toy table as the example
table := []peer{
{Addr: "peer1.example:4001", Ping: 74},
{Addr: "peer2.example:4001", Ping: 52},
{Addr: "peer3.example:4001", Ping: 110},
{Addr: "peer4.example:4001", Ping: 35},
{Addr: "peer5.example:4001", Ping: 60},
{Addr: "peer6.example:4001", Ping: 44},
}
pts := make([]poindexter.KDPoint[peer], 0, len(table))
for i, p := range table {
pts = append(pts, poindexter.KDPoint[peer]{
ID: fmt.Sprintf("peer-%d", i+1),
Coords: []float64{float64(p.Ping)},
Value: p,
})
}
kdt, err := poindexter.NewKDTree(pts, poindexter.WithMetric(poindexter.EuclideanDistance{}))
if err != nil {
t.Fatalf("NewKDTree err: %v", err)
}
best, d, ok := kdt.Nearest([]float64{0})
if !ok {
t.Fatalf("no nearest")
}
// Expect the minimum ping (35ms)
if best.Value.Ping != 35 {
t.Fatalf("expected best ping 35ms, got %d", best.Value.Ping)
}
// Distance from [0] to [35] should be 35
if d != 35 {
t.Fatalf("expected distance 35, got %v", d)
}
}