63 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
| package testutil
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"unicode"
 | |
| 	"unicode/utf8"
 | |
| 
 | |
| 	"github.com/google/go-cmp/cmp"
 | |
| 	"github.com/google/go-cmp/cmp/cmpopts"
 | |
| 	"github.com/onsi/gomega/format"
 | |
| 	"github.com/onsi/gomega/types"
 | |
| )
 | |
| 
 | |
| type optionsMatcher struct {
 | |
| 	Expected       interface{}
 | |
| 	CompareOptions []cmp.Option
 | |
| }
 | |
| 
 | |
| func EqualOpts(expected interface{}) types.GomegaMatcher {
 | |
| 	ignoreUnexported := cmp.FilterPath(func(p cmp.Path) bool {
 | |
| 		sf, ok := p.Index(-1).(cmp.StructField)
 | |
| 		if !ok {
 | |
| 			return false
 | |
| 		}
 | |
| 		r, _ := utf8.DecodeRuneInString(sf.Name())
 | |
| 		return !unicode.IsUpper(r)
 | |
| 	}, cmp.Ignore())
 | |
| 
 | |
| 	return &optionsMatcher{
 | |
| 		Expected:       expected,
 | |
| 		CompareOptions: []cmp.Option{ignoreUnexported, cmpopts.EquateEmpty()},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (matcher *optionsMatcher) Match(actual interface{}) (success bool, err error) {
 | |
| 	if actual == nil && matcher.Expected == nil {
 | |
| 		return false, errors.New("trying to compare <nil> to <nil>")
 | |
| 	}
 | |
| 	return cmp.Equal(actual, matcher.Expected, matcher.CompareOptions...), nil
 | |
| }
 | |
| 
 | |
| func (matcher *optionsMatcher) FailureMessage(actual interface{}) (message string) {
 | |
| 	actualString, actualOK := actual.(string)
 | |
| 	expectedString, expectedOK := fmt.Sprintf("%v", matcher.Expected), true
 | |
| 	if actualOK && expectedOK {
 | |
| 		return format.MessageWithDiff(actualString, "to equal", expectedString)
 | |
| 	}
 | |
| 
 | |
| 	return format.Message(actual, "to equal", matcher.Expected) +
 | |
| 		"\n\nDiff:\n" + format.IndentString(matcher.getDiff(actual), 1)
 | |
| }
 | |
| 
 | |
| func (matcher *optionsMatcher) NegatedFailureMessage(actual interface{}) (message string) {
 | |
| 
 | |
| 	return format.Message(actual, "not to equal", matcher.Expected) +
 | |
| 		"\n\nDiff:\n" + format.IndentString(matcher.getDiff(actual), 1)
 | |
| }
 | |
| 
 | |
| func (matcher *optionsMatcher) getDiff(actual interface{}) string {
 | |
| 	return cmp.Diff(actual, matcher.Expected, matcher.CompareOptions...)
 | |
| }
 |