blob: db63ae638d409d3bd9c5bda63f411914c5c6e0cf [file]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package graph
import (
"slices"
"testing"
)
func TestCompact(t *testing.T) {
g := stringGraph{
"A": {"B"},
"B": {"C"},
"C": {"A"},
}
cg, m := Compact(g)
if n := cg.NumNodes(); n != 3 {
t.Errorf("NumNodes() = %d, want 3", n)
}
// Check mapping
for i := range cg.NumNodes() {
j := m.Index(m.Value(i))
if j != i {
t.Errorf("Compact(NodeID(%d)) = %d, want %d", i, j, i)
}
}
// Check edges in compacted graph
for u := range cg.Nodes() {
var got []string
for v := range cg.Out(u) {
got = append(got, m.Value(v))
}
want := slices.Sorted(slices.Values(g[m.Value(u)]))
if !slices.Equal(got, want) {
t.Errorf("Out(%d) = %v, want %v", u, got, want)
}
}
cg2, _ := Compact(cg)
if cg != cg2 {
t.Errorf("Compact(Compact(g)) returned a new graph, want Compact(g)")
}
}
func TestCompact_AlreadyCompact(t *testing.T) {
g := newTestGraph(3, map[int][]int{
0: {1},
1: {2},
2: {0},
})
cg, m := Compact(g)
if cg != g {
t.Errorf("Compact(g) returned new graph, want original graph")
}
if m.Index(0) != 0 {
t.Errorf("Identity map Compact(0) = %d, want 0", m.Index(0))
}
if m.Value(0) != 0 {
t.Errorf("Identity map NodeID(0) = %d, want 0", m.Value(0))
}
}