diff --git a/pkg/package/package.go b/pkg/package/package.go index 2e343d9d..f36e3c1b 100644 --- a/pkg/package/package.go +++ b/pkg/package/package.go @@ -143,6 +143,12 @@ func (p *DefaultPackage) BuildFormula() ([]bf.Formula, error) { } B := bf.Var(encodedB) + f, err := required.BuildFormula() + if err != nil { + return nil, err + } + formulas = append(formulas, f...) + formulas = append(formulas, bf.Or(bf.Not(A), bf.And(A, B))) } @@ -153,10 +159,17 @@ func (p *DefaultPackage) BuildFormula() ([]bf.Formula, error) { return nil, err } B := bf.Var(encodedB) + + f, err := required.BuildFormula() + if err != nil { + return nil, err + } + formulas = append(formulas, bf.Or(bf.Not(A), bf.And(A, bf.Not(B)))) + formulas = append(formulas, f...) } - return formulas, nil + return []bf.Formula{bf.Implies(A, bf.And(formulas...))}, nil } diff --git a/pkg/solver/solver_test.go b/pkg/solver/solver_test.go index 960d3e8a..8767bdde 100644 --- a/pkg/solver/solver_test.go +++ b/pkg/solver/solver_test.go @@ -37,10 +37,27 @@ var _ = Describe("Solver", func() { solution, err := s.Solve() Expect(err).ToNot(HaveOccurred()) + Expect(solution).To(ContainElement(A.IsFlagged(true))) Expect(solution).To(ContainElement(B.IsFlagged(true))) Expect(solution).To(ContainElement(C.IsFlagged(true))) - // Expect(solution).To(ContainElement(A.IsFlagged(true))) }) + It("Solves correctly more complex ones", func() { + C := pkg.NewPackage("C", "", []pkg.Package{}, []pkg.Package{}) + D := pkg.NewPackage("D", "", []pkg.Package{}, []pkg.Package{}) + B := pkg.NewPackage("B", "", []pkg.Package{D}, []pkg.Package{}) + A := pkg.NewPackage("A", "", []pkg.Package{B}, []pkg.Package{}) + C.IsFlagged(true) // installed + + s := NewSolver([]pkg.Package{A.IsFlagged(true)}, []pkg.Package{C}) + + solution, err := s.Solve() + Expect(solution).To(ContainElement(C.IsFlagged(true))) + Expect(solution).To(ContainElement(D.IsFlagged(true))) + Expect(solution).To(ContainElement(B.IsFlagged(true))) + + Expect(err).ToNot(HaveOccurred()) + }) + }) Context("Conflict set", func() {