// The generalized form of ExpectThat. depth is the distance on the stack // between the caller's frame and the user's frame. Returns passed iff the // match succeeded. func expectThat( x interface{}, m oglematchers.Matcher, depth int, errorParts []interface{}) (passed bool) { // Check whether the value matches. If it does, we are finished. matcherErr := m.Matches(x) if matcherErr == nil { passed = true return } var r FailureRecord // Get information about the call site. var ok bool if _, r.FileName, r.LineNumber, ok = runtime.Caller(depth + 1); !ok { panic("expectThat: runtime.Caller") } r.FileName = path.Base(r.FileName) // Create an appropriate failure message. Make sure that the expected and // actual values align properly. relativeClause := "" if matcherErr.Error() != "" { relativeClause = fmt.Sprintf(", %s", matcherErr.Error()) } r.Error = fmt.Sprintf( "Expected: %s\nActual: %v%s", m.Description(), x, relativeClause) // Add the user error, if any. if len(errorParts) != 0 { v := reflect.ValueOf(errorParts[0]) if v.Kind() != reflect.String { panic(fmt.Sprintf("ExpectThat: invalid format string type %v", v.Kind())) } r.Error = fmt.Sprintf( "%s\n%s", r.Error, fmt.Sprintf(v.String(), errorParts[1:]...)) } // Report the failure. AddFailureRecord(r) return }
func matches(matcher ogle.Matcher, o interface{}) bool { err := matcher.Matches(o) return err == nil }