arnaucube
arnaucube/mirror-to-giteaPublic Self-hosted repository
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}