| package matchers |
| |
| import ( |
| "fmt" |
| "reflect" |
| |
| "github.com/onsi/gomega/format" |
| ) |
| |
| type HaveKeyMatcher struct { |
| Key interface{} |
| } |
| |
| func (matcher *HaveKeyMatcher) Match(actual interface{}) (success bool, err error) { |
| if !isMap(actual) { |
| return false, fmt.Errorf("HaveKey matcher expects a map. Got:%s", format.Object(actual, 1)) |
| } |
| |
| keyMatcher, keyIsMatcher := matcher.Key.(omegaMatcher) |
| if !keyIsMatcher { |
| keyMatcher = &EqualMatcher{Expected: matcher.Key} |
| } |
| |
| keys := reflect.ValueOf(actual).MapKeys() |
| for i := 0; i < len(keys); i++ { |
| success, err := keyMatcher.Match(keys[i].Interface()) |
| if err != nil { |
| return false, fmt.Errorf("HaveKey's key matcher failed with:\n%s%s", format.Indent, err.Error()) |
| } |
| if success { |
| return true, nil |
| } |
| } |
| |
| return false, nil |
| } |
| |
| func (matcher *HaveKeyMatcher) FailureMessage(actual interface{}) (message string) { |
| switch matcher.Key.(type) { |
| case omegaMatcher: |
| return format.Message(actual, "to have key matching", matcher.Key) |
| default: |
| return format.Message(actual, "to have key", matcher.Key) |
| } |
| } |
| |
| func (matcher *HaveKeyMatcher) NegatedFailureMessage(actual interface{}) (message string) { |
| switch matcher.Key.(type) { |
| case omegaMatcher: |
| return format.Message(actual, "not to have key matching", matcher.Key) |
| default: |
| return format.Message(actual, "not to have key", matcher.Key) |
| } |
| } |