57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
|
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)
|
||
|
}
|