mirror of
https://github.com/stretchr/testify.git
synced 2025-04-28 13:59:07 +00:00
Rename CompareType to compareResult to make it private. This type is used only in internal functions and is of no use for external users and should never have been made public. CompareType has been introduced by 0b4ff03cda5c8eb0150a14ffbaaa088fd777d6ba and appeared in releases since v1.6.0. Note: strictly speaking, this is a breaking change, but no external user should have ever used assert.CompareType as it made no sense in the assert API. A search on GitHub has revealed no use of it. https://github.com/search?q=assert.CompareType+language%3AGo&type=Repositories&ref=advsearch&l=Go&l=
82 lines
2.7 KiB
Go
82 lines
2.7 KiB
Go
package assert
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
// isOrdered checks that collection contains orderable elements.
|
|
func isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
|
|
objKind := reflect.TypeOf(object).Kind()
|
|
if objKind != reflect.Slice && objKind != reflect.Array {
|
|
return false
|
|
}
|
|
|
|
objValue := reflect.ValueOf(object)
|
|
objLen := objValue.Len()
|
|
|
|
if objLen <= 1 {
|
|
return true
|
|
}
|
|
|
|
value := objValue.Index(0)
|
|
valueInterface := value.Interface()
|
|
firstValueKind := value.Kind()
|
|
|
|
for i := 1; i < objLen; i++ {
|
|
prevValue := value
|
|
prevValueInterface := valueInterface
|
|
|
|
value = objValue.Index(i)
|
|
valueInterface = value.Interface()
|
|
|
|
compareResult, isComparable := compare(prevValueInterface, valueInterface, firstValueKind)
|
|
|
|
if !isComparable {
|
|
return Fail(t, fmt.Sprintf("Can not compare type \"%s\" and \"%s\"", reflect.TypeOf(value), reflect.TypeOf(prevValue)), msgAndArgs...)
|
|
}
|
|
|
|
if !containsValue(allowedComparesResults, compareResult) {
|
|
return Fail(t, fmt.Sprintf(failMessage, prevValue, value), msgAndArgs...)
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// IsIncreasing asserts that the collection is increasing
|
|
//
|
|
// assert.IsIncreasing(t, []int{1, 2, 3})
|
|
// 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, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
|
}
|
|
|
|
// IsNonIncreasing asserts that the collection is not increasing
|
|
//
|
|
// assert.IsNonIncreasing(t, []int{2, 1, 1})
|
|
// 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, []compareResult{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
|
}
|
|
|
|
// IsDecreasing asserts that the collection is decreasing
|
|
//
|
|
// assert.IsDecreasing(t, []int{2, 1, 0})
|
|
// 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, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
|
}
|
|
|
|
// IsNonDecreasing asserts that the collection is not decreasing
|
|
//
|
|
// assert.IsNonDecreasing(t, []int{1, 1, 2})
|
|
// 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, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
|
}
|