github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/controller/registry/resolver/solver/search_test.go (about) 1 //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o zz_search_test.go ../../../../../vendor/github.com/go-air/gini/inter S 2 3 package solver 4 5 import ( 6 "context" 7 "testing" 8 9 "github.com/go-air/gini/inter" 10 "github.com/go-air/gini/z" 11 "github.com/stretchr/testify/assert" 12 ) 13 14 type TestScopeCounter struct { 15 depth *int 16 inter.S 17 } 18 19 func (c *TestScopeCounter) Test(dst []z.Lit) (result int, out []z.Lit) { 20 result, out = c.S.Test(dst) 21 *c.depth++ 22 return 23 } 24 25 func (c *TestScopeCounter) Untest() (result int) { 26 result = c.S.Untest() 27 *c.depth-- 28 return 29 } 30 31 func TestSearch(t *testing.T) { 32 type tc struct { 33 Name string 34 Variables []Variable 35 TestReturns []int 36 UntestReturns []int 37 Result int 38 Assumptions []Identifier 39 } 40 41 for _, tt := range []tc{ 42 { 43 Name: "children popped from back of deque when guess popped", 44 Variables: []Variable{ 45 variable("a", Mandatory(), Dependency("c")), 46 variable("b", Mandatory()), 47 variable("c"), 48 }, 49 TestReturns: []int{0, -1}, 50 UntestReturns: []int{-1, -1}, 51 Result: -1, 52 Assumptions: nil, 53 }, 54 { 55 Name: "candidates exhausted", 56 Variables: []Variable{ 57 variable("a", Mandatory(), Dependency("x")), 58 variable("b", Mandatory(), Dependency("y")), 59 variable("x"), 60 variable("y"), 61 }, 62 TestReturns: []int{0, 0, -1, 1}, 63 UntestReturns: []int{0}, 64 Result: 1, 65 Assumptions: []Identifier{"a", "b", "y"}, 66 }, 67 } { 68 t.Run(tt.Name, func(t *testing.T) { 69 assert := assert.New(t) 70 71 var s FakeS 72 for i, result := range tt.TestReturns { 73 s.TestReturnsOnCall(i, result, nil) 74 } 75 for i, result := range tt.UntestReturns { 76 s.UntestReturnsOnCall(i, result) 77 } 78 79 var depth int 80 counter := &TestScopeCounter{depth: &depth, S: &s} 81 82 lits, err := newLitMapping(tt.Variables) 83 assert.NoError(err) 84 h := search{ 85 s: counter, 86 lits: lits, 87 tracer: DefaultTracer{}, 88 } 89 90 var anchors []z.Lit 91 for _, id := range h.lits.AnchorIdentifiers() { 92 anchors = append(anchors, h.lits.LitOf(id)) 93 } 94 95 result, ms, _ := h.Do(context.Background(), anchors) 96 97 assert.Equal(tt.Result, result) 98 var ids []Identifier 99 for _, m := range ms { 100 ids = append(ids, lits.VariableOf(m).Identifier()) 101 } 102 assert.Equal(tt.Assumptions, ids) 103 assert.Equal(0, depth) 104 }) 105 } 106 }