1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- // untested sections: 3
- package gstruct
- import (
- "fmt"
- "reflect"
- "github.com/onsi/gomega/format"
- "github.com/onsi/gomega/types"
- )
- //PointTo applies the given matcher to the value pointed to by actual. It fails if the pointer is
- //nil.
- // actual := 5
- // Expect(&actual).To(PointTo(Equal(5)))
- func PointTo(matcher types.GomegaMatcher) types.GomegaMatcher {
- return &PointerMatcher{
- Matcher: matcher,
- }
- }
- type PointerMatcher struct {
- Matcher types.GomegaMatcher
- // Failure message.
- failure string
- }
- func (m *PointerMatcher) Match(actual interface{}) (bool, error) {
- val := reflect.ValueOf(actual)
- // return error if actual type is not a pointer
- if val.Kind() != reflect.Ptr {
- return false, fmt.Errorf("PointerMatcher expects a pointer but we have '%s'", val.Kind())
- }
- if !val.IsValid() || val.IsNil() {
- m.failure = format.Message(actual, "not to be <nil>")
- return false, nil
- }
- // Forward the value.
- elem := val.Elem().Interface()
- match, err := m.Matcher.Match(elem)
- if !match {
- m.failure = m.Matcher.FailureMessage(elem)
- }
- return match, err
- }
- func (m *PointerMatcher) FailureMessage(_ interface{}) (message string) {
- return m.failure
- }
- func (m *PointerMatcher) NegatedFailureMessage(actual interface{}) (message string) {
- return m.Matcher.NegatedFailureMessage(actual)
- }
|