| // 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 ( | |
| "maps" | |
| "slices" | |
| "testing" | |
| ) | |
| func TestAllPaths(t *testing.T) { | |
| g := stringGraph{ | |
| "A": {"B", "C"}, | |
| "B": {"D"}, | |
| "C": {"D", "E"}, | |
| "D": {"F"}, | |
| "E": {}, | |
| "F": {}, | |
| } | |
| // Paths in g: | |
| // | |
| // A->B->D->F | |
| // A->C->D->F | |
| // A->C->E | |
| // AllPaths(A, F) should include A, B, C, D, F. E is not on path to F. | |
| got := slices.Sorted(maps.Keys(AllPaths(g, "A", "F"))) | |
| want := []string{"A", "B", "C", "D", "F"} | |
| if !slices.Equal(got, want) { | |
| t.Errorf("AllPaths(A, F) = %v, want %v", got, want) | |
| } | |
| // AllPaths(A, E) -> A, C, E. B is not on path. | |
| got = slices.Sorted(maps.Keys(AllPaths(g, "A", "E"))) | |
| want = []string{"A", "C", "E"} | |
| if !slices.Equal(got, want) { | |
| t.Errorf("AllPaths(A, E) = %v, want %v", got, want) | |
| } | |
| } | |
| func TestAllPaths_74842(t *testing.T) { | |
| tests := []struct { | |
| name string | |
| g stringGraph | |
| src, dst string | |
| want []string | |
| }{ | |
| { | |
| // C <--> B --> A --> D <--> E | |
| // ⋃ | |
| name: "non-regression test for #74842", | |
| g: stringGraph{ | |
| "A": {"D"}, | |
| "B": {"A", "B", "C"}, | |
| "C": {"B"}, | |
| "D": {"E"}, | |
| "E": {"D"}, | |
| }, | |
| src: "A", dst: "D", | |
| want: []string{"A", "D", "E"}, | |
| }, | |
| { | |
| // A --> B --> D | |
| // ^ | |
| // v | |
| // C[123] | |
| name: "regression test for #74842", | |
| g: stringGraph{ | |
| "A": {"B"}, | |
| "B": {"C1", "C2", "C3", "D"}, | |
| "C1": {"B"}, | |
| "C2": {"B"}, | |
| "C3": {"B"}, | |
| }, | |
| src: "A", dst: "D", | |
| want: []string{"A", "B", "C1", "C2", "C3", "D"}, | |
| }, | |
| { | |
| // A -------> B --> D | |
| // \--> C ---^ | | |
| // ^----------+ | |
| name: "another regression test for #74842", | |
| g: stringGraph{ | |
| "A": {"B", "C"}, | |
| "B": {"D"}, | |
| "C": {"B"}, | |
| "D": {"C"}, | |
| }, | |
| src: "A", dst: "D", | |
| want: []string{"A", "B", "C", "D"}, | |
| }, | |
| } | |
| for _, tt := range tests { | |
| t.Run(tt.name, func(t *testing.T) { | |
| allPaths := AllPaths(tt.g, tt.src, tt.dst) | |
| got := slices.Sorted(maps.Keys(allPaths)) | |
| if !slices.Equal(got, tt.want) { | |
| t.Errorf("got %v, want %v", got, tt.want) | |
| } | |
| }) | |
| } | |
| } |