|
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 } |