assertion_order.go (2779B)
1 package assert 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 // isOrdered checks that collection contains orderable elements. 9 func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { 10 objKind := reflect.TypeOf(object).Kind() 11 if objKind != reflect.Slice && objKind != reflect.Array { 12 return false 13 } 14 15 objValue := reflect.ValueOf(object) 16 objLen := objValue.Len() 17 18 if objLen <= 1 { 19 return true 20 } 21 22 value := objValue.Index(0) 23 valueInterface := value.Interface() 24 firstValueKind := value.Kind() 25 26 for i := 1; i < objLen; i++ { 27 prevValue := value 28 prevValueInterface := valueInterface 29 30 value = objValue.Index(i) 31 valueInterface = value.Interface() 32 33 compareResult, isComparable := compare(prevValueInterface, valueInterface, firstValueKind) 34 35 if !isComparable { 36 return Fail(t, fmt.Sprintf("Can not compare type \"%s\" and \"%s\"", reflect.TypeOf(value), reflect.TypeOf(prevValue)), msgAndArgs...) 37 } 38 39 if !containsValue(allowedComparesResults, compareResult) { 40 return Fail(t, fmt.Sprintf(failMessage, prevValue, value), msgAndArgs...) 41 } 42 } 43 44 return true 45 } 46 47 // IsIncreasing asserts that the collection is increasing 48 // 49 // assert.IsIncreasing(t, []int{1, 2, 3}) 50 // assert.IsIncreasing(t, []float{1, 2}) 51 // assert.IsIncreasing(t, []string{"a", "b"}) 52 func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { 53 return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) 54 } 55 56 // IsNonIncreasing asserts that the collection is not increasing 57 // 58 // assert.IsNonIncreasing(t, []int{2, 1, 1}) 59 // assert.IsNonIncreasing(t, []float{2, 1}) 60 // assert.IsNonIncreasing(t, []string{"b", "a"}) 61 func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { 62 return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) 63 } 64 65 // IsDecreasing asserts that the collection is decreasing 66 // 67 // assert.IsDecreasing(t, []int{2, 1, 0}) 68 // assert.IsDecreasing(t, []float{2, 1}) 69 // assert.IsDecreasing(t, []string{"b", "a"}) 70 func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { 71 return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) 72 } 73 74 // IsNonDecreasing asserts that the collection is not decreasing 75 // 76 // assert.IsNonDecreasing(t, []int{1, 1, 2}) 77 // assert.IsNonDecreasing(t, []float{1, 2}) 78 // assert.IsNonDecreasing(t, []string{"a", "b"}) 79 func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { 80 return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) 81 }