| package assert |
| |
| import ( |
| "fmt" |
| "reflect" |
| ) |
| |
| type CompareType int |
| |
| const ( |
| compareLess CompareType = iota - 1 |
| compareEqual |
| compareGreater |
| ) |
| |
| func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { |
| switch kind { |
| case reflect.Int: |
| { |
| intobj1 := obj1.(int) |
| intobj2 := obj2.(int) |
| if intobj1 > intobj2 { |
| return compareGreater, true |
| } |
| if intobj1 == intobj2 { |
| return compareEqual, true |
| } |
| if intobj1 < intobj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Int8: |
| { |
| int8obj1 := obj1.(int8) |
| int8obj2 := obj2.(int8) |
| if int8obj1 > int8obj2 { |
| return compareGreater, true |
| } |
| if int8obj1 == int8obj2 { |
| return compareEqual, true |
| } |
| if int8obj1 < int8obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Int16: |
| { |
| int16obj1 := obj1.(int16) |
| int16obj2 := obj2.(int16) |
| if int16obj1 > int16obj2 { |
| return compareGreater, true |
| } |
| if int16obj1 == int16obj2 { |
| return compareEqual, true |
| } |
| if int16obj1 < int16obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Int32: |
| { |
| int32obj1 := obj1.(int32) |
| int32obj2 := obj2.(int32) |
| if int32obj1 > int32obj2 { |
| return compareGreater, true |
| } |
| if int32obj1 == int32obj2 { |
| return compareEqual, true |
| } |
| if int32obj1 < int32obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Int64: |
| { |
| int64obj1 := obj1.(int64) |
| int64obj2 := obj2.(int64) |
| if int64obj1 > int64obj2 { |
| return compareGreater, true |
| } |
| if int64obj1 == int64obj2 { |
| return compareEqual, true |
| } |
| if int64obj1 < int64obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Uint: |
| { |
| uintobj1 := obj1.(uint) |
| uintobj2 := obj2.(uint) |
| if uintobj1 > uintobj2 { |
| return compareGreater, true |
| } |
| if uintobj1 == uintobj2 { |
| return compareEqual, true |
| } |
| if uintobj1 < uintobj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Uint8: |
| { |
| uint8obj1 := obj1.(uint8) |
| uint8obj2 := obj2.(uint8) |
| if uint8obj1 > uint8obj2 { |
| return compareGreater, true |
| } |
| if uint8obj1 == uint8obj2 { |
| return compareEqual, true |
| } |
| if uint8obj1 < uint8obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Uint16: |
| { |
| uint16obj1 := obj1.(uint16) |
| uint16obj2 := obj2.(uint16) |
| if uint16obj1 > uint16obj2 { |
| return compareGreater, true |
| } |
| if uint16obj1 == uint16obj2 { |
| return compareEqual, true |
| } |
| if uint16obj1 < uint16obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Uint32: |
| { |
| uint32obj1 := obj1.(uint32) |
| uint32obj2 := obj2.(uint32) |
| if uint32obj1 > uint32obj2 { |
| return compareGreater, true |
| } |
| if uint32obj1 == uint32obj2 { |
| return compareEqual, true |
| } |
| if uint32obj1 < uint32obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Uint64: |
| { |
| uint64obj1 := obj1.(uint64) |
| uint64obj2 := obj2.(uint64) |
| if uint64obj1 > uint64obj2 { |
| return compareGreater, true |
| } |
| if uint64obj1 == uint64obj2 { |
| return compareEqual, true |
| } |
| if uint64obj1 < uint64obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Float32: |
| { |
| float32obj1 := obj1.(float32) |
| float32obj2 := obj2.(float32) |
| if float32obj1 > float32obj2 { |
| return compareGreater, true |
| } |
| if float32obj1 == float32obj2 { |
| return compareEqual, true |
| } |
| if float32obj1 < float32obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.Float64: |
| { |
| float64obj1 := obj1.(float64) |
| float64obj2 := obj2.(float64) |
| if float64obj1 > float64obj2 { |
| return compareGreater, true |
| } |
| if float64obj1 == float64obj2 { |
| return compareEqual, true |
| } |
| if float64obj1 < float64obj2 { |
| return compareLess, true |
| } |
| } |
| case reflect.String: |
| { |
| stringobj1 := obj1.(string) |
| stringobj2 := obj2.(string) |
| if stringobj1 > stringobj2 { |
| return compareGreater, true |
| } |
| if stringobj1 == stringobj2 { |
| return compareEqual, true |
| } |
| if stringobj1 < stringobj2 { |
| return compareLess, true |
| } |
| } |
| } |
| |
| return compareEqual, false |
| } |
| |
| // Greater asserts that the first element is greater than the second |
| // |
| // assert.Greater(t, 2, 1) |
| // 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) |
| } |
| |
| // GreaterOrEqual asserts that the first element is greater than or equal to the second |
| // |
| // assert.GreaterOrEqual(t, 2, 1) |
| // assert.GreaterOrEqual(t, 2, 2) |
| // 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) |
| } |
| |
| // Less asserts that the first element is less than the second |
| // |
| // assert.Less(t, 1, 2) |
| // 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) |
| } |
| |
| // LessOrEqual asserts that the first element is less than or equal to the second |
| // |
| // assert.LessOrEqual(t, 1, 2) |
| // assert.LessOrEqual(t, 2, 2) |
| // 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) |
| } |
| |
| func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { |
| if h, ok := t.(tHelper); ok { |
| h.Helper() |
| } |
| |
| e1Kind := reflect.ValueOf(e1).Kind() |
| e2Kind := reflect.ValueOf(e2).Kind() |
| if e1Kind != e2Kind { |
| return Fail(t, "Elements should be the same type", msgAndArgs...) |
| } |
| |
| compareResult, isComparable := compare(e1, e2, e1Kind) |
| if !isComparable { |
| return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) |
| } |
| |
| if !containsValue(allowedComparesResults, compareResult) { |
| return Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...) |
| } |
| |
| return true |
| } |
| |
| func containsValue(values []CompareType, value CompareType) bool { |
| for _, v := range values { |
| if v == value { |
| return true |
| } |
| } |
| |
| return false |
| } |