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