xref: /aosp_15_r20/build/blueprint/depset/depset_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved.
2*1fa6dee9SAndroid Build Coastguard Worker//
3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*1fa6dee9SAndroid Build Coastguard Worker//
7*1fa6dee9SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*1fa6dee9SAndroid Build Coastguard Worker//
9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License.
14*1fa6dee9SAndroid Build Coastguard Worker
15*1fa6dee9SAndroid Build Coastguard Workerpackage depset
16*1fa6dee9SAndroid Build Coastguard Worker
17*1fa6dee9SAndroid Build Coastguard Workerimport (
18*1fa6dee9SAndroid Build Coastguard Worker	"fmt"
19*1fa6dee9SAndroid Build Coastguard Worker	"reflect"
20*1fa6dee9SAndroid Build Coastguard Worker	"slices"
21*1fa6dee9SAndroid Build Coastguard Worker	"strings"
22*1fa6dee9SAndroid Build Coastguard Worker	"testing"
23*1fa6dee9SAndroid Build Coastguard Worker)
24*1fa6dee9SAndroid Build Coastguard Worker
25*1fa6dee9SAndroid Build Coastguard Workerfunc ExampleDepSet_ToList_postordered() {
26*1fa6dee9SAndroid Build Coastguard Worker	a := NewBuilder[string](POSTORDER).Direct("a").Build()
27*1fa6dee9SAndroid Build Coastguard Worker	b := NewBuilder[string](POSTORDER).Direct("b").Transitive(a).Build()
28*1fa6dee9SAndroid Build Coastguard Worker	c := NewBuilder[string](POSTORDER).Direct("c").Transitive(a).Build()
29*1fa6dee9SAndroid Build Coastguard Worker	d := NewBuilder[string](POSTORDER).Direct("d").Transitive(b, c).Build()
30*1fa6dee9SAndroid Build Coastguard Worker
31*1fa6dee9SAndroid Build Coastguard Worker	fmt.Println(d.ToList())
32*1fa6dee9SAndroid Build Coastguard Worker	// Output: [a b c d]
33*1fa6dee9SAndroid Build Coastguard Worker}
34*1fa6dee9SAndroid Build Coastguard Worker
35*1fa6dee9SAndroid Build Coastguard Workerfunc ExampleDepSet_ToList_preordered() {
36*1fa6dee9SAndroid Build Coastguard Worker	a := NewBuilder[string](PREORDER).Direct("a").Build()
37*1fa6dee9SAndroid Build Coastguard Worker	b := NewBuilder[string](PREORDER).Direct("b").Transitive(a).Build()
38*1fa6dee9SAndroid Build Coastguard Worker	c := NewBuilder[string](PREORDER).Direct("c").Transitive(a).Build()
39*1fa6dee9SAndroid Build Coastguard Worker	d := NewBuilder[string](PREORDER).Direct("d").Transitive(b, c).Build()
40*1fa6dee9SAndroid Build Coastguard Worker
41*1fa6dee9SAndroid Build Coastguard Worker	fmt.Println(d.ToList())
42*1fa6dee9SAndroid Build Coastguard Worker	// Output: [d b a c]
43*1fa6dee9SAndroid Build Coastguard Worker}
44*1fa6dee9SAndroid Build Coastguard Worker
45*1fa6dee9SAndroid Build Coastguard Workerfunc ExampleDepSet_ToList_topological() {
46*1fa6dee9SAndroid Build Coastguard Worker	a := NewBuilder[string](TOPOLOGICAL).Direct("a").Build()
47*1fa6dee9SAndroid Build Coastguard Worker	b := NewBuilder[string](TOPOLOGICAL).Direct("b").Transitive(a).Build()
48*1fa6dee9SAndroid Build Coastguard Worker	c := NewBuilder[string](TOPOLOGICAL).Direct("c").Transitive(a).Build()
49*1fa6dee9SAndroid Build Coastguard Worker	d := NewBuilder[string](TOPOLOGICAL).Direct("d").Transitive(b, c).Build()
50*1fa6dee9SAndroid Build Coastguard Worker
51*1fa6dee9SAndroid Build Coastguard Worker	fmt.Println(d.ToList())
52*1fa6dee9SAndroid Build Coastguard Worker	// Output: [d b c a]
53*1fa6dee9SAndroid Build Coastguard Worker}
54*1fa6dee9SAndroid Build Coastguard Worker
55*1fa6dee9SAndroid Build Coastguard Worker// Tests based on Bazel's ExpanderTestBase.java to ensure compatibility
56*1fa6dee9SAndroid Build Coastguard Worker// https://github.com/bazelbuild/bazel/blob/master/src/test/java/com/google/devtools/build/lib/collect/nestedset/ExpanderTestBase.java
57*1fa6dee9SAndroid Build Coastguard Workerfunc TestDepSet(t *testing.T) {
58*1fa6dee9SAndroid Build Coastguard Worker	tests := []struct {
59*1fa6dee9SAndroid Build Coastguard Worker		name                             string
60*1fa6dee9SAndroid Build Coastguard Worker		depSet                           func(t *testing.T, order Order) DepSet[string]
61*1fa6dee9SAndroid Build Coastguard Worker		postorder, preorder, topological []string
62*1fa6dee9SAndroid Build Coastguard Worker	}{
63*1fa6dee9SAndroid Build Coastguard Worker		{
64*1fa6dee9SAndroid Build Coastguard Worker			name: "simple",
65*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
66*1fa6dee9SAndroid Build Coastguard Worker				return New[string](order, []string{"c", "a", "b"}, nil)
67*1fa6dee9SAndroid Build Coastguard Worker			},
68*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "a", "b"},
69*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"c", "a", "b"},
70*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"c", "a", "b"},
71*1fa6dee9SAndroid Build Coastguard Worker		},
72*1fa6dee9SAndroid Build Coastguard Worker		{
73*1fa6dee9SAndroid Build Coastguard Worker			name: "simpleNoDuplicates",
74*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
75*1fa6dee9SAndroid Build Coastguard Worker				return New[string](order, []string{"c", "a", "a", "a", "b"}, nil)
76*1fa6dee9SAndroid Build Coastguard Worker			},
77*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "a", "b"},
78*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"c", "a", "b"},
79*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"c", "a", "b"},
80*1fa6dee9SAndroid Build Coastguard Worker		},
81*1fa6dee9SAndroid Build Coastguard Worker		{
82*1fa6dee9SAndroid Build Coastguard Worker			name: "nesting",
83*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
84*1fa6dee9SAndroid Build Coastguard Worker				subset := New[string](order, []string{"c", "a", "e"}, nil)
85*1fa6dee9SAndroid Build Coastguard Worker				return New[string](order, []string{"b", "d"}, []DepSet[string]{subset})
86*1fa6dee9SAndroid Build Coastguard Worker			},
87*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "a", "e", "b", "d"},
88*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"b", "d", "c", "a", "e"},
89*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"b", "d", "c", "a", "e"},
90*1fa6dee9SAndroid Build Coastguard Worker		},
91*1fa6dee9SAndroid Build Coastguard Worker		{
92*1fa6dee9SAndroid Build Coastguard Worker			name: "builderReuse",
93*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
94*1fa6dee9SAndroid Build Coastguard Worker				assertEquals := func(t *testing.T, w, g []string) {
95*1fa6dee9SAndroid Build Coastguard Worker					t.Helper()
96*1fa6dee9SAndroid Build Coastguard Worker					if !reflect.DeepEqual(w, g) {
97*1fa6dee9SAndroid Build Coastguard Worker						t.Errorf("want %q, got %q", w, g)
98*1fa6dee9SAndroid Build Coastguard Worker					}
99*1fa6dee9SAndroid Build Coastguard Worker				}
100*1fa6dee9SAndroid Build Coastguard Worker				builder := NewBuilder[string](order)
101*1fa6dee9SAndroid Build Coastguard Worker				assertEquals(t, nil, builder.Build().ToList())
102*1fa6dee9SAndroid Build Coastguard Worker
103*1fa6dee9SAndroid Build Coastguard Worker				builder.Direct("b")
104*1fa6dee9SAndroid Build Coastguard Worker				assertEquals(t, []string{"b"}, builder.Build().ToList())
105*1fa6dee9SAndroid Build Coastguard Worker
106*1fa6dee9SAndroid Build Coastguard Worker				builder.Direct("d")
107*1fa6dee9SAndroid Build Coastguard Worker				assertEquals(t, []string{"b", "d"}, builder.Build().ToList())
108*1fa6dee9SAndroid Build Coastguard Worker
109*1fa6dee9SAndroid Build Coastguard Worker				child := NewBuilder[string](order).Direct("c", "a", "e").Build()
110*1fa6dee9SAndroid Build Coastguard Worker				builder.Transitive(child)
111*1fa6dee9SAndroid Build Coastguard Worker				return builder.Build()
112*1fa6dee9SAndroid Build Coastguard Worker			},
113*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "a", "e", "b", "d"},
114*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"b", "d", "c", "a", "e"},
115*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"b", "d", "c", "a", "e"},
116*1fa6dee9SAndroid Build Coastguard Worker		},
117*1fa6dee9SAndroid Build Coastguard Worker		{
118*1fa6dee9SAndroid Build Coastguard Worker			name: "builderChaining",
119*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
120*1fa6dee9SAndroid Build Coastguard Worker				return NewBuilder[string](order).Direct("b").Direct("d").
121*1fa6dee9SAndroid Build Coastguard Worker					Transitive(NewBuilder[string](order).Direct("c", "a", "e").Build()).Build()
122*1fa6dee9SAndroid Build Coastguard Worker			},
123*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "a", "e", "b", "d"},
124*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"b", "d", "c", "a", "e"},
125*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"b", "d", "c", "a", "e"},
126*1fa6dee9SAndroid Build Coastguard Worker		},
127*1fa6dee9SAndroid Build Coastguard Worker		{
128*1fa6dee9SAndroid Build Coastguard Worker			name: "transitiveDepsHandledSeparately",
129*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
130*1fa6dee9SAndroid Build Coastguard Worker				subset := NewBuilder[string](order).Direct("c", "a", "e").Build()
131*1fa6dee9SAndroid Build Coastguard Worker				builder := NewBuilder[string](order)
132*1fa6dee9SAndroid Build Coastguard Worker				// The fact that we add the transitive subset between the Direct(b) and Direct(d)
133*1fa6dee9SAndroid Build Coastguard Worker				// calls should not change the result.
134*1fa6dee9SAndroid Build Coastguard Worker				builder.Direct("b")
135*1fa6dee9SAndroid Build Coastguard Worker				builder.Transitive(subset)
136*1fa6dee9SAndroid Build Coastguard Worker				builder.Direct("d")
137*1fa6dee9SAndroid Build Coastguard Worker				return builder.Build()
138*1fa6dee9SAndroid Build Coastguard Worker			},
139*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "a", "e", "b", "d"},
140*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"b", "d", "c", "a", "e"},
141*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"b", "d", "c", "a", "e"},
142*1fa6dee9SAndroid Build Coastguard Worker		},
143*1fa6dee9SAndroid Build Coastguard Worker		{
144*1fa6dee9SAndroid Build Coastguard Worker			name: "nestingNoDuplicates",
145*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
146*1fa6dee9SAndroid Build Coastguard Worker				subset := NewBuilder[string](order).Direct("c", "a", "e").Build()
147*1fa6dee9SAndroid Build Coastguard Worker				return NewBuilder[string](order).Direct("b", "d", "e").Transitive(subset).Build()
148*1fa6dee9SAndroid Build Coastguard Worker			},
149*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "a", "e", "b", "d"},
150*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"b", "d", "e", "c", "a"},
151*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"b", "d", "c", "a", "e"},
152*1fa6dee9SAndroid Build Coastguard Worker		},
153*1fa6dee9SAndroid Build Coastguard Worker		{
154*1fa6dee9SAndroid Build Coastguard Worker			name: "chain",
155*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
156*1fa6dee9SAndroid Build Coastguard Worker				c := NewBuilder[string](order).Direct("c").Build()
157*1fa6dee9SAndroid Build Coastguard Worker				b := NewBuilder[string](order).Direct("b").Transitive(c).Build()
158*1fa6dee9SAndroid Build Coastguard Worker				a := NewBuilder[string](order).Direct("a").Transitive(b).Build()
159*1fa6dee9SAndroid Build Coastguard Worker
160*1fa6dee9SAndroid Build Coastguard Worker				return a
161*1fa6dee9SAndroid Build Coastguard Worker			},
162*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c", "b", "a"},
163*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"a", "b", "c"},
164*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"a", "b", "c"},
165*1fa6dee9SAndroid Build Coastguard Worker		},
166*1fa6dee9SAndroid Build Coastguard Worker		{
167*1fa6dee9SAndroid Build Coastguard Worker			name: "diamond",
168*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
169*1fa6dee9SAndroid Build Coastguard Worker				d := NewBuilder[string](order).Direct("d").Build()
170*1fa6dee9SAndroid Build Coastguard Worker				c := NewBuilder[string](order).Direct("c").Transitive(d).Build()
171*1fa6dee9SAndroid Build Coastguard Worker				b := NewBuilder[string](order).Direct("b").Transitive(d).Build()
172*1fa6dee9SAndroid Build Coastguard Worker				a := NewBuilder[string](order).Direct("a").Transitive(b).Transitive(c).Build()
173*1fa6dee9SAndroid Build Coastguard Worker
174*1fa6dee9SAndroid Build Coastguard Worker				return a
175*1fa6dee9SAndroid Build Coastguard Worker			},
176*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"d", "b", "c", "a"},
177*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"a", "b", "d", "c"},
178*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"a", "b", "c", "d"},
179*1fa6dee9SAndroid Build Coastguard Worker		},
180*1fa6dee9SAndroid Build Coastguard Worker		{
181*1fa6dee9SAndroid Build Coastguard Worker			name: "extendedDiamond",
182*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
183*1fa6dee9SAndroid Build Coastguard Worker				d := NewBuilder[string](order).Direct("d").Build()
184*1fa6dee9SAndroid Build Coastguard Worker				e := NewBuilder[string](order).Direct("e").Build()
185*1fa6dee9SAndroid Build Coastguard Worker				b := NewBuilder[string](order).Direct("b").Transitive(d).Transitive(e).Build()
186*1fa6dee9SAndroid Build Coastguard Worker				c := NewBuilder[string](order).Direct("c").Transitive(e).Transitive(d).Build()
187*1fa6dee9SAndroid Build Coastguard Worker				a := NewBuilder[string](order).Direct("a").Transitive(b).Transitive(c).Build()
188*1fa6dee9SAndroid Build Coastguard Worker				return a
189*1fa6dee9SAndroid Build Coastguard Worker			},
190*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"d", "e", "b", "c", "a"},
191*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"a", "b", "d", "e", "c"},
192*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"a", "b", "c", "e", "d"},
193*1fa6dee9SAndroid Build Coastguard Worker		},
194*1fa6dee9SAndroid Build Coastguard Worker		{
195*1fa6dee9SAndroid Build Coastguard Worker			name: "extendedDiamondRightArm",
196*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
197*1fa6dee9SAndroid Build Coastguard Worker				d := NewBuilder[string](order).Direct("d").Build()
198*1fa6dee9SAndroid Build Coastguard Worker				e := NewBuilder[string](order).Direct("e").Build()
199*1fa6dee9SAndroid Build Coastguard Worker				b := NewBuilder[string](order).Direct("b").Transitive(d).Transitive(e).Build()
200*1fa6dee9SAndroid Build Coastguard Worker				c2 := NewBuilder[string](order).Direct("c2").Transitive(e).Transitive(d).Build()
201*1fa6dee9SAndroid Build Coastguard Worker				c := NewBuilder[string](order).Direct("c").Transitive(c2).Build()
202*1fa6dee9SAndroid Build Coastguard Worker				a := NewBuilder[string](order).Direct("a").Transitive(b).Transitive(c).Build()
203*1fa6dee9SAndroid Build Coastguard Worker				return a
204*1fa6dee9SAndroid Build Coastguard Worker			},
205*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"d", "e", "b", "c2", "c", "a"},
206*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"a", "b", "d", "e", "c", "c2"},
207*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"a", "b", "c", "c2", "e", "d"},
208*1fa6dee9SAndroid Build Coastguard Worker		},
209*1fa6dee9SAndroid Build Coastguard Worker		{
210*1fa6dee9SAndroid Build Coastguard Worker			name: "orderConflict",
211*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
212*1fa6dee9SAndroid Build Coastguard Worker				child1 := NewBuilder[string](order).Direct("a", "b").Build()
213*1fa6dee9SAndroid Build Coastguard Worker				child2 := NewBuilder[string](order).Direct("b", "a").Build()
214*1fa6dee9SAndroid Build Coastguard Worker				parent := NewBuilder[string](order).Transitive(child1).Transitive(child2).Build()
215*1fa6dee9SAndroid Build Coastguard Worker				return parent
216*1fa6dee9SAndroid Build Coastguard Worker			},
217*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"a", "b"},
218*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"a", "b"},
219*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"b", "a"},
220*1fa6dee9SAndroid Build Coastguard Worker		},
221*1fa6dee9SAndroid Build Coastguard Worker		{
222*1fa6dee9SAndroid Build Coastguard Worker			name: "orderConflictNested",
223*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
224*1fa6dee9SAndroid Build Coastguard Worker				a := NewBuilder[string](order).Direct("a").Build()
225*1fa6dee9SAndroid Build Coastguard Worker				b := NewBuilder[string](order).Direct("b").Build()
226*1fa6dee9SAndroid Build Coastguard Worker				child1 := NewBuilder[string](order).Transitive(a).Transitive(b).Build()
227*1fa6dee9SAndroid Build Coastguard Worker				child2 := NewBuilder[string](order).Transitive(b).Transitive(a).Build()
228*1fa6dee9SAndroid Build Coastguard Worker				parent := NewBuilder[string](order).Transitive(child1).Transitive(child2).Build()
229*1fa6dee9SAndroid Build Coastguard Worker				return parent
230*1fa6dee9SAndroid Build Coastguard Worker			},
231*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"a", "b"},
232*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"a", "b"},
233*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"b", "a"},
234*1fa6dee9SAndroid Build Coastguard Worker		},
235*1fa6dee9SAndroid Build Coastguard Worker		{
236*1fa6dee9SAndroid Build Coastguard Worker			name: "zeroDepSet",
237*1fa6dee9SAndroid Build Coastguard Worker			depSet: func(t *testing.T, order Order) DepSet[string] {
238*1fa6dee9SAndroid Build Coastguard Worker				a := NewBuilder[string](order).Build()
239*1fa6dee9SAndroid Build Coastguard Worker				var b DepSet[string]
240*1fa6dee9SAndroid Build Coastguard Worker				c := NewBuilder[string](order).Direct("c").Transitive(a, b).Build()
241*1fa6dee9SAndroid Build Coastguard Worker				return c
242*1fa6dee9SAndroid Build Coastguard Worker			},
243*1fa6dee9SAndroid Build Coastguard Worker			postorder:   []string{"c"},
244*1fa6dee9SAndroid Build Coastguard Worker			preorder:    []string{"c"},
245*1fa6dee9SAndroid Build Coastguard Worker			topological: []string{"c"},
246*1fa6dee9SAndroid Build Coastguard Worker		},
247*1fa6dee9SAndroid Build Coastguard Worker	}
248*1fa6dee9SAndroid Build Coastguard Worker
249*1fa6dee9SAndroid Build Coastguard Worker	for _, tt := range tests {
250*1fa6dee9SAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
251*1fa6dee9SAndroid Build Coastguard Worker			t.Run("postorder", func(t *testing.T) {
252*1fa6dee9SAndroid Build Coastguard Worker				depSet := tt.depSet(t, POSTORDER)
253*1fa6dee9SAndroid Build Coastguard Worker				if g, w := depSet.ToList(), tt.postorder; !slices.Equal(g, w) {
254*1fa6dee9SAndroid Build Coastguard Worker					t.Errorf("expected ToList() = %q, got %q", w, g)
255*1fa6dee9SAndroid Build Coastguard Worker				}
256*1fa6dee9SAndroid Build Coastguard Worker			})
257*1fa6dee9SAndroid Build Coastguard Worker			t.Run("preorder", func(t *testing.T) {
258*1fa6dee9SAndroid Build Coastguard Worker				depSet := tt.depSet(t, PREORDER)
259*1fa6dee9SAndroid Build Coastguard Worker				if g, w := depSet.ToList(), tt.preorder; !slices.Equal(g, w) {
260*1fa6dee9SAndroid Build Coastguard Worker					t.Errorf("expected ToList() = %q, got %q", w, g)
261*1fa6dee9SAndroid Build Coastguard Worker				}
262*1fa6dee9SAndroid Build Coastguard Worker			})
263*1fa6dee9SAndroid Build Coastguard Worker			t.Run("topological", func(t *testing.T) {
264*1fa6dee9SAndroid Build Coastguard Worker				depSet := tt.depSet(t, TOPOLOGICAL)
265*1fa6dee9SAndroid Build Coastguard Worker				if g, w := depSet.ToList(), tt.topological; !slices.Equal(g, w) {
266*1fa6dee9SAndroid Build Coastguard Worker					t.Errorf("expected ToList() = %q, got %q", w, g)
267*1fa6dee9SAndroid Build Coastguard Worker				}
268*1fa6dee9SAndroid Build Coastguard Worker			})
269*1fa6dee9SAndroid Build Coastguard Worker		})
270*1fa6dee9SAndroid Build Coastguard Worker	}
271*1fa6dee9SAndroid Build Coastguard Worker}
272*1fa6dee9SAndroid Build Coastguard Worker
273*1fa6dee9SAndroid Build Coastguard Workerfunc TestDepSetInvalidOrder(t *testing.T) {
274*1fa6dee9SAndroid Build Coastguard Worker	orders := []Order{POSTORDER, PREORDER, TOPOLOGICAL}
275*1fa6dee9SAndroid Build Coastguard Worker
276*1fa6dee9SAndroid Build Coastguard Worker	run := func(t *testing.T, order1, order2 Order) {
277*1fa6dee9SAndroid Build Coastguard Worker		defer func() {
278*1fa6dee9SAndroid Build Coastguard Worker			if r := recover(); r != nil {
279*1fa6dee9SAndroid Build Coastguard Worker				if err, ok := r.(error); !ok {
280*1fa6dee9SAndroid Build Coastguard Worker					t.Fatalf("expected panic error, got %v", err)
281*1fa6dee9SAndroid Build Coastguard Worker				} else if !strings.Contains(err.Error(), "incompatible order") {
282*1fa6dee9SAndroid Build Coastguard Worker					t.Fatalf("expected incompatible order error, got %v", err)
283*1fa6dee9SAndroid Build Coastguard Worker				}
284*1fa6dee9SAndroid Build Coastguard Worker			}
285*1fa6dee9SAndroid Build Coastguard Worker		}()
286*1fa6dee9SAndroid Build Coastguard Worker		New(order1, nil, []DepSet[string]{New[string](order2, []string{"a"}, nil)})
287*1fa6dee9SAndroid Build Coastguard Worker		t.Fatal("expected panic")
288*1fa6dee9SAndroid Build Coastguard Worker	}
289*1fa6dee9SAndroid Build Coastguard Worker
290*1fa6dee9SAndroid Build Coastguard Worker	for _, order1 := range orders {
291*1fa6dee9SAndroid Build Coastguard Worker		t.Run(order1.String(), func(t *testing.T) {
292*1fa6dee9SAndroid Build Coastguard Worker			for _, order2 := range orders {
293*1fa6dee9SAndroid Build Coastguard Worker				t.Run(order2.String(), func(t *testing.T) {
294*1fa6dee9SAndroid Build Coastguard Worker					if order1 != order2 {
295*1fa6dee9SAndroid Build Coastguard Worker						run(t, order1, order2)
296*1fa6dee9SAndroid Build Coastguard Worker					}
297*1fa6dee9SAndroid Build Coastguard Worker				})
298*1fa6dee9SAndroid Build Coastguard Worker			}
299*1fa6dee9SAndroid Build Coastguard Worker		})
300*1fa6dee9SAndroid Build Coastguard Worker	}
301*1fa6dee9SAndroid Build Coastguard Worker}
302