| // 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)) | |
| } | |
| } |