make Not() propagate MatchMayChangeInTheFuture() from wrapped matcher
diff --git a/internal/asyncassertion/async_assertion.go b/internal/asyncassertion/async_assertion.go
index 7bbec43..b007383 100644
--- a/internal/asyncassertion/async_assertion.go
+++ b/internal/asyncassertion/async_assertion.go
@@ -95,6 +95,12 @@
return true
}
+ return MatchMayChangeInTheFuture(matcher, value)
+}
+
+//MatchMayChangeInTheFuture is a helper to call MatchMayChangeInTheFuture on an unknown matcher.
+//If matcher implements oracleMatcher, it will call the method. Otherwise just returns true.
+func MatchMayChangeInTheFuture(matcher types.GomegaMatcher, value interface{}) bool {
oracleMatcher, ok := matcher.(oracleMatcher)
if !ok {
return true
diff --git a/matchers/and.go b/matchers/and.go
index e20fbae..5092463 100644
--- a/matchers/and.go
+++ b/matchers/and.go
@@ -24,7 +24,7 @@
return true, nil
}
-func (m *AndMatcher) FailureMessage(actual interface{}) (message string) {
+func (m *AndMatcher) FailureMessage(_ interface{}) (message string) {
return m.firstFailedMatchErrMsg
}
diff --git a/matchers/not.go b/matchers/not.go
index 5ad0d63..0cacc94 100644
--- a/matchers/not.go
+++ b/matchers/not.go
@@ -1,6 +1,9 @@
package matchers
-import "github.com/onsi/gomega/types"
+import (
+ "github.com/onsi/gomega/types"
+ "github.com/onsi/gomega/internal/asyncassertion"
+)
type NotMatcher struct {
Matcher types.GomegaMatcher
@@ -21,3 +24,7 @@
func (m *NotMatcher) NegatedFailureMessage(actual interface{}) (message string) {
return m.Matcher.FailureMessage(actual) // works beautifully
}
+
+func (m *NotMatcher) MatchMayChangeInTheFuture(actual interface{}) bool {
+ return asyncassertion.MatchMayChangeInTheFuture(m.Matcher, actual) // just return m.Matcher's value
+}
diff --git a/matchers/not_test.go b/matchers/not_test.go
index e716178..e745651 100644
--- a/matchers/not_test.go
+++ b/matchers/not_test.go
@@ -3,6 +3,7 @@
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
+ . "github.com/onsi/gomega/matchers"
)
var _ = Describe("NotMatcher", func() {
@@ -40,4 +41,21 @@
})
})
})
+
+ Context("MatchMayChangeInTheFuture()", func() {
+ It("Propogates value from wrapped matcher", func() {
+ // wrap a Receive matcher, which does implement this method
+ channel := make(chan int)
+ close(channel)
+ var i int
+ m := Not(Receive(&i))
+ Expect(m.Match(channel)).To(BeTrue())
+ Expect(m.(*NotMatcher).MatchMayChangeInTheFuture(channel)).To(BeFalse())
+ })
+ It("Defaults to true", func() {
+ m := Not(Equal(1)) // Equal does not have this method
+ Expect(m.Match(2)).To(BeTrue())
+ Expect(m.(*NotMatcher).MatchMayChangeInTheFuture(2)).To(BeTrue()) // defaults to true
+ })
+ })
})