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 ValidateValue(res ResourceRead, property string, expectedValue interface{}, actual interface{}, skip bool) TestResult { id := res.ID() title := res.GetTitle() meta := res.GetMeta() typ := reflect.TypeOf(res) typeS := strings.Split(typ.String(), ".")[1] startTime := time.Now() if skip { return skipResult( typeS, Values, id, title, meta, property, startTime, ) } var foundValue interface{} var err error switch f := actual.(type) { case func() (bool, error): foundValue, err = f() case func() (string, error): foundValue, err = f() case func() (int, error): foundValue, err = f() case func() ([]string, error): foundValue, err = f() case func() (interface{}, error): foundValue, err = f() default: err = fmt.Errorf("Unknown method signature: %t", f) } expectedValue = sanitizeExpectedValue(expectedValue) var gomegaMatcher types.GomegaMatcher var success bool if err == nil { gomegaMatcher, err = matcherToGomegaMatcher(expectedValue) } if err == nil { success, err = gomegaMatcher.Match(foundValue) } if err != nil { return TestResult{ Successful: false, Result: FAIL, ResourceType: typeS, TestType: Values, ResourceId: id, Title: title, Meta: meta, Property: property, Err: err, Duration: time.Now().Sub(startTime), } } var failMessage string var result int if !success { failMessage = gomegaMatcher.FailureMessage(foundValue) result = FAIL } expected, _ := json.Marshal(expectedValue) found, _ := json.Marshal(foundValue) return TestResult{ Successful: success, Result: result, ResourceType: typeS, TestType: Value, ResourceId: id, Title: title, Meta: meta, Property: property, Expected: []string{string(expected)}, Found: []string{string(found)}, Human: failMessage, Err: err, Duration: time.Now().Sub(startTime), } }
func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch bool, optionalDescription ...interface{}) bool { timer := time.Now() timeout := time.After(assertion.timeoutInterval) description := assertion.buildDescription(optionalDescription...) var matches bool var err error mayChange := true value, err := assertion.pollActual() if err == nil { mayChange = assertion.matcherMayChange(matcher, value) matches, err = matcher.Match(value) } fail := func(preamble string) { errMsg := "" message := "" if err != nil { errMsg = "Error: " + err.Error() } else { if desiredMatch { message = matcher.FailureMessage(value) } else { message = matcher.NegatedFailureMessage(value) } } assertion.fail(fmt.Sprintf("%s after %.3fs.\n%s%s%s", preamble, time.Since(timer).Seconds(), description, message, errMsg), 3+assertion.offset) } if assertion.asyncType == AsyncAssertionTypeEventually { for { if err == nil && matches == desiredMatch { return true } if !mayChange { fail("No future change is possible. Bailing out early") return false } select { case <-time.After(assertion.pollingInterval): value, err = assertion.pollActual() if err == nil { mayChange = assertion.matcherMayChange(matcher, value) matches, err = matcher.Match(value) } case <-timeout: fail("Timed out") return false } } } else if assertion.asyncType == AsyncAssertionTypeConsistently { for { if !(err == nil && matches == desiredMatch) { fail("Failed") return false } if !mayChange { return true } select { case <-time.After(assertion.pollingInterval): value, err = assertion.pollActual() if err == nil { mayChange = assertion.matcherMayChange(matcher, value) matches, err = matcher.Match(value) } case <-timeout: return true } } } return false }
// verifyFailureMessage expects the matcher to fail with the given input, and verifies the failure message. func verifyFailureMessage(m types.GomegaMatcher, input string, expectedFailureMsgFragment string) { Expect(m.Match(input)).To(BeFalse()) Expect(m.FailureMessage(input)).To(Equal( "Expected\n <string>: " + input + "\n" + expectedFailureMsgFragment)) }