diff --git a/matchers/have_exact_elements.go b/matchers/have_exact_elements.go index 19d8f3d1d..7cce776c1 100644 --- a/matchers/have_exact_elements.go +++ b/matchers/have_exact_elements.go @@ -19,6 +19,8 @@ type HaveExactElementsMatcher struct { } func (matcher *HaveExactElementsMatcher) Match(actual interface{}) (success bool, err error) { + matcher.resetState() + if isMap(actual) { return false, fmt.Errorf("error") } @@ -73,3 +75,9 @@ func (matcher *HaveExactElementsMatcher) FailureMessage(actual interface{}) (mes func (matcher *HaveExactElementsMatcher) NegatedFailureMessage(actual interface{}) (message string) { return format.Message(actual, "not to contain elements", presentable(matcher.Elements)) } + +func (matcher *HaveExactElementsMatcher) resetState() { + matcher.mismatchFailures = nil + matcher.missingIndex = 0 + matcher.extraIndex = 0 +} diff --git a/matchers/have_exact_elements_test.go b/matchers/have_exact_elements_test.go index 154bb3c74..7405e5f3e 100644 --- a/matchers/have_exact_elements_test.go +++ b/matchers/have_exact_elements_test.go @@ -110,4 +110,14 @@ to equal }) }) }) + + When("matcher instance is reused", func() { + // This is a regression test for https://github.com/onsi/gomega/issues/647. + // Matcher instance may be reused, if placed inside ContainElement() or other collection matchers. + It("should work properly", func() { + matchSingleFalse := HaveExactElements(Equal(false)) + Expect([]bool{true}).ShouldNot(matchSingleFalse) + Expect([]bool{false}).Should(matchSingleFalse) + }) + }) })