| package matchers | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"github.com/onsi/gomega/format" | 
 | 	"time" | 
 | ) | 
 |  | 
 | type BeTemporallyMatcher struct { | 
 | 	Comparator string | 
 | 	CompareTo  time.Time | 
 | 	Threshold  []time.Duration | 
 | } | 
 |  | 
 | func (matcher *BeTemporallyMatcher) FailureMessage(actual interface{}) (message string) { | 
 | 	return format.Message(actual, fmt.Sprintf("to be %s", matcher.Comparator), matcher.CompareTo) | 
 | } | 
 |  | 
 | func (matcher *BeTemporallyMatcher) NegatedFailureMessage(actual interface{}) (message string) { | 
 | 	return format.Message(actual, fmt.Sprintf("not to be %s", matcher.Comparator), matcher.CompareTo) | 
 | } | 
 |  | 
 | func (matcher *BeTemporallyMatcher) Match(actual interface{}) (bool, error) { | 
 | 	// predicate to test for time.Time type | 
 | 	isTime := func(t interface{}) bool { | 
 | 		_, ok := t.(time.Time) | 
 | 		return ok | 
 | 	} | 
 |  | 
 | 	if !isTime(actual) { | 
 | 		return false, fmt.Errorf("Expected a time.Time.  Got:\n%s", format.Object(actual, 1)) | 
 | 	} | 
 |  | 
 | 	switch matcher.Comparator { | 
 | 	case "==", "~", ">", ">=", "<", "<=": | 
 | 	default: | 
 | 		return false, fmt.Errorf("Unknown comparator: %s", matcher.Comparator) | 
 | 	} | 
 |  | 
 | 	var threshold = time.Millisecond | 
 | 	if len(matcher.Threshold) == 1 { | 
 | 		threshold = matcher.Threshold[0] | 
 | 	} | 
 |  | 
 | 	return matcher.matchTimes(actual.(time.Time), matcher.CompareTo, threshold), nil | 
 | } | 
 |  | 
 | func (matcher *BeTemporallyMatcher) matchTimes(actual, compareTo time.Time, threshold time.Duration) (success bool) { | 
 | 	switch matcher.Comparator { | 
 | 	case "==": | 
 | 		return actual.Equal(compareTo) | 
 | 	case "~": | 
 | 		diff := actual.Sub(compareTo) | 
 | 		return -threshold <= diff && diff <= threshold | 
 | 	case ">": | 
 | 		return actual.After(compareTo) | 
 | 	case ">=": | 
 | 		return !actual.Before(compareTo) | 
 | 	case "<": | 
 | 		return actual.Before(compareTo) | 
 | 	case "<=": | 
 | 		return !actual.After(compareTo) | 
 | 	} | 
 | 	return false | 
 | } |