Update testing dependencies
This commit is contained in:
parent
3918ed2a05
commit
377aee0562
|
@ -1,6 +1,6 @@
|
||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2012-2013 Dave Collins <dave@davec.name>
|
Copyright (c) 2012-2016 Dave Collins <dave@davec.name>
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software for any
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2015 Dave Collins <dave@davec.name>
|
// Copyright (c) 2015-2016 Dave Collins <dave@davec.name>
|
||||||
//
|
//
|
||||||
// Permission to use, copy, modify, and distribute this software for any
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
// purpose with or without fee is hereby granted, provided that the above
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2015 Dave Collins <dave@davec.name>
|
// Copyright (c) 2015-2016 Dave Collins <dave@davec.name>
|
||||||
//
|
//
|
||||||
// Permission to use, copy, modify, and distribute this software for any
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
// purpose with or without fee is hereby granted, provided that the above
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 Dave Collins <dave@davec.name>
|
* Copyright (c) 2013-2016 Dave Collins <dave@davec.name>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 Dave Collins <dave@davec.name>
|
* Copyright (c) 2013-2016 Dave Collins <dave@davec.name>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -67,6 +67,15 @@ type ConfigState struct {
|
||||||
// Google App Engine or with the "safe" build tag specified.
|
// Google App Engine or with the "safe" build tag specified.
|
||||||
DisablePointerMethods bool
|
DisablePointerMethods bool
|
||||||
|
|
||||||
|
// DisablePointerAddresses specifies whether to disable the printing of
|
||||||
|
// pointer addresses. This is useful when diffing data structures in tests.
|
||||||
|
DisablePointerAddresses bool
|
||||||
|
|
||||||
|
// DisableCapacities specifies whether to disable the printing of capacities
|
||||||
|
// for arrays, slices, maps and channels. This is useful when diffing
|
||||||
|
// data structures in tests.
|
||||||
|
DisableCapacities bool
|
||||||
|
|
||||||
// ContinueOnMethod specifies whether or not recursion should continue once
|
// ContinueOnMethod specifies whether or not recursion should continue once
|
||||||
// a custom error or Stringer interface is invoked. The default, false,
|
// a custom error or Stringer interface is invoked. The default, false,
|
||||||
// means it will print the results of invoking the custom error or Stringer
|
// means it will print the results of invoking the custom error or Stringer
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 Dave Collins <dave@davec.name>
|
* Copyright (c) 2013-2016 Dave Collins <dave@davec.name>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -91,6 +91,15 @@ The following configuration options are available:
|
||||||
which only accept pointer receivers from non-pointer variables.
|
which only accept pointer receivers from non-pointer variables.
|
||||||
Pointer method invocation is enabled by default.
|
Pointer method invocation is enabled by default.
|
||||||
|
|
||||||
|
* DisablePointerAddresses
|
||||||
|
DisablePointerAddresses specifies whether to disable the printing of
|
||||||
|
pointer addresses. This is useful when diffing data structures in tests.
|
||||||
|
|
||||||
|
* DisableCapacities
|
||||||
|
DisableCapacities specifies whether to disable the printing of
|
||||||
|
capacities for arrays, slices, maps and channels. This is useful when
|
||||||
|
diffing data structures in tests.
|
||||||
|
|
||||||
* ContinueOnMethod
|
* ContinueOnMethod
|
||||||
Enables recursion into types after invoking error and Stringer interface
|
Enables recursion into types after invoking error and Stringer interface
|
||||||
methods. Recursion after method invocation is disabled by default.
|
methods. Recursion after method invocation is disabled by default.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 Dave Collins <dave@davec.name>
|
* Copyright (c) 2013-2016 Dave Collins <dave@davec.name>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -129,7 +129,7 @@ func (d *dumpState) dumpPtr(v reflect.Value) {
|
||||||
d.w.Write(closeParenBytes)
|
d.w.Write(closeParenBytes)
|
||||||
|
|
||||||
// Display pointer information.
|
// Display pointer information.
|
||||||
if len(pointerChain) > 0 {
|
if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 {
|
||||||
d.w.Write(openParenBytes)
|
d.w.Write(openParenBytes)
|
||||||
for i, addr := range pointerChain {
|
for i, addr := range pointerChain {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
|
@ -282,13 +282,13 @@ func (d *dumpState) dump(v reflect.Value) {
|
||||||
case reflect.Map, reflect.String:
|
case reflect.Map, reflect.String:
|
||||||
valueLen = v.Len()
|
valueLen = v.Len()
|
||||||
}
|
}
|
||||||
if valueLen != 0 || valueCap != 0 {
|
if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 {
|
||||||
d.w.Write(openParenBytes)
|
d.w.Write(openParenBytes)
|
||||||
if valueLen != 0 {
|
if valueLen != 0 {
|
||||||
d.w.Write(lenEqualsBytes)
|
d.w.Write(lenEqualsBytes)
|
||||||
printInt(d.w, int64(valueLen), 10)
|
printInt(d.w, int64(valueLen), 10)
|
||||||
}
|
}
|
||||||
if valueCap != 0 {
|
if !d.cs.DisableCapacities && valueCap != 0 {
|
||||||
if valueLen != 0 {
|
if valueLen != 0 {
|
||||||
d.w.Write(spaceBytes)
|
d.w.Write(spaceBytes)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 Dave Collins <dave@davec.name>
|
* Copyright (c) 2013-2016 Dave Collins <dave@davec.name>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013 Dave Collins <dave@davec.name>
|
* Copyright (c) 2013-2016 Dave Collins <dave@davec.name>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
|
@ -6,19 +6,16 @@
|
||||||
package assert
|
package assert
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
||||||
http "net/http"
|
http "net/http"
|
||||||
url "net/url"
|
url "net/url"
|
||||||
time "time"
|
time "time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
// Condition uses a Comparison to assert a complex condition.
|
||||||
func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {
|
||||||
return Condition(a.t, comp, msgAndArgs...)
|
return Condition(a.t, comp, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
||||||
// specified substring or element.
|
// specified substring or element.
|
||||||
//
|
//
|
||||||
|
@ -31,7 +28,6 @@ func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ..
|
||||||
return Contains(a.t, s, contains, msgAndArgs...)
|
return Contains(a.t, s, contains, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
|
@ -42,31 +38,29 @@ func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return Empty(a.t, object, msgAndArgs...)
|
return Empty(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Equal asserts that two objects are equal.
|
// Equal asserts that two objects are equal.
|
||||||
//
|
//
|
||||||
// a.Equal(123, 123, "123 and 123 should be equal")
|
// a.Equal(123, 123, "123 and 123 should be equal")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
|
//
|
||||||
|
// Pointer variable equality is determined based on the equality of the
|
||||||
|
// referenced values (as opposed to the memory addresses).
|
||||||
func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return Equal(a.t, expected, actual, msgAndArgs...)
|
return Equal(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
||||||
// and that it is equal to the provided error.
|
// and that it is equal to the provided error.
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// if assert.Error(t, err, "An error was expected") {
|
// a.EqualError(err, expectedErrorString, "An error was expected")
|
||||||
// assert.Equal(t, err, expectedError)
|
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {
|
||||||
return EqualError(a.t, theError, errString, msgAndArgs...)
|
return EqualError(a.t, theError, errString, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
// EqualValues asserts that two objects are equal or convertable to the same types
|
||||||
// and equal.
|
// and equal.
|
||||||
//
|
//
|
||||||
|
@ -77,7 +71,6 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
|
||||||
return EqualValues(a.t, expected, actual, msgAndArgs...)
|
return EqualValues(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Error asserts that a function returned an error (i.e. not `nil`).
|
// Error asserts that a function returned an error (i.e. not `nil`).
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
|
@ -90,7 +83,6 @@ func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {
|
||||||
return Error(a.t, err, msgAndArgs...)
|
return Error(a.t, err, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Exactly asserts that two objects are equal is value and type.
|
// Exactly asserts that two objects are equal is value and type.
|
||||||
//
|
//
|
||||||
// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal")
|
// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal")
|
||||||
|
@ -100,19 +92,16 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg
|
||||||
return Exactly(a.t, expected, actual, msgAndArgs...)
|
return Exactly(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Fail reports a failure through
|
// Fail reports a failure through
|
||||||
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {
|
||||||
return Fail(a.t, failureMessage, msgAndArgs...)
|
return Fail(a.t, failureMessage, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// FailNow fails test
|
// FailNow fails test
|
||||||
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {
|
||||||
return FailNow(a.t, failureMessage, msgAndArgs...)
|
return FailNow(a.t, failureMessage, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// False asserts that the specified value is false.
|
// False asserts that the specified value is false.
|
||||||
//
|
//
|
||||||
// a.False(myBool, "myBool should be false")
|
// a.False(myBool, "myBool should be false")
|
||||||
|
@ -122,7 +111,6 @@ func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {
|
||||||
return False(a.t, value, msgAndArgs...)
|
return False(a.t, value, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
// HTTPBodyContains asserts that a specified handler returns a
|
||||||
// body that contains a string.
|
// body that contains a string.
|
||||||
//
|
//
|
||||||
|
@ -133,7 +121,6 @@ func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, u
|
||||||
return HTTPBodyContains(a.t, handler, method, url, values, str)
|
return HTTPBodyContains(a.t, handler, method, url, values, str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
// HTTPBodyNotContains asserts that a specified handler returns a
|
||||||
// body that does not contain a string.
|
// body that does not contain a string.
|
||||||
//
|
//
|
||||||
|
@ -144,7 +131,6 @@ func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string
|
||||||
return HTTPBodyNotContains(a.t, handler, method, url, values, str)
|
return HTTPBodyNotContains(a.t, handler, method, url, values, str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
// HTTPError asserts that a specified handler returns an error status code.
|
||||||
//
|
//
|
||||||
// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
||||||
|
@ -154,7 +140,6 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri
|
||||||
return HTTPError(a.t, handler, method, url, values)
|
return HTTPError(a.t, handler, method, url, values)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
||||||
//
|
//
|
||||||
// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
||||||
|
@ -164,7 +149,6 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s
|
||||||
return HTTPRedirect(a.t, handler, method, url, values)
|
return HTTPRedirect(a.t, handler, method, url, values)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
// HTTPSuccess asserts that a specified handler returns a success status code.
|
||||||
//
|
//
|
||||||
// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil)
|
// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil)
|
||||||
|
@ -174,7 +158,6 @@ func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url st
|
||||||
return HTTPSuccess(a.t, handler, method, url, values)
|
return HTTPSuccess(a.t, handler, method, url, values)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
// Implements asserts that an object is implemented by the specified interface.
|
||||||
//
|
//
|
||||||
// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject")
|
// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject")
|
||||||
|
@ -182,7 +165,6 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{},
|
||||||
return Implements(a.t, interfaceObject, object, msgAndArgs...)
|
return Implements(a.t, interfaceObject, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// InDelta asserts that the two numerals are within delta of each other.
|
// InDelta asserts that the two numerals are within delta of each other.
|
||||||
//
|
//
|
||||||
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
|
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
|
||||||
|
@ -192,13 +174,11 @@ func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta flo
|
||||||
return InDelta(a.t, expected, actual, delta, msgAndArgs...)
|
return InDelta(a.t, expected, actual, delta, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
||||||
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
||||||
return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
|
return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
|
@ -206,19 +186,16 @@ func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon
|
||||||
return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
|
return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares two slices.
|
func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
||||||
func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)
|
||||||
return InEpsilonSlice(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
// IsType asserts that the specified objects are of the same type.
|
||||||
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return IsType(a.t, expectedType, object, msgAndArgs...)
|
return IsType(a.t, expectedType, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// JSONEq asserts that two JSON strings are equivalent.
|
// JSONEq asserts that two JSON strings are equivalent.
|
||||||
//
|
//
|
||||||
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
||||||
|
@ -228,7 +205,6 @@ func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interf
|
||||||
return JSONEq(a.t, expected, actual, msgAndArgs...)
|
return JSONEq(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Len asserts that the specified object has specific length.
|
// Len asserts that the specified object has specific length.
|
||||||
// Len also fails if the object has a type that len() not accept.
|
// Len also fails if the object has a type that len() not accept.
|
||||||
//
|
//
|
||||||
|
@ -239,7 +215,6 @@ func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface
|
||||||
return Len(a.t, object, length, msgAndArgs...)
|
return Len(a.t, object, length, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Nil asserts that the specified object is nil.
|
// Nil asserts that the specified object is nil.
|
||||||
//
|
//
|
||||||
// a.Nil(err, "err should be nothing")
|
// a.Nil(err, "err should be nothing")
|
||||||
|
@ -249,7 +224,6 @@ func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return Nil(a.t, object, msgAndArgs...)
|
return Nil(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NoError asserts that a function returned no error (i.e. `nil`).
|
// NoError asserts that a function returned no error (i.e. `nil`).
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
|
@ -262,7 +236,6 @@ func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {
|
||||||
return NoError(a.t, err, msgAndArgs...)
|
return NoError(a.t, err, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
||||||
// specified substring or element.
|
// specified substring or element.
|
||||||
//
|
//
|
||||||
|
@ -275,7 +248,6 @@ func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs
|
||||||
return NotContains(a.t, s, contains, msgAndArgs...)
|
return NotContains(a.t, s, contains, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
|
@ -288,17 +260,18 @@ func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) boo
|
||||||
return NotEmpty(a.t, object, msgAndArgs...)
|
return NotEmpty(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NotEqual asserts that the specified values are NOT equal.
|
// NotEqual asserts that the specified values are NOT equal.
|
||||||
//
|
//
|
||||||
// a.NotEqual(obj1, obj2, "two objects shouldn't be equal")
|
// a.NotEqual(obj1, obj2, "two objects shouldn't be equal")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
|
//
|
||||||
|
// Pointer variable equality is determined based on the equality of the
|
||||||
|
// referenced values (as opposed to the memory addresses).
|
||||||
func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return NotEqual(a.t, expected, actual, msgAndArgs...)
|
return NotEqual(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NotNil asserts that the specified object is not nil.
|
// NotNil asserts that the specified object is not nil.
|
||||||
//
|
//
|
||||||
// a.NotNil(err, "err should be something")
|
// a.NotNil(err, "err should be something")
|
||||||
|
@ -308,7 +281,6 @@ func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool
|
||||||
return NotNil(a.t, object, msgAndArgs...)
|
return NotNil(a.t, object, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
||||||
//
|
//
|
||||||
// a.NotPanics(func(){
|
// a.NotPanics(func(){
|
||||||
|
@ -320,7 +292,6 @@ func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool
|
||||||
return NotPanics(a.t, f, msgAndArgs...)
|
return NotPanics(a.t, f, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NotRegexp asserts that a specified regexp does not match a string.
|
// NotRegexp asserts that a specified regexp does not match a string.
|
||||||
//
|
//
|
||||||
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
|
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
|
||||||
|
@ -331,13 +302,11 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in
|
||||||
return NotRegexp(a.t, rx, str, msgAndArgs...)
|
return NotRegexp(a.t, rx, str, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// NotZero asserts that i is not the zero value for its type and returns the truth.
|
// NotZero asserts that i is not the zero value for its type and returns the truth.
|
||||||
func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return NotZero(a.t, i, msgAndArgs...)
|
return NotZero(a.t, i, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
||||||
//
|
//
|
||||||
// a.Panics(func(){
|
// a.Panics(func(){
|
||||||
|
@ -349,7 +318,6 @@ func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
||||||
return Panics(a.t, f, msgAndArgs...)
|
return Panics(a.t, f, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Regexp asserts that a specified regexp matches a string.
|
// Regexp asserts that a specified regexp matches a string.
|
||||||
//
|
//
|
||||||
// a.Regexp(regexp.MustCompile("start"), "it's starting")
|
// a.Regexp(regexp.MustCompile("start"), "it's starting")
|
||||||
|
@ -360,7 +328,6 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter
|
||||||
return Regexp(a.t, rx, str, msgAndArgs...)
|
return Regexp(a.t, rx, str, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// True asserts that the specified value is true.
|
// True asserts that the specified value is true.
|
||||||
//
|
//
|
||||||
// a.True(myBool, "myBool should be true")
|
// a.True(myBool, "myBool should be true")
|
||||||
|
@ -370,7 +337,6 @@ func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {
|
||||||
return True(a.t, value, msgAndArgs...)
|
return True(a.t, value, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// WithinDuration asserts that the two times are within duration delta of each other.
|
// WithinDuration asserts that the two times are within duration delta of each other.
|
||||||
//
|
//
|
||||||
// a.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
|
// a.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
|
||||||
|
@ -380,7 +346,6 @@ func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta
|
||||||
return WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
|
return WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Zero asserts that i is the zero value for its type and returns the truth.
|
// Zero asserts that i is the zero value for its type and returns the truth.
|
||||||
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return Zero(a.t, i, msgAndArgs...)
|
return Zero(a.t, i, msgAndArgs...)
|
||||||
|
|
|
@ -65,7 +65,7 @@ func ObjectsAreEqualValues(expected, actual interface{}) bool {
|
||||||
|
|
||||||
/* CallerInfo is necessary because the assert functions use the testing object
|
/* CallerInfo is necessary because the assert functions use the testing object
|
||||||
internally, causing it to print the file:line of the assert method, rather than where
|
internally, causing it to print the file:line of the assert method, rather than where
|
||||||
the problem actually occured in calling code.*/
|
the problem actually occurred in calling code.*/
|
||||||
|
|
||||||
// CallerInfo returns an array of strings containing the file and line number
|
// CallerInfo returns an array of strings containing the file and line number
|
||||||
// of each stack frame leading from the current test to the assert call that
|
// of each stack frame leading from the current test to the assert call that
|
||||||
|
@ -82,7 +82,9 @@ func CallerInfo() []string {
|
||||||
for i := 0; ; i++ {
|
for i := 0; ; i++ {
|
||||||
pc, file, line, ok = runtime.Caller(i)
|
pc, file, line, ok = runtime.Caller(i)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
// The breaks below failed to terminate the loop, and we ran off the
|
||||||
|
// end of the call stack.
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a huge edge case, but it will panic if this is the case, see #180
|
// This is a huge edge case, but it will panic if this is the case, see #180
|
||||||
|
@ -90,6 +92,21 @@ func CallerInfo() []string {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
f := runtime.FuncForPC(pc)
|
||||||
|
if f == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
name = f.Name()
|
||||||
|
|
||||||
|
// testing.tRunner is the standard library function that calls
|
||||||
|
// tests. Subtests are called directly by tRunner, without going through
|
||||||
|
// the Test/Benchmark/Example function that contains the t.Run calls, so
|
||||||
|
// with subtests we should break when we hit tRunner, without adding it
|
||||||
|
// to the list of callers.
|
||||||
|
if name == "testing.tRunner" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
parts := strings.Split(file, "/")
|
parts := strings.Split(file, "/")
|
||||||
dir := parts[len(parts)-2]
|
dir := parts[len(parts)-2]
|
||||||
file = parts[len(parts)-1]
|
file = parts[len(parts)-1]
|
||||||
|
@ -97,11 +114,6 @@ func CallerInfo() []string {
|
||||||
callers = append(callers, fmt.Sprintf("%s:%d", file, line))
|
callers = append(callers, fmt.Sprintf("%s:%d", file, line))
|
||||||
}
|
}
|
||||||
|
|
||||||
f := runtime.FuncForPC(pc)
|
|
||||||
if f == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
name = f.Name()
|
|
||||||
// Drop the package
|
// Drop the package
|
||||||
segments := strings.Split(name, ".")
|
segments := strings.Split(name, ".")
|
||||||
name = segments[len(segments)-1]
|
name = segments[len(segments)-1]
|
||||||
|
@ -158,22 +170,18 @@ func messageFromMsgAndArgs(msgAndArgs ...interface{}) string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// Indents all lines of the message by appending a number of tabs to each line, in an output format compatible with Go's
|
// Aligns the provided message so that all lines after the first line start at the same location as the first line.
|
||||||
// test printing (see inner comment for specifics)
|
// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab).
|
||||||
func indentMessageLines(message string, tabs int) string {
|
// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the
|
||||||
|
// basis on which the alignment occurs).
|
||||||
|
func indentMessageLines(message string, longestLabelLen int) string {
|
||||||
outBuf := new(bytes.Buffer)
|
outBuf := new(bytes.Buffer)
|
||||||
|
|
||||||
for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ {
|
for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ {
|
||||||
|
// no need to align first line because it starts at the correct location (after the label)
|
||||||
if i != 0 {
|
if i != 0 {
|
||||||
outBuf.WriteRune('\n')
|
// append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab
|
||||||
}
|
outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen +1) + "\t")
|
||||||
for ii := 0; ii < tabs; ii++ {
|
|
||||||
outBuf.WriteRune('\t')
|
|
||||||
// Bizarrely, all lines except the first need one fewer tabs prepended, so deliberately advance the counter
|
|
||||||
// by 1 prematurely.
|
|
||||||
if ii == 0 && i > 0 {
|
|
||||||
ii++
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
outBuf.WriteString(scanner.Text())
|
outBuf.WriteString(scanner.Text())
|
||||||
}
|
}
|
||||||
|
@ -205,29 +213,49 @@ func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool
|
||||||
|
|
||||||
// Fail reports a failure through
|
// Fail reports a failure through
|
||||||
func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
|
func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {
|
||||||
|
content := []labeledContent{
|
||||||
message := messageFromMsgAndArgs(msgAndArgs...)
|
{"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")},
|
||||||
|
{"Error", failureMessage},
|
||||||
errorTrace := strings.Join(CallerInfo(), "\n\r\t\t\t")
|
|
||||||
if len(message) > 0 {
|
|
||||||
t.Errorf("\r%s\r\tError Trace:\t%s\n"+
|
|
||||||
"\r\tError:%s\n"+
|
|
||||||
"\r\tMessages:\t%s\n\r",
|
|
||||||
getWhitespaceString(),
|
|
||||||
errorTrace,
|
|
||||||
indentMessageLines(failureMessage, 2),
|
|
||||||
message)
|
|
||||||
} else {
|
|
||||||
t.Errorf("\r%s\r\tError Trace:\t%s\n"+
|
|
||||||
"\r\tError:%s\n\r",
|
|
||||||
getWhitespaceString(),
|
|
||||||
errorTrace,
|
|
||||||
indentMessageLines(failureMessage, 2))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message := messageFromMsgAndArgs(msgAndArgs...)
|
||||||
|
if len(message) > 0 {
|
||||||
|
content = append(content, labeledContent{"Messages", message})
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Errorf("\r" + getWhitespaceString() + labeledOutput(content...))
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type labeledContent struct {
|
||||||
|
label string
|
||||||
|
content string
|
||||||
|
}
|
||||||
|
|
||||||
|
// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner:
|
||||||
|
//
|
||||||
|
// \r\t{{label}}:{{align_spaces}}\t{{content}}\n
|
||||||
|
//
|
||||||
|
// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label.
|
||||||
|
// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this
|
||||||
|
// alignment is achieved, "\t{{content}}\n" is added for the output.
|
||||||
|
//
|
||||||
|
// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line.
|
||||||
|
func labeledOutput(content ...labeledContent) string {
|
||||||
|
longestLabel := 0
|
||||||
|
for _, v := range content {
|
||||||
|
if len(v.label) > longestLabel {
|
||||||
|
longestLabel = len(v.label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var output string
|
||||||
|
for _, v := range content {
|
||||||
|
output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n"
|
||||||
|
}
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
// Implements asserts that an object is implemented by the specified interface.
|
||||||
//
|
//
|
||||||
// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject")
|
// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject")
|
||||||
|
@ -258,18 +286,39 @@ func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs
|
||||||
// assert.Equal(t, 123, 123, "123 and 123 should be equal")
|
// assert.Equal(t, 123, 123, "123 and 123 should be equal")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
|
//
|
||||||
|
// Pointer variable equality is determined based on the equality of the
|
||||||
|
// referenced values (as opposed to the memory addresses).
|
||||||
func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
|
||||||
if !ObjectsAreEqual(expected, actual) {
|
if !ObjectsAreEqual(expected, actual) {
|
||||||
diff := diff(expected, actual)
|
diff := diff(expected, actual)
|
||||||
return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+
|
expected, actual = formatUnequalValues(expected, actual)
|
||||||
" != %#v (actual)%s", expected, actual, diff), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Not equal: \n"+
|
||||||
|
"expected: %s\n"+
|
||||||
|
"received: %s%s", expected, actual, diff), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// formatUnequalValues takes two values of arbitrary types and returns string
|
||||||
|
// representations appropriate to be presented to the user.
|
||||||
|
//
|
||||||
|
// If the values are not of like type, the returned strings will be prefixed
|
||||||
|
// with the type name, and the value will be enclosed in parenthesis similar
|
||||||
|
// to a type conversion in the Go grammar.
|
||||||
|
func formatUnequalValues(expected, actual interface{}) (e string, a string) {
|
||||||
|
if reflect.TypeOf(expected) != reflect.TypeOf(actual) {
|
||||||
|
return fmt.Sprintf("%T(%#v)", expected, expected),
|
||||||
|
fmt.Sprintf("%T(%#v)", actual, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%#v", expected),
|
||||||
|
fmt.Sprintf("%#v", actual)
|
||||||
|
}
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
// EqualValues asserts that two objects are equal or convertable to the same types
|
||||||
// and equal.
|
// and equal.
|
||||||
//
|
//
|
||||||
|
@ -279,8 +328,11 @@ func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{})
|
||||||
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
|
||||||
if !ObjectsAreEqualValues(expected, actual) {
|
if !ObjectsAreEqualValues(expected, actual) {
|
||||||
return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+
|
diff := diff(expected, actual)
|
||||||
" != %#v (actual)", expected, actual), msgAndArgs...)
|
expected, actual = formatUnequalValues(expected, actual)
|
||||||
|
return Fail(t, fmt.Sprintf("Not equal: \n"+
|
||||||
|
"expected: %s\n"+
|
||||||
|
"received: %s%s", expected, actual, diff), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
@ -507,6 +559,9 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) bool {
|
||||||
// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal")
|
// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal")
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
|
//
|
||||||
|
// Pointer variable equality is determined based on the equality of the
|
||||||
|
// referenced values (as opposed to the memory addresses).
|
||||||
func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
|
||||||
if ObjectsAreEqual(expected, actual) {
|
if ObjectsAreEqual(expected, actual) {
|
||||||
|
@ -833,7 +888,7 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Fail(t, fmt.Sprintf("Received unexpected error %q", err), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
@ -849,9 +904,8 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
|
|
||||||
message := messageFromMsgAndArgs(msgAndArgs...)
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return Fail(t, "An error is expected but got nil. %s", message)
|
return Fail(t, "An error is expected but got nil.", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
@ -861,20 +915,22 @@ func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
|
||||||
// and that it is equal to the provided error.
|
// and that it is equal to the provided error.
|
||||||
//
|
//
|
||||||
// actualObj, err := SomeFunction()
|
// actualObj, err := SomeFunction()
|
||||||
// if assert.Error(t, err, "An error was expected") {
|
// assert.EqualError(t, err, expectedErrorString, "An error was expected")
|
||||||
// assert.Equal(t, err, expectedError)
|
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
// Returns whether the assertion was successful (true) or not (false).
|
||||||
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
|
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
|
||||||
|
if !Error(t, theError, msgAndArgs...) {
|
||||||
message := messageFromMsgAndArgs(msgAndArgs...)
|
|
||||||
if !NotNil(t, theError, "An error is expected but got nil. %s", message) {
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
s := "An error with value \"%s\" is expected but got \"%s\". %s"
|
expected := errString
|
||||||
return Equal(t, errString, theError.Error(),
|
actual := theError.Error()
|
||||||
s, errString, theError.Error(), message)
|
// don't need to use deep equals here, we know they are both strings
|
||||||
|
if expected != actual {
|
||||||
|
return Fail(t, fmt.Sprintf("Error message not equal:\n"+
|
||||||
|
"expected: %q\n"+
|
||||||
|
"received: %q", expected, actual), msgAndArgs...)
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// matchRegexp return true if a specified regexp matches a string.
|
// matchRegexp return true if a specified regexp matches a string.
|
||||||
|
@ -989,9 +1045,8 @@ func diff(expected interface{}, actual interface{}) string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
spew.Config.SortKeys = true
|
e := spewConfig.Sdump(expected)
|
||||||
e := spew.Sdump(expected)
|
a := spewConfig.Sdump(actual)
|
||||||
a := spew.Sdump(actual)
|
|
||||||
|
|
||||||
diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
||||||
A: difflib.SplitLines(e),
|
A: difflib.SplitLines(e),
|
||||||
|
@ -1005,3 +1060,10 @@ func diff(expected interface{}, actual interface{}) string {
|
||||||
|
|
||||||
return "\n\nDiff:\n" + diff
|
return "\n\nDiff:\n" + diff
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var spewConfig = spew.ConfigState{
|
||||||
|
Indent: " ",
|
||||||
|
DisablePointerAddresses: true,
|
||||||
|
DisableCapacities: true,
|
||||||
|
SortKeys: true,
|
||||||
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url strin
|
||||||
|
|
||||||
contains := strings.Contains(body, fmt.Sprint(str))
|
contains := strings.Contains(body, fmt.Sprint(str))
|
||||||
if contains {
|
if contains {
|
||||||
Fail(t, "Expected response body for %s to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)
|
Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body))
|
||||||
}
|
}
|
||||||
|
|
||||||
return !contains
|
return !contains
|
||||||
|
|
|
@ -9,10 +9,10 @@
|
||||||
"revisionTime": "2016-02-17T10:30:50Z"
|
"revisionTime": "2016-02-17T10:30:50Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "Lf3uUXTkKK5DJ37BxQvxO1Fq+K8=",
|
"checksumSHA1": "dvabztWVQX8f6oMLRyv4dLH+TGY=",
|
||||||
"path": "github.com/davecgh/go-spew/spew",
|
"path": "github.com/davecgh/go-spew/spew",
|
||||||
"revision": "6d212800a42e8ab5c146b8ace3490ee17e5225f9",
|
"revision": "346938d642f2ec3594ed81d874461961cd0faa76",
|
||||||
"revisionTime": "2016-09-07T16:21:46Z"
|
"revisionTime": "2016-10-29T20:57:26Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "JSHl8b3nI8EWvzm+uyrIqj2Hiu4=",
|
"checksumSHA1": "JSHl8b3nI8EWvzm+uyrIqj2Hiu4=",
|
||||||
|
@ -27,10 +27,10 @@
|
||||||
"revisionTime": "2016-01-10T10:55:54Z"
|
"revisionTime": "2016-01-10T10:55:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "iydUphwYqZRq3WhstEdGsbvBAKs=",
|
"checksumSHA1": "JXUVA1jky8ZX8w09p2t5KLs97Nc=",
|
||||||
"path": "github.com/stretchr/testify/assert",
|
"path": "github.com/stretchr/testify/assert",
|
||||||
"revision": "d77da356e56a7428ad25149ca77381849a6a5232",
|
"revision": "4d4bfba8f1d1027c4fdbe371823030df51419987",
|
||||||
"revisionTime": "2016-06-15T09:26:46Z"
|
"revisionTime": "2017-01-30T11:31:45Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "BpFC/4q4mc/SfCvsXGzCF8s9fSE=",
|
"checksumSHA1": "BpFC/4q4mc/SfCvsXGzCF8s9fSE=",
|
||||||
|
|
Loading…
Reference in New Issue