5 "github.com/onsi/gomega/format"
9 type HaveKeyWithValueMatcher struct {
14 func (matcher *HaveKeyWithValueMatcher) Match(actual interface{}) (success bool, err error) {
16 return false, fmt.Errorf("HaveKeyWithValue matcher expects a map. Got:%s", format.Object(actual, 1))
19 keyMatcher, keyIsMatcher := matcher.Key.(omegaMatcher)
21 keyMatcher = &EqualMatcher{Expected: matcher.Key}
24 valueMatcher, valueIsMatcher := matcher.Value.(omegaMatcher)
26 valueMatcher = &EqualMatcher{Expected: matcher.Value}
29 keys := reflect.ValueOf(actual).MapKeys()
30 for i := 0; i < len(keys); i++ {
31 success, err := keyMatcher.Match(keys[i].Interface())
33 return false, fmt.Errorf("HaveKeyWithValue's key matcher failed with:\n%s%s", format.Indent, err.Error())
36 actualValue := reflect.ValueOf(actual).MapIndex(keys[i])
37 success, err := valueMatcher.Match(actualValue.Interface())
39 return false, fmt.Errorf("HaveKeyWithValue's value matcher failed with:\n%s%s", format.Indent, err.Error())
48 func (matcher *HaveKeyWithValueMatcher) FailureMessage(actual interface{}) (message string) {
49 str := "to have {key: value}"
50 if _, ok := matcher.Key.(omegaMatcher); ok {
52 } else if _, ok := matcher.Value.(omegaMatcher); ok {
56 expect := make(map[interface{}]interface{}, 1)
57 expect[matcher.Key] = matcher.Value
58 return format.Message(actual, str, expect)
61 func (matcher *HaveKeyWithValueMatcher) NegatedFailureMessage(actual interface{}) (message string) {
62 kStr := "not to have key"
63 if _, ok := matcher.Key.(omegaMatcher); ok {
64 kStr = "not to have key matching"
67 vStr := "or that key's value not be"
68 if _, ok := matcher.Value.(omegaMatcher); ok {
69 vStr = "or to have that key's value not matching"
72 return format.Message(actual, kStr, matcher.Key, vStr, matcher.Value)