|  | package assertion | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "reflect" | 
|  |  | 
|  | "github.com/onsi/gomega/types" | 
|  | ) | 
|  |  | 
|  | type Assertion struct { | 
|  | actualInput interface{} | 
|  | fail        types.GomegaFailHandler | 
|  | offset      int | 
|  | extra       []interface{} | 
|  | } | 
|  |  | 
|  | func New(actualInput interface{}, fail types.GomegaFailHandler, offset int, extra ...interface{}) *Assertion { | 
|  | return &Assertion{ | 
|  | actualInput: actualInput, | 
|  | fail:        fail, | 
|  | offset:      offset, | 
|  | extra:       extra, | 
|  | } | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { | 
|  | return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, true, optionalDescription...) | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { | 
|  | return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, false, optionalDescription...) | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) To(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { | 
|  | return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, true, optionalDescription...) | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) ToNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { | 
|  | return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, false, optionalDescription...) | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) NotTo(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { | 
|  | return assertion.vetExtras(optionalDescription...) && assertion.match(matcher, false, optionalDescription...) | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) buildDescription(optionalDescription ...interface{}) string { | 
|  | switch len(optionalDescription) { | 
|  | case 0: | 
|  | return "" | 
|  | default: | 
|  | return fmt.Sprintf(optionalDescription[0].(string), optionalDescription[1:]...) + "\n" | 
|  | } | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) match(matcher types.GomegaMatcher, desiredMatch bool, optionalDescription ...interface{}) bool { | 
|  | matches, err := matcher.Match(assertion.actualInput) | 
|  | description := assertion.buildDescription(optionalDescription...) | 
|  | if err != nil { | 
|  | assertion.fail(description+err.Error(), 2+assertion.offset) | 
|  | return false | 
|  | } | 
|  | if matches != desiredMatch { | 
|  | var message string | 
|  | if desiredMatch { | 
|  | message = matcher.FailureMessage(assertion.actualInput) | 
|  | } else { | 
|  | message = matcher.NegatedFailureMessage(assertion.actualInput) | 
|  | } | 
|  | assertion.fail(description+message, 2+assertion.offset) | 
|  | return false | 
|  | } | 
|  |  | 
|  | return true | 
|  | } | 
|  |  | 
|  | func (assertion *Assertion) vetExtras(optionalDescription ...interface{}) bool { | 
|  | success, message := vetExtras(assertion.extra) | 
|  | if success { | 
|  | return true | 
|  | } | 
|  |  | 
|  | description := assertion.buildDescription(optionalDescription...) | 
|  | assertion.fail(description+message, 2+assertion.offset) | 
|  | return false | 
|  | } | 
|  |  | 
|  | func vetExtras(extras []interface{}) (bool, string) { | 
|  | for i, extra := range extras { | 
|  | if extra != nil { | 
|  | zeroValue := reflect.Zero(reflect.TypeOf(extra)).Interface() | 
|  | if !reflect.DeepEqual(zeroValue, extra) { | 
|  | message := fmt.Sprintf("Unexpected non-nil/non-zero extra argument at index %d:\n\t<%T>: %#v", i+1, extra, extra) | 
|  | return false, message | 
|  | } | 
|  | } | 
|  | } | 
|  | return true, "" | 
|  | } |