diff options
Diffstat (limited to 'vendor/github.com/stretchr/testify/assert')
7 files changed, 194 insertions, 48 deletions
diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go index 41649d267..3bb22a971 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -3,6 +3,7 @@ package assert  import (  	"fmt"  	"reflect" +	"time"  )  type CompareType int @@ -30,6 +31,8 @@ var (  	float64Type = reflect.TypeOf(float64(1))  	stringType = reflect.TypeOf("") + +	timeType = reflect.TypeOf(time.Time{})  )  func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { @@ -299,6 +302,27 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {  				return compareLess, true  			}  		} +	// Check for known struct types we can check for compare results. +	case reflect.Struct: +		{ +			// All structs enter here. We're not interested in most types. +			if !canConvert(obj1Value, timeType) { +				break +			} + +			// time.Time can compared! +			timeObj1, ok := obj1.(time.Time) +			if !ok { +				timeObj1 = obj1Value.Convert(timeType).Interface().(time.Time) +			} + +			timeObj2, ok := obj2.(time.Time) +			if !ok { +				timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time) +			} + +			return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64) +		}  	}  	return compareEqual, false @@ -310,7 +334,10 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {  //    assert.Greater(t, float64(2), float64(1))  //    assert.Greater(t, "b", "a")  func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { -	return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) +	if h, ok := t.(tHelper); ok { +		h.Helper() +	} +	return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)  }  // GreaterOrEqual asserts that the first element is greater than or equal to the second @@ -320,7 +347,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface  //    assert.GreaterOrEqual(t, "b", "a")  //    assert.GreaterOrEqual(t, "b", "b")  func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { -	return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) +	if h, ok := t.(tHelper); ok { +		h.Helper() +	} +	return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)  }  // Less asserts that the first element is less than the second @@ -329,7 +359,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in  //    assert.Less(t, float64(1), float64(2))  //    assert.Less(t, "a", "b")  func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { -	return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) +	if h, ok := t.(tHelper); ok { +		h.Helper() +	} +	return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)  }  // LessOrEqual asserts that the first element is less than or equal to the second @@ -339,7 +372,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})  //    assert.LessOrEqual(t, "a", "b")  //    assert.LessOrEqual(t, "b", "b")  func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { -	return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) +	if h, ok := t.(tHelper); ok { +		h.Helper() +	} +	return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)  }  // Positive asserts that the specified element is positive @@ -347,8 +383,11 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter  //    assert.Positive(t, 1)  //    assert.Positive(t, 1.23)  func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { +	if h, ok := t.(tHelper); ok { +		h.Helper() +	}  	zero := reflect.Zero(reflect.TypeOf(e)) -	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs) +	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...)  }  // Negative asserts that the specified element is negative @@ -356,8 +395,11 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {  //    assert.Negative(t, -1)  //    assert.Negative(t, -1.23)  func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { +	if h, ok := t.(tHelper); ok { +		h.Helper() +	}  	zero := reflect.Zero(reflect.TypeOf(e)) -	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs) +	return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...)  }  func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go b/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go new file mode 100644 index 000000000..df22c47fc --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go @@ -0,0 +1,16 @@ +//go:build go1.17 +// +build go1.17 + +// TODO: once support for Go 1.16 is dropped, this file can be +//       merged/removed with assertion_compare_go1.17_test.go and +//       assertion_compare_legacy.go + +package assert + +import "reflect" + +// Wrapper around reflect.Value.CanConvert, for compatability +// reasons. +func canConvert(value reflect.Value, to reflect.Type) bool { +	return value.CanConvert(to) +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go b/vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go new file mode 100644 index 000000000..1701af2a3 --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go @@ -0,0 +1,16 @@ +//go:build !go1.17 +// +build !go1.17 + +// TODO: once support for Go 1.16 is dropped, this file can be +//       merged/removed with assertion_compare_go1.17_test.go and +//       assertion_compare_can_convert.go + +package assert + +import "reflect" + +// Older versions of Go does not have the reflect.Value.CanConvert +// method. +func canConvert(value reflect.Value, to reflect.Type) bool { +	return false +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index 4dfd1229a..27e2420ed 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -123,6 +123,18 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int  	return ErrorAs(t, err, target, append([]interface{}{msg}, args...)...)  } +// ErrorContainsf asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +//   actualObj, err := SomeFunction() +//   assert.ErrorContainsf(t, err,  expectedErrorSubString, "error message %s", "formatted") +func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool { +	if h, ok := t.(tHelper); ok { +		h.Helper() +	} +	return ErrorContains(t, theError, contains, append([]interface{}{msg}, args...)...) +} +  // ErrorIsf asserts that at least one of the errors in err's chain matches target.  // This is a wrapper for errors.Is.  func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index 25337a6f0..d9ea368d0 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -222,6 +222,30 @@ func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ..  	return ErrorAsf(a.t, err, target, msg, args...)  } +// ErrorContains asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +//   actualObj, err := SomeFunction() +//   a.ErrorContains(err,  expectedErrorSubString) +func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) bool { +	if h, ok := a.t.(tHelper); ok { +		h.Helper() +	} +	return ErrorContains(a.t, theError, contains, msgAndArgs...) +} + +// ErrorContainsf asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +//   actualObj, err := SomeFunction() +//   a.ErrorContainsf(err,  expectedErrorSubString, "error message %s", "formatted") +func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) bool { +	if h, ok := a.t.(tHelper); ok { +		h.Helper() +	} +	return ErrorContainsf(a.t, theError, contains, msg, args...) +} +  // ErrorIs asserts that at least one of the errors in err's chain matches target.  // This is a wrapper for errors.Is.  func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) bool { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_order.go index 1c3b47182..759448783 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_order.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_order.go @@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT  //    assert.IsIncreasing(t, []float{1, 2})  //    assert.IsIncreasing(t, []string{"a", "b"})  func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { -	return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) +	return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)  }  // IsNonIncreasing asserts that the collection is not increasing @@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo  //    assert.IsNonIncreasing(t, []float{2, 1})  //    assert.IsNonIncreasing(t, []string{"b", "a"})  func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { -	return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) +	return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)  }  // IsDecreasing asserts that the collection is decreasing @@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})  //    assert.IsDecreasing(t, []float{2, 1})  //    assert.IsDecreasing(t, []string{"b", "a"})  func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { -	return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) +	return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)  }  // IsNonDecreasing asserts that the collection is not decreasing @@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo  //    assert.IsNonDecreasing(t, []float{1, 2})  //    assert.IsNonDecreasing(t, []string{"a", "b"})  func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { -	return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) +	return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)  } diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index bcac4401f..0357b2231 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -718,10 +718,14 @@ func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...inte  // return (false, false) if impossible.  // return (true, false) if element was not found.  // return (true, true) if element was found. -func includeElement(list interface{}, element interface{}) (ok, found bool) { +func containsElement(list interface{}, element interface{}) (ok, found bool) {  	listValue := reflect.ValueOf(list) -	listKind := reflect.TypeOf(list).Kind() +	listType := reflect.TypeOf(list) +	if listType == nil { +		return false, false +	} +	listKind := listType.Kind()  	defer func() {  		if e := recover(); e != nil {  			ok = false @@ -764,7 +768,7 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo  		h.Helper()  	} -	ok, found := includeElement(s, contains) +	ok, found := containsElement(s, contains)  	if !ok {  		return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...)  	} @@ -787,7 +791,7 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{})  		h.Helper()  	} -	ok, found := includeElement(s, contains) +	ok, found := containsElement(s, contains)  	if !ok {  		return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...)  	} @@ -831,7 +835,7 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok  	for i := 0; i < subsetValue.Len(); i++ {  		element := subsetValue.Index(i).Interface() -		ok, found := includeElement(list, element) +		ok, found := containsElement(list, element)  		if !ok {  			return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...)  		} @@ -852,7 +856,7 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{})  		h.Helper()  	}  	if subset == nil { -		return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...) +		return Fail(t, "nil is the empty set which is a subset of every set", msgAndArgs...)  	}  	subsetValue := reflect.ValueOf(subset) @@ -875,7 +879,7 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{})  	for i := 0; i < subsetValue.Len(); i++ {  		element := subsetValue.Index(i).Interface() -		ok, found := includeElement(list, element) +		ok, found := containsElement(list, element)  		if !ok {  			return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...)  		} @@ -1000,27 +1004,21 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {  type PanicTestFunc func()  // didPanic returns true if the function passed to it panics. Otherwise, it returns false. -func didPanic(f PanicTestFunc) (bool, interface{}, string) { - -	didPanic := false -	var message interface{} -	var stack string -	func() { - -		defer func() { -			if message = recover(); message != nil { -				didPanic = true -				stack = string(debug.Stack()) -			} -		}() - -		// call the target function -		f() +func didPanic(f PanicTestFunc) (didPanic bool, message interface{}, stack string) { +	didPanic = true +	defer func() { +		message = recover() +		if didPanic { +			stack = string(debug.Stack()) +		}  	}() -	return didPanic, message, stack +	// call the target function +	f() +	didPanic = false +	return  }  // Panics asserts that the code inside the specified PanicTestFunc panics. @@ -1161,11 +1159,15 @@ func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs  	bf, bok := toFloat(actual)  	if !aok || !bok { -		return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) +		return Fail(t, "Parameters must be numerical", msgAndArgs...) +	} + +	if math.IsNaN(af) && math.IsNaN(bf) { +		return true  	}  	if math.IsNaN(af) { -		return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) +		return Fail(t, "Expected must not be NaN", msgAndArgs...)  	}  	if math.IsNaN(bf) { @@ -1188,7 +1190,7 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn  	if expected == nil || actual == nil ||  		reflect.TypeOf(actual).Kind() != reflect.Slice ||  		reflect.TypeOf(expected).Kind() != reflect.Slice { -		return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) +		return Fail(t, "Parameters must be slice", msgAndArgs...)  	}  	actualSlice := reflect.ValueOf(actual) @@ -1250,8 +1252,12 @@ func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, m  func calcRelativeError(expected, actual interface{}) (float64, error) {  	af, aok := toFloat(expected) -	if !aok { -		return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) +	bf, bok := toFloat(actual) +	if !aok || !bok { +		return 0, fmt.Errorf("Parameters must be numerical") +	} +	if math.IsNaN(af) && math.IsNaN(bf) { +		return 0, nil  	}  	if math.IsNaN(af) {  		return 0, errors.New("expected value must not be NaN") @@ -1259,10 +1265,6 @@ func calcRelativeError(expected, actual interface{}) (float64, error) {  	if af == 0 {  		return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error")  	} -	bf, bok := toFloat(actual) -	if !bok { -		return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) -	}  	if math.IsNaN(bf) {  		return 0, errors.New("actual value must not be NaN")  	} @@ -1298,7 +1300,7 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m  	if expected == nil || actual == nil ||  		reflect.TypeOf(actual).Kind() != reflect.Slice ||  		reflect.TypeOf(expected).Kind() != reflect.Slice { -		return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) +		return Fail(t, "Parameters must be slice", msgAndArgs...)  	}  	actualSlice := reflect.ValueOf(actual) @@ -1375,6 +1377,27 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte  	return true  } +// ErrorContains asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +//   actualObj, err := SomeFunction() +//   assert.ErrorContains(t, err,  expectedErrorSubString) +func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool { +	if h, ok := t.(tHelper); ok { +		h.Helper() +	} +	if !Error(t, theError, msgAndArgs...) { +		return false +	} + +	actual := theError.Error() +	if !strings.Contains(actual, contains) { +		return Fail(t, fmt.Sprintf("Error %#v does not contain %#v", actual, contains), msgAndArgs...) +	} + +	return true +} +  // matchRegexp return true if a specified regexp matches a string.  func matchRegexp(rx interface{}, str interface{}) bool { @@ -1588,12 +1611,17 @@ func diff(expected interface{}, actual interface{}) string {  	}  	var e, a string -	if et != reflect.TypeOf("") { -		e = spewConfig.Sdump(expected) -		a = spewConfig.Sdump(actual) -	} else { + +	switch et { +	case reflect.TypeOf(""):  		e = reflect.ValueOf(expected).String()  		a = reflect.ValueOf(actual).String() +	case reflect.TypeOf(time.Time{}): +		e = spewConfigStringerEnabled.Sdump(expected) +		a = spewConfigStringerEnabled.Sdump(actual) +	default: +		e = spewConfig.Sdump(expected) +		a = spewConfig.Sdump(actual)  	}  	diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ @@ -1625,6 +1653,14 @@ var spewConfig = spew.ConfigState{  	MaxDepth:                10,  } +var spewConfigStringerEnabled = spew.ConfigState{ +	Indent:                  " ", +	DisablePointerAddresses: true, +	DisableCapacities:       true, +	SortKeys:                true, +	MaxDepth:                10, +} +  type tHelper interface {  	Helper()  }  | 
