mirror-to-gitea/vendor/github.com/onsi/gomega/matchers/contain_element_matcher.go
vendor/github.com/onsi/gomega/matchers/contain_element_matcher.goRaw
1// untested sections: 2
2
3package matchers
4
5import (
6 "fmt"
7 "reflect"
8
9 "github.com/onsi/gomega/format"
10)
11
12type ContainElementMatcher struct {
13 Element interface{}
14}
15
16func (matcher *ContainElementMatcher) Match(actual interface{}) (success bool, err error) {
17 if !isArrayOrSlice(actual) && !isMap(actual) {
18 return false, fmt.Errorf("ContainElement matcher expects an array/slice/map. Got:\n%s", format.Object(actual, 1))
19 }
20
21 elemMatcher, elementIsMatcher := matcher.Element.(omegaMatcher)
22 if !elementIsMatcher {
23 elemMatcher = &EqualMatcher{Expected: matcher.Element}
24 }
25
26 value := reflect.ValueOf(actual)
27 var valueAt func(int) interface{}
28 if isMap(actual) {
29 keys := value.MapKeys()
30 valueAt = func(i int) interface{} {
31 return value.MapIndex(keys[i]).Interface()
32 }
33 } else {
34 valueAt = func(i int) interface{} {
35 return value.Index(i).Interface()
36 }
37 }
38
39 var lastError error
40 for i := 0; i < value.Len(); i++ {
41 success, err := elemMatcher.Match(valueAt(i))
42 if err != nil {
43 lastError = err
44 continue
45 }
46 if success {
47 return true, nil
48 }
49 }
50
51 return false, lastError
52}
53
54func (matcher *ContainElementMatcher) FailureMessage(actual interface{}) (message string) {
55 return format.Message(actual, "to contain element matching", matcher.Element)
56}
57
58func (matcher *ContainElementMatcher) NegatedFailureMessage(actual interface{}) (message string) {
59 return format.Message(actual, "not to contain element matching", matcher.Element)
60}