| 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, "" |
| } |