assertion_order.go raw

   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 []compareResult, 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 "%T" and "%T"`, value, 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, []compareResult{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, []compareResult{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, []compareResult{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, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
  81  }
  82