| package matchers |
| |
| import ( |
| "fmt" |
| "reflect" |
| |
| "github.com/onsi/gomega/format" |
| ) |
| |
| type ContainElementMatcher struct { |
| Element interface{} |
| } |
| |
| func (matcher *ContainElementMatcher) Match(actual interface{}) (success bool, err error) { |
| if !isArrayOrSlice(actual) && !isMap(actual) { |
| return false, fmt.Errorf("ContainElement matcher expects an array/slice/map. Got:\n%s", format.Object(actual, 1)) |
| } |
| |
| elemMatcher, elementIsMatcher := matcher.Element.(omegaMatcher) |
| if !elementIsMatcher { |
| elemMatcher = &EqualMatcher{Expected: matcher.Element} |
| } |
| |
| value := reflect.ValueOf(actual) |
| var keys []reflect.Value |
| if isMap(actual) { |
| keys = value.MapKeys() |
| } |
| var lastError error |
| for i := 0; i < value.Len(); i++ { |
| var success bool |
| var err error |
| if isMap(actual) { |
| success, err = elemMatcher.Match(value.MapIndex(keys[i]).Interface()) |
| } else { |
| success, err = elemMatcher.Match(value.Index(i).Interface()) |
| } |
| if err != nil { |
| lastError = err |
| continue |
| } |
| if success { |
| return true, nil |
| } |
| } |
| |
| return false, lastError |
| } |
| |
| func (matcher *ContainElementMatcher) FailureMessage(actual interface{}) (message string) { |
| return format.Message(actual, "to contain element matching", matcher.Element) |
| } |
| |
| func (matcher *ContainElementMatcher) NegatedFailureMessage(actual interface{}) (message string) { |
| return format.Message(actual, "not to contain element matching", matcher.Element) |
| } |