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  }