Merge branch 'master' into allow-error-string-from-custom-matcher

allow-error-string-from-custom-matcher
George Lesica 2019-07-09 14:15:54 -06:00
commit 1032e8295b
8 changed files with 168 additions and 30 deletions

View File

@ -332,6 +332,8 @@ Please feel free to submit issues, fork the repository and send pull requests!
When submitting an issue, we ask that you please include a complete test function that demonstrates the issue. Extra credit for those using Testify to write the test code that demonstrates it. When submitting an issue, we ask that you please include a complete test function that demonstrates the issue. Extra credit for those using Testify to write the test code that demonstrates it.
Code generation is used. Look for `CODE GENERATED AUTOMATICALLY` at the top of some files. Run `go generate ./...` to update generated files.
------ ------
License License

View File

@ -113,6 +113,17 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) bool {
return Error(t, err, append([]interface{}{msg}, args...)...) return Error(t, err, append([]interface{}{msg}, args...)...)
} }
// Eventuallyf asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
if h, ok := t.(tHelper); ok {
h.Helper()
}
return Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...)
}
// Exactlyf asserts that two objects are equal in value and type. // Exactlyf asserts that two objects are equal in value and type.
// //
// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) // assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123))
@ -169,7 +180,7 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in
return Greater(t, e1, e2, append([]interface{}{msg}, args...)...) return Greater(t, e1, e2, append([]interface{}{msg}, args...)...)
} }
// GreaterOrEqualf asserts that the first element in greater or equal than the second // GreaterOrEqualf asserts that the first element is greater than or equal to the second
// //
// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") // assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") // assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
@ -325,7 +336,7 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf
return Len(t, object, length, append([]interface{}{msg}, args...)...) return Len(t, object, length, append([]interface{}{msg}, args...)...)
} }
// Lessf asserts that the first element in less than the second // Lessf asserts that the first element is less than the second
// //
// assert.Lessf(t, 1, 2, "error message %s", "formatted") // assert.Lessf(t, 1, 2, "error message %s", "formatted")
// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) // assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2))
@ -337,7 +348,7 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter
return Less(t, e1, e2, append([]interface{}{msg}, args...)...) return Less(t, e1, e2, append([]interface{}{msg}, args...)...)
} }
// LessOrEqualf asserts that the first element in greater or equal than the second // LessOrEqualf asserts that the first element is less than or equal to the second
// //
// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") // assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") // assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted")

View File

@ -215,6 +215,28 @@ func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool {
return Errorf(a.t, err, msg, args...) return Errorf(a.t, err, msg, args...)
} }
// Eventually asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond)
func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
if h, ok := a.t.(tHelper); ok {
h.Helper()
}
return Eventually(a.t, condition, waitFor, tick, msgAndArgs...)
}
// Eventuallyf asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
if h, ok := a.t.(tHelper); ok {
h.Helper()
}
return Eventuallyf(a.t, condition, waitFor, tick, msg, args...)
}
// Exactly asserts that two objects are equal in value and type. // Exactly asserts that two objects are equal in value and type.
// //
// a.Exactly(int32(123), int64(123)) // a.Exactly(int32(123), int64(123))
@ -315,7 +337,7 @@ func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...inter
return Greater(a.t, e1, e2, msgAndArgs...) return Greater(a.t, e1, e2, msgAndArgs...)
} }
// GreaterOrEqual asserts that the first element in greater or equal than the second // GreaterOrEqual asserts that the first element is greater than or equal to the second
// //
// a.GreaterOrEqual(2, 1) // a.GreaterOrEqual(2, 1)
// a.GreaterOrEqual(2, 2) // a.GreaterOrEqual(2, 2)
@ -328,7 +350,7 @@ func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs .
return GreaterOrEqual(a.t, e1, e2, msgAndArgs...) return GreaterOrEqual(a.t, e1, e2, msgAndArgs...)
} }
// GreaterOrEqualf asserts that the first element in greater or equal than the second // GreaterOrEqualf asserts that the first element is greater than or equal to the second
// //
// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") // a.GreaterOrEqualf(2, 1, "error message %s", "formatted")
// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") // a.GreaterOrEqualf(2, 2, "error message %s", "formatted")
@ -639,7 +661,7 @@ func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...in
return Lenf(a.t, object, length, msg, args...) return Lenf(a.t, object, length, msg, args...)
} }
// Less asserts that the first element in less than the second // Less asserts that the first element is less than the second
// //
// a.Less(1, 2) // a.Less(1, 2)
// a.Less(float64(1), float64(2)) // a.Less(float64(1), float64(2))
@ -651,7 +673,7 @@ func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interfac
return Less(a.t, e1, e2, msgAndArgs...) return Less(a.t, e1, e2, msgAndArgs...)
} }
// LessOrEqual asserts that the first element in greater or equal than the second // LessOrEqual asserts that the first element is less than or equal to the second
// //
// a.LessOrEqual(1, 2) // a.LessOrEqual(1, 2)
// a.LessOrEqual(2, 2) // a.LessOrEqual(2, 2)
@ -664,7 +686,7 @@ func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...i
return LessOrEqual(a.t, e1, e2, msgAndArgs...) return LessOrEqual(a.t, e1, e2, msgAndArgs...)
} }
// LessOrEqualf asserts that the first element in greater or equal than the second // LessOrEqualf asserts that the first element is less than or equal to the second
// //
// a.LessOrEqualf(1, 2, "error message %s", "formatted") // a.LessOrEqualf(1, 2, "error message %s", "formatted")
// a.LessOrEqualf(2, 2, "error message %s", "formatted") // a.LessOrEqualf(2, 2, "error message %s", "formatted")
@ -677,7 +699,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar
return LessOrEqualf(a.t, e1, e2, msg, args...) return LessOrEqualf(a.t, e1, e2, msg, args...)
} }
// Lessf asserts that the first element in less than the second // Lessf asserts that the first element is less than the second
// //
// a.Lessf(1, 2, "error message %s", "formatted") // a.Lessf(1, 2, "error message %s", "formatted")
// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) // a.Lessf(float64(1, "error message %s", "formatted"), float64(2))

View File

@ -216,13 +216,13 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
} }
if res != -1 { if res != -1 {
return Fail(t, fmt.Sprintf("\"%s\" is not greater than \"%s\"", e1, e2), msgAndArgs...) return Fail(t, fmt.Sprintf("\"%v\" is not greater than \"%v\"", e1, e2), msgAndArgs...)
} }
return true return true
} }
// GreaterOrEqual asserts that the first element in greater or equal than the second // GreaterOrEqual asserts that the first element is greater than or equal to the second
// //
// assert.GreaterOrEqual(t, 2, 1) // assert.GreaterOrEqual(t, 2, 1)
// assert.GreaterOrEqual(t, 2, 2) // assert.GreaterOrEqual(t, 2, 2)
@ -245,13 +245,13 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
} }
if res != -1 && res != 0 { if res != -1 && res != 0 {
return Fail(t, fmt.Sprintf("\"%s\" is not greater or equal than \"%s\"", e1, e2), msgAndArgs...) return Fail(t, fmt.Sprintf("\"%v\" is not greater than or equal to \"%v\"", e1, e2), msgAndArgs...)
} }
return true return true
} }
// Less asserts that the first element in less than the second // Less asserts that the first element is less than the second
// //
// assert.Less(t, 1, 2) // assert.Less(t, 1, 2)
// assert.Less(t, float64(1), float64(2)) // assert.Less(t, float64(1), float64(2))
@ -273,13 +273,13 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
} }
if res != 1 { if res != 1 {
return Fail(t, fmt.Sprintf("\"%s\" is not less than \"%s\"", e1, e2), msgAndArgs...) return Fail(t, fmt.Sprintf("\"%v\" is not less than \"%v\"", e1, e2), msgAndArgs...)
} }
return true return true
} }
// LessOrEqual asserts that the first element in greater or equal than the second // LessOrEqual asserts that the first element is less than or equal to the second
// //
// assert.LessOrEqual(t, 1, 2) // assert.LessOrEqual(t, 1, 2)
// assert.LessOrEqual(t, 2, 2) // assert.LessOrEqual(t, 2, 2)
@ -302,7 +302,7 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
} }
if res != 1 && res != 0 { if res != 1 && res != 0 {
return Fail(t, fmt.Sprintf("\"%s\" is not less or equal than \"%s\"", e1, e2), msgAndArgs...) return Fail(t, fmt.Sprintf("\"%v\" is not less than or equal to \"%v\"", e1, e2), msgAndArgs...)
} }
return true return true

View File

@ -510,14 +510,14 @@ func isEmpty(object interface{}) bool {
// collection types are empty when they have no element // collection types are empty when they have no element
case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
return objValue.Len() == 0 return objValue.Len() == 0
// pointers are empty if nil or if the value they point to is empty // pointers are empty if nil or if the value they point to is empty
case reflect.Ptr: case reflect.Ptr:
if objValue.IsNil() { if objValue.IsNil() {
return true return true
} }
deref := objValue.Elem().Interface() deref := objValue.Elem().Interface()
return isEmpty(deref) return isEmpty(deref)
// for all other types, compare against the zero value // for all other types, compare against the zero value
default: default:
zero := reflect.Zero(objValue.Type()) zero := reflect.Zero(objValue.Type())
return reflect.DeepEqual(object, zero.Interface()) return reflect.DeepEqual(object, zero.Interface())
@ -1446,3 +1446,34 @@ var spewConfig = spew.ConfigState{
type tHelper interface { type tHelper interface {
Helper() Helper()
} }
// Eventually asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
if h, ok := t.(tHelper); ok {
h.Helper()
}
timer := time.NewTimer(waitFor)
ticker := time.NewTicker(tick)
checkPassed := make(chan bool)
defer timer.Stop()
defer ticker.Stop()
defer close(checkPassed)
for {
select {
case <-timer.C:
return Fail(t, "Condition never satisfied", msgAndArgs...)
case result := <-checkPassed:
if result {
return true
}
case <-ticker.C:
go func() {
checkPassed <- condition()
}()
}
}
}

View File

@ -1824,3 +1824,25 @@ func TestErrorAssertionFunc(t *testing.T) {
}) })
} }
} }
func TestEventuallyFalse(t *testing.T) {
mockT := new(testing.T)
condition := func() bool {
return false
}
False(t, Eventually(mockT, condition, 100*time.Millisecond, 20*time.Millisecond))
}
func TestEventuallyTrue(t *testing.T) {
state := 0
condition := func() bool {
defer func() {
state = state + 1
}()
return state == 2
}
True(t, Eventually(t, condition, 100*time.Millisecond, 20*time.Millisecond))
}

View File

@ -270,6 +270,34 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) {
t.FailNow() t.FailNow()
} }
// Eventually asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond)
func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
if assert.Eventually(t, condition, waitFor, tick, msgAndArgs...) {
return
}
if h, ok := t.(tHelper); ok {
h.Helper()
}
t.FailNow()
}
// Eventuallyf asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
if assert.Eventuallyf(t, condition, waitFor, tick, msg, args...) {
return
}
if h, ok := t.(tHelper); ok {
h.Helper()
}
t.FailNow()
}
// Exactly asserts that two objects are equal in value and type. // Exactly asserts that two objects are equal in value and type.
// //
// assert.Exactly(t, int32(123), int64(123)) // assert.Exactly(t, int32(123), int64(123))
@ -403,7 +431,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
t.FailNow() t.FailNow()
} }
// GreaterOrEqual asserts that the first element in greater or equal than the second // GreaterOrEqual asserts that the first element is greater than or equal to the second
// //
// assert.GreaterOrEqual(t, 2, 1) // assert.GreaterOrEqual(t, 2, 1)
// assert.GreaterOrEqual(t, 2, 2) // assert.GreaterOrEqual(t, 2, 2)
@ -419,7 +447,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
t.FailNow() t.FailNow()
} }
// GreaterOrEqualf asserts that the first element in greater or equal than the second // GreaterOrEqualf asserts that the first element is greater than or equal to the second
// //
// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") // assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted")
// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") // assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted")
@ -820,7 +848,7 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf
t.FailNow() t.FailNow()
} }
// Less asserts that the first element in less than the second // Less asserts that the first element is less than the second
// //
// assert.Less(t, 1, 2) // assert.Less(t, 1, 2)
// assert.Less(t, float64(1), float64(2)) // assert.Less(t, float64(1), float64(2))
@ -835,7 +863,7 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
t.FailNow() t.FailNow()
} }
// LessOrEqual asserts that the first element in greater or equal than the second // LessOrEqual asserts that the first element is less than or equal to the second
// //
// assert.LessOrEqual(t, 1, 2) // assert.LessOrEqual(t, 1, 2)
// assert.LessOrEqual(t, 2, 2) // assert.LessOrEqual(t, 2, 2)
@ -851,7 +879,7 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
t.FailNow() t.FailNow()
} }
// LessOrEqualf asserts that the first element in greater or equal than the second // LessOrEqualf asserts that the first element is less than or equal to the second
// //
// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") // assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted")
// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") // assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted")
@ -867,7 +895,7 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args .
t.FailNow() t.FailNow()
} }
// Lessf asserts that the first element in less than the second // Lessf asserts that the first element is less than the second
// //
// assert.Lessf(t, 1, 2, "error message %s", "formatted") // assert.Lessf(t, 1, 2, "error message %s", "formatted")
// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) // assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2))

View File

@ -216,6 +216,28 @@ func (a *Assertions) Errorf(err error, msg string, args ...interface{}) {
Errorf(a.t, err, msg, args...) Errorf(a.t, err, msg, args...)
} }
// Eventually asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond)
func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
if h, ok := a.t.(tHelper); ok {
h.Helper()
}
Eventually(a.t, condition, waitFor, tick, msgAndArgs...)
}
// Eventuallyf asserts that given condition will be met in waitFor time,
// periodically checking target function each tick.
//
// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted")
func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
if h, ok := a.t.(tHelper); ok {
h.Helper()
}
Eventuallyf(a.t, condition, waitFor, tick, msg, args...)
}
// Exactly asserts that two objects are equal in value and type. // Exactly asserts that two objects are equal in value and type.
// //
// a.Exactly(int32(123), int64(123)) // a.Exactly(int32(123), int64(123))
@ -316,7 +338,7 @@ func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...inter
Greater(a.t, e1, e2, msgAndArgs...) Greater(a.t, e1, e2, msgAndArgs...)
} }
// GreaterOrEqual asserts that the first element in greater or equal than the second // GreaterOrEqual asserts that the first element is greater than or equal to the second
// //
// a.GreaterOrEqual(2, 1) // a.GreaterOrEqual(2, 1)
// a.GreaterOrEqual(2, 2) // a.GreaterOrEqual(2, 2)
@ -329,7 +351,7 @@ func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs .
GreaterOrEqual(a.t, e1, e2, msgAndArgs...) GreaterOrEqual(a.t, e1, e2, msgAndArgs...)
} }
// GreaterOrEqualf asserts that the first element in greater or equal than the second // GreaterOrEqualf asserts that the first element is greater than or equal to the second
// //
// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") // a.GreaterOrEqualf(2, 1, "error message %s", "formatted")
// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") // a.GreaterOrEqualf(2, 2, "error message %s", "formatted")
@ -640,7 +662,7 @@ func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...in
Lenf(a.t, object, length, msg, args...) Lenf(a.t, object, length, msg, args...)
} }
// Less asserts that the first element in less than the second // Less asserts that the first element is less than the second
// //
// a.Less(1, 2) // a.Less(1, 2)
// a.Less(float64(1), float64(2)) // a.Less(float64(1), float64(2))
@ -652,7 +674,7 @@ func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interfac
Less(a.t, e1, e2, msgAndArgs...) Less(a.t, e1, e2, msgAndArgs...)
} }
// LessOrEqual asserts that the first element in greater or equal than the second // LessOrEqual asserts that the first element is less than or equal to the second
// //
// a.LessOrEqual(1, 2) // a.LessOrEqual(1, 2)
// a.LessOrEqual(2, 2) // a.LessOrEqual(2, 2)
@ -665,7 +687,7 @@ func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...i
LessOrEqual(a.t, e1, e2, msgAndArgs...) LessOrEqual(a.t, e1, e2, msgAndArgs...)
} }
// LessOrEqualf asserts that the first element in greater or equal than the second // LessOrEqualf asserts that the first element is less than or equal to the second
// //
// a.LessOrEqualf(1, 2, "error message %s", "formatted") // a.LessOrEqualf(1, 2, "error message %s", "formatted")
// a.LessOrEqualf(2, 2, "error message %s", "formatted") // a.LessOrEqualf(2, 2, "error message %s", "formatted")
@ -678,7 +700,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar
LessOrEqualf(a.t, e1, e2, msg, args...) LessOrEqualf(a.t, e1, e2, msg, args...)
} }
// Lessf asserts that the first element in less than the second // Lessf asserts that the first element is less than the second
// //
// a.Lessf(1, 2, "error message %s", "formatted") // a.Lessf(1, 2, "error message %s", "formatted")
// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) // a.Lessf(float64(1, "error message %s", "formatted"), float64(2))