mirror of https://github.com/docker/cli.git
Replace testify vendor with updated gotestyourself
Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
parent
93615dd967
commit
5ef8835f23
|
@ -27,7 +27,7 @@ github.com/google/gofuzz 44d81051d367757e1c7c6a5a86423ece9afcf63c
|
||||||
github.com/googleapis/gnostic e4f56557df6250e1945ee6854f181ce4e1c2c646
|
github.com/googleapis/gnostic e4f56557df6250e1945ee6854f181ce4e1c2c646
|
||||||
github.com/gorilla/context v1.1
|
github.com/gorilla/context v1.1
|
||||||
github.com/gorilla/mux v1.1
|
github.com/gorilla/mux v1.1
|
||||||
github.com/gotestyourself/gotestyourself v1.3.0
|
github.com/gotestyourself/gotestyourself cf3a5ab914a2efa8bc838d09f5918c1d44d02909
|
||||||
# FIXME(vdemeester) try to deduplicate this with gojsonpointer
|
# FIXME(vdemeester) try to deduplicate this with gojsonpointer
|
||||||
github.com/go-openapi/jsonpointer 46af16f9f7b149af66e5d1bd010e3574dc06de98
|
github.com/go-openapi/jsonpointer 46af16f9f7b149af66e5d1bd010e3574dc06de98
|
||||||
# FIXME(vdemeester) try to deduplicate this with gojsonreference
|
# FIXME(vdemeester) try to deduplicate this with gojsonreference
|
||||||
|
|
|
@ -32,9 +32,9 @@ The example below shows assert used with some common types.
|
||||||
|
|
||||||
// errors
|
// errors
|
||||||
assert.NilError(t, closer.Close())
|
assert.NilError(t, closer.Close())
|
||||||
assert.Assert(t, is.Error(err, "the exact error message"))
|
assert.Error(t, err, "the exact error message")
|
||||||
assert.Assert(t, is.ErrorContains(err, "includes this"))
|
assert.ErrorContains(t, err, "includes this")
|
||||||
assert.Assert(t, is.ErrorType(err, os.IsNotExist))
|
assert.ErrorType(t, err, os.IsNotExist)
|
||||||
|
|
||||||
// complex types
|
// complex types
|
||||||
assert.DeepEqual(t, result, myStruct{Name: "title"})
|
assert.DeepEqual(t, result, myStruct{Name: "title"})
|
||||||
|
@ -87,7 +87,7 @@ const failureMessage = "assertion failed: "
|
||||||
func assert(
|
func assert(
|
||||||
t TestingT,
|
t TestingT,
|
||||||
failer func(),
|
failer func(),
|
||||||
argsFilter astExprListFilter,
|
argSelector argSelector,
|
||||||
comparison BoolOrComparison,
|
comparison BoolOrComparison,
|
||||||
msgAndArgs ...interface{},
|
msgAndArgs ...interface{},
|
||||||
) bool {
|
) bool {
|
||||||
|
@ -114,10 +114,10 @@ func assert(
|
||||||
t.Log(format.WithCustomMessage(failureMessage+msg+check.Error(), msgAndArgs...))
|
t.Log(format.WithCustomMessage(failureMessage+msg+check.Error(), msgAndArgs...))
|
||||||
|
|
||||||
case cmp.Comparison:
|
case cmp.Comparison:
|
||||||
success = runComparison(t, argsFilter, check, msgAndArgs...)
|
success = runComparison(t, argSelector, check, msgAndArgs...)
|
||||||
|
|
||||||
case func() cmp.Result:
|
case func() cmp.Result:
|
||||||
success = runComparison(t, argsFilter, check, msgAndArgs...)
|
success = runComparison(t, argSelector, check, msgAndArgs...)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
t.Log(fmt.Sprintf("invalid Comparison: %v (%T)", check, check))
|
t.Log(fmt.Sprintf("invalid Comparison: %v (%T)", check, check))
|
||||||
|
@ -146,6 +146,9 @@ func runCompareFunc(
|
||||||
}
|
}
|
||||||
|
|
||||||
func logFailureFromBool(t TestingT, msgAndArgs ...interface{}) {
|
func logFailureFromBool(t TestingT, msgAndArgs ...interface{}) {
|
||||||
|
if ht, ok := t.(helperT); ok {
|
||||||
|
ht.Helper()
|
||||||
|
}
|
||||||
const stackIndex = 3 // Assert()/Check(), assert(), formatFailureFromBool()
|
const stackIndex = 3 // Assert()/Check(), assert(), formatFailureFromBool()
|
||||||
const comparisonArgPos = 1
|
const comparisonArgPos = 1
|
||||||
args, err := source.CallExprArgs(stackIndex)
|
args, err := source.CallExprArgs(stackIndex)
|
||||||
|
@ -206,7 +209,7 @@ func Assert(t TestingT, comparison BoolOrComparison, msgAndArgs ...interface{})
|
||||||
if ht, ok := t.(helperT); ok {
|
if ht, ok := t.(helperT); ok {
|
||||||
ht.Helper()
|
ht.Helper()
|
||||||
}
|
}
|
||||||
assert(t, t.FailNow, filterExprArgsFromComparison, comparison, msgAndArgs...)
|
assert(t, t.FailNow, argsFromComparisonCall, comparison, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check performs a comparison. If the comparison fails the test is marked as
|
// Check performs a comparison. If the comparison fails the test is marked as
|
||||||
|
@ -218,7 +221,7 @@ func Check(t TestingT, comparison BoolOrComparison, msgAndArgs ...interface{}) b
|
||||||
if ht, ok := t.(helperT); ok {
|
if ht, ok := t.(helperT); ok {
|
||||||
ht.Helper()
|
ht.Helper()
|
||||||
}
|
}
|
||||||
return assert(t, t.Fail, filterExprArgsFromComparison, comparison, msgAndArgs...)
|
return assert(t, t.Fail, argsFromComparisonCall, comparison, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NilError fails the test immediately if err is not nil.
|
// NilError fails the test immediately if err is not nil.
|
||||||
|
@ -227,7 +230,7 @@ func NilError(t TestingT, err error, msgAndArgs ...interface{}) {
|
||||||
if ht, ok := t.(helperT); ok {
|
if ht, ok := t.(helperT); ok {
|
||||||
ht.Helper()
|
ht.Helper()
|
||||||
}
|
}
|
||||||
assert(t, t.FailNow, filterExprExcludeFirst, err, msgAndArgs...)
|
assert(t, t.FailNow, argsAfterT, err, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equal uses the == operator to assert two values are equal and fails the test
|
// Equal uses the == operator to assert two values are equal and fails the test
|
||||||
|
@ -236,7 +239,7 @@ func Equal(t TestingT, x, y interface{}, msgAndArgs ...interface{}) {
|
||||||
if ht, ok := t.(helperT); ok {
|
if ht, ok := t.(helperT); ok {
|
||||||
ht.Helper()
|
ht.Helper()
|
||||||
}
|
}
|
||||||
assert(t, t.FailNow, filterExprExcludeFirst, cmp.Equal(x, y), msgAndArgs...)
|
assert(t, t.FailNow, argsAfterT, cmp.Equal(x, y), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepEqual uses https://github.com/google/go-cmp/cmp to assert two values
|
// DeepEqual uses https://github.com/google/go-cmp/cmp to assert two values
|
||||||
|
@ -246,5 +249,41 @@ func DeepEqual(t TestingT, x, y interface{}, opts ...gocmp.Option) {
|
||||||
if ht, ok := t.(helperT); ok {
|
if ht, ok := t.(helperT); ok {
|
||||||
ht.Helper()
|
ht.Helper()
|
||||||
}
|
}
|
||||||
assert(t, t.FailNow, filterExprExcludeFirst, cmp.DeepEqual(x, y, opts...))
|
assert(t, t.FailNow, argsAfterT, cmp.DeepEqual(x, y, opts...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error fails the test if err is nil, or the error message is not the expected
|
||||||
|
// message.
|
||||||
|
// Equivalent to Assert(t, cmp.Error(err, message)).
|
||||||
|
func Error(t TestingT, err error, message string, msgAndArgs ...interface{}) {
|
||||||
|
if ht, ok := t.(helperT); ok {
|
||||||
|
ht.Helper()
|
||||||
|
}
|
||||||
|
assert(t, t.FailNow, argsAfterT, cmp.Error(err, message), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorContains fails the test if err is nil, or the error message does not
|
||||||
|
// contain the expected substring.
|
||||||
|
// Equivalent to Assert(t, cmp.ErrorContains(err, substring)).
|
||||||
|
func ErrorContains(t TestingT, err error, substring string, msgAndArgs ...interface{}) {
|
||||||
|
if ht, ok := t.(helperT); ok {
|
||||||
|
ht.Helper()
|
||||||
|
}
|
||||||
|
assert(t, t.FailNow, argsAfterT, cmp.ErrorContains(err, substring), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorType fails the test if err is nil, or err is not the expected type.
|
||||||
|
//
|
||||||
|
// Expected can be one of:
|
||||||
|
// a func(error) bool which returns true if the error is the expected type,
|
||||||
|
// an instance of a struct of the expected type,
|
||||||
|
// a pointer to an interface the error is expected to implement,
|
||||||
|
// a reflect.Type of the expected struct or interface.
|
||||||
|
//
|
||||||
|
// Equivalent to Assert(t, cmp.ErrorType(err, expected)).
|
||||||
|
func ErrorType(t TestingT, err error, expected interface{}, msgAndArgs ...interface{}) {
|
||||||
|
if ht, ok := t.(helperT); ok {
|
||||||
|
ht.Helper()
|
||||||
|
}
|
||||||
|
assert(t, t.FailNow, argsAfterT, cmp.ErrorType(err, expected), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
|
|
||||||
func runComparison(
|
func runComparison(
|
||||||
t TestingT,
|
t TestingT,
|
||||||
exprFilter astExprListFilter,
|
argSelector argSelector,
|
||||||
f cmp.Comparison,
|
f cmp.Comparison,
|
||||||
msgAndArgs ...interface{},
|
msgAndArgs ...interface{},
|
||||||
) bool {
|
) bool {
|
||||||
|
@ -31,7 +31,7 @@ func runComparison(
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log(err.Error())
|
t.Log(err.Error())
|
||||||
}
|
}
|
||||||
message = typed.FailureMessage(filterPrintableExpr(exprFilter(args)))
|
message = typed.FailureMessage(filterPrintableExpr(argSelector(args)))
|
||||||
case resultBasic:
|
case resultBasic:
|
||||||
message = typed.FailureMessage()
|
message = typed.FailureMessage()
|
||||||
default:
|
default:
|
||||||
|
@ -50,9 +50,7 @@ type resultBasic interface {
|
||||||
FailureMessage() string
|
FailureMessage() string
|
||||||
}
|
}
|
||||||
|
|
||||||
type astExprListFilter func([]ast.Expr) []ast.Expr
|
// filterPrintableExpr filters the ast.Expr slice to only include Expr that are
|
||||||
|
|
||||||
// filterPrintableExpr filters the ast.Expr slice to only include nodes that are
|
|
||||||
// easy to read when printed and contain relevant information to an assertion.
|
// easy to read when printed and contain relevant information to an assertion.
|
||||||
//
|
//
|
||||||
// Ident and SelectorExpr are included because they print nicely and the variable
|
// Ident and SelectorExpr are included because they print nicely and the variable
|
||||||
|
@ -63,24 +61,42 @@ type astExprListFilter func([]ast.Expr) []ast.Expr
|
||||||
func filterPrintableExpr(args []ast.Expr) []ast.Expr {
|
func filterPrintableExpr(args []ast.Expr) []ast.Expr {
|
||||||
result := make([]ast.Expr, len(args))
|
result := make([]ast.Expr, len(args))
|
||||||
for i, arg := range args {
|
for i, arg := range args {
|
||||||
switch arg.(type) {
|
if isShortPrintableExpr(arg) {
|
||||||
case *ast.Ident, *ast.SelectorExpr, *ast.IndexExpr, *ast.SliceExpr:
|
|
||||||
result[i] = arg
|
result[i] = arg
|
||||||
default:
|
continue
|
||||||
result[i] = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if starExpr, ok := arg.(*ast.StarExpr); ok {
|
||||||
|
result[i] = starExpr.X
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
result[i] = nil
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func filterExprExcludeFirst(args []ast.Expr) []ast.Expr {
|
func isShortPrintableExpr(expr ast.Expr) bool {
|
||||||
|
switch expr.(type) {
|
||||||
|
case *ast.Ident, *ast.SelectorExpr, *ast.IndexExpr, *ast.SliceExpr:
|
||||||
|
return true
|
||||||
|
case *ast.BinaryExpr, *ast.UnaryExpr:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
// CallExpr, ParenExpr, TypeAssertExpr, KeyValueExpr, StarExpr
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type argSelector func([]ast.Expr) []ast.Expr
|
||||||
|
|
||||||
|
func argsAfterT(args []ast.Expr) []ast.Expr {
|
||||||
if len(args) < 1 {
|
if len(args) < 1 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return args[1:]
|
return args[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
func filterExprArgsFromComparison(args []ast.Expr) []ast.Expr {
|
func argsFromComparisonCall(args []ast.Expr) []ast.Expr {
|
||||||
if len(args) < 1 {
|
if len(args) < 1 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ func PatchAll(t assert.TestingT, env map[string]string) func() {
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
|
|
||||||
for key, value := range env {
|
for key, value := range env {
|
||||||
assert.NilError(t, os.Setenv(key, value))
|
assert.NilError(t, os.Setenv(key, value), "setenv %s=%s", key, value)
|
||||||
}
|
}
|
||||||
return func() {
|
return func() {
|
||||||
if ht, ok := t.(helperT); ok {
|
if ht, ok := t.(helperT); ok {
|
||||||
|
@ -53,7 +53,7 @@ func PatchAll(t assert.TestingT, env map[string]string) func() {
|
||||||
}
|
}
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
for key, oldVal := range ToMap(oldEnv) {
|
for key, oldVal := range ToMap(oldEnv) {
|
||||||
assert.NilError(t, os.Setenv(key, oldVal))
|
assert.NilError(t, os.Setenv(key, oldVal), "setenv %s=%s", key, oldVal)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,17 +63,23 @@ func PatchAll(t assert.TestingT, env map[string]string) func() {
|
||||||
func ToMap(env []string) map[string]string {
|
func ToMap(env []string) map[string]string {
|
||||||
result := map[string]string{}
|
result := map[string]string{}
|
||||||
for _, raw := range env {
|
for _, raw := range env {
|
||||||
parts := strings.SplitN(raw, "=", 2)
|
key, value := getParts(raw)
|
||||||
switch len(parts) {
|
result[key] = value
|
||||||
case 1:
|
|
||||||
result[raw] = ""
|
|
||||||
case 2:
|
|
||||||
result[parts[0]] = parts[1]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getParts(raw string) (string, string) {
|
||||||
|
// Environment variables on windows can begin with =
|
||||||
|
// http://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx
|
||||||
|
parts := strings.SplitN(raw[1:], "=", 2)
|
||||||
|
key := raw[:1] + parts[0]
|
||||||
|
if len(parts) == 1 {
|
||||||
|
return key, ""
|
||||||
|
}
|
||||||
|
return key, parts[1]
|
||||||
|
}
|
||||||
|
|
||||||
// ChangeWorkingDir to the directory, and return a function which restores the
|
// ChangeWorkingDir to the directory, and return a function which restores the
|
||||||
// previous working directory.
|
// previous working directory.
|
||||||
func ChangeWorkingDir(t assert.TestingT, dir string) func() {
|
func ChangeWorkingDir(t assert.TestingT, dir string) func() {
|
||||||
|
|
|
@ -40,13 +40,23 @@ func Path(filename string) string {
|
||||||
return filepath.Join("testdata", filename)
|
return filepath.Join("testdata", filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
func update(filename string, actual []byte) error {
|
func update(filename string, actual []byte, normalize normalize) error {
|
||||||
if *flagUpdate {
|
if *flagUpdate {
|
||||||
return ioutil.WriteFile(Path(filename), actual, 0644)
|
return ioutil.WriteFile(Path(filename), normalize(actual), 0644)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type normalize func([]byte) []byte
|
||||||
|
|
||||||
|
func removeCarriageReturn(in []byte) []byte {
|
||||||
|
return bytes.Replace(in, []byte("\r\n"), []byte("\n"), -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func exactBytes(in []byte) []byte {
|
||||||
|
return in
|
||||||
|
}
|
||||||
|
|
||||||
// Assert compares the actual content to the expected content in the golden file.
|
// Assert compares the actual content to the expected content in the golden file.
|
||||||
// If the `-test.update-golden` flag is set then the actual content is written
|
// If the `-test.update-golden` flag is set then the actual content is written
|
||||||
// to the golden file.
|
// to the golden file.
|
||||||
|
@ -66,15 +76,23 @@ func Assert(t assert.TestingT, actual string, filename string, msgAndArgs ...int
|
||||||
|
|
||||||
// String compares actual to the contents of filename and returns success
|
// String compares actual to the contents of filename and returns success
|
||||||
// if the strings are equal.
|
// if the strings are equal.
|
||||||
|
// If the `-test.update-golden` flag is set then the actual content is written
|
||||||
|
// to the golden file.
|
||||||
|
//
|
||||||
|
// Any \r\n substrings in actual are converted to a single \n character
|
||||||
|
// before comparing it to the expected string. When updating the golden file the
|
||||||
|
// normalized version will be written to the file. This allows Windows to use
|
||||||
|
// the same golden files as other operating systems.
|
||||||
func String(actual string, filename string) cmp.Comparison {
|
func String(actual string, filename string) cmp.Comparison {
|
||||||
return func() cmp.Result {
|
return func() cmp.Result {
|
||||||
result, expected := compare([]byte(actual), filename)
|
actualBytes := removeCarriageReturn([]byte(actual))
|
||||||
|
result, expected := compare(actualBytes, filename, removeCarriageReturn)
|
||||||
if result != nil {
|
if result != nil {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
diff, err := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
diff, err := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
||||||
A: difflib.SplitLines(string(expected)),
|
A: difflib.SplitLines(string(expected)),
|
||||||
B: difflib.SplitLines(actual),
|
B: difflib.SplitLines(string(actualBytes)),
|
||||||
FromFile: "expected",
|
FromFile: "expected",
|
||||||
ToFile: "actual",
|
ToFile: "actual",
|
||||||
Context: 3,
|
Context: 3,
|
||||||
|
@ -110,9 +128,11 @@ func AssertBytes(
|
||||||
|
|
||||||
// Bytes compares actual to the contents of filename and returns success
|
// Bytes compares actual to the contents of filename and returns success
|
||||||
// if the bytes are equal.
|
// if the bytes are equal.
|
||||||
|
// If the `-test.update-golden` flag is set then the actual content is written
|
||||||
|
// to the golden file.
|
||||||
func Bytes(actual []byte, filename string) cmp.Comparison {
|
func Bytes(actual []byte, filename string) cmp.Comparison {
|
||||||
return func() cmp.Result {
|
return func() cmp.Result {
|
||||||
result, expected := compare(actual, filename)
|
result, expected := compare(actual, filename, exactBytes)
|
||||||
if result != nil {
|
if result != nil {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
@ -121,8 +141,8 @@ func Bytes(actual []byte, filename string) cmp.Comparison {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func compare(actual []byte, filename string) (cmp.Result, []byte) {
|
func compare(actual []byte, filename string, normalize normalize) (cmp.Result, []byte) {
|
||||||
if err := update(filename, actual); err != nil {
|
if err := update(filename, actual, normalize); err != nil {
|
||||||
return cmp.ResultFromError(err), nil
|
return cmp.ResultFromError(err), nil
|
||||||
}
|
}
|
||||||
expected, err := ioutil.ReadFile(Path(filename))
|
expected, err := ioutil.ReadFile(Path(filename))
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell
|
|
||||||
|
|
||||||
Please consider promoting this project if you find it useful.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without restriction,
|
|
||||||
including without limitation the rights to use, copy, modify, merge,
|
|
||||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included
|
|
||||||
in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
|
|
||||||
OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
|
||||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,332 +0,0 @@
|
||||||
Testify - Thou Shalt Write Tests
|
|
||||||
================================
|
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/stretchr/testify.svg)](https://travis-ci.org/stretchr/testify) [![Go Report Card](https://goreportcard.com/badge/github.com/stretchr/testify)](https://goreportcard.com/report/github.com/stretchr/testify) [![GoDoc](https://godoc.org/github.com/stretchr/testify?status.svg)](https://godoc.org/github.com/stretchr/testify)
|
|
||||||
|
|
||||||
Go code (golang) set of packages that provide many tools for testifying that your code will behave as you intend.
|
|
||||||
|
|
||||||
Features include:
|
|
||||||
|
|
||||||
* [Easy assertions](#assert-package)
|
|
||||||
* [Mocking](#mock-package)
|
|
||||||
* [HTTP response trapping](#http-package)
|
|
||||||
* [Testing suite interfaces and functions](#suite-package)
|
|
||||||
|
|
||||||
Get started:
|
|
||||||
|
|
||||||
* Install testify with [one line of code](#installation), or [update it with another](#staying-up-to-date)
|
|
||||||
* For an introduction to writing test code in Go, see http://golang.org/doc/code.html#Testing
|
|
||||||
* Check out the API Documentation http://godoc.org/github.com/stretchr/testify
|
|
||||||
* To make your testing life easier, check out our other project, [gorc](http://github.com/stretchr/gorc)
|
|
||||||
* A little about [Test-Driven Development (TDD)](http://en.wikipedia.org/wiki/Test-driven_development)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[`assert`](http://godoc.org/github.com/stretchr/testify/assert "API documentation") package
|
|
||||||
-------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
The `assert` package provides some helpful methods that allow you to write better test code in Go.
|
|
||||||
|
|
||||||
* Prints friendly, easy to read failure descriptions
|
|
||||||
* Allows for very readable code
|
|
||||||
* Optionally annotate each assertion with a message
|
|
||||||
|
|
||||||
See it in action:
|
|
||||||
|
|
||||||
```go
|
|
||||||
package yours
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSomething(t *testing.T) {
|
|
||||||
|
|
||||||
// assert equality
|
|
||||||
assert.Equal(t, 123, 123, "they should be equal")
|
|
||||||
|
|
||||||
// assert inequality
|
|
||||||
assert.NotEqual(t, 123, 456, "they should not be equal")
|
|
||||||
|
|
||||||
// assert for nil (good for errors)
|
|
||||||
assert.Nil(t, object)
|
|
||||||
|
|
||||||
// assert for not nil (good when you expect something)
|
|
||||||
if assert.NotNil(t, object) {
|
|
||||||
|
|
||||||
// now we know that object isn't nil, we are safe to make
|
|
||||||
// further assertions without causing any errors
|
|
||||||
assert.Equal(t, "Something", object.Value)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
* Every assert func takes the `testing.T` object as the first argument. This is how it writes the errors out through the normal `go test` capabilities.
|
|
||||||
* Every assert func returns a bool indicating whether the assertion was successful or not, this is useful for if you want to go on making further assertions under certain conditions.
|
|
||||||
|
|
||||||
if you assert many times, use the below:
|
|
||||||
|
|
||||||
```go
|
|
||||||
package yours
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSomething(t *testing.T) {
|
|
||||||
assert := assert.New(t)
|
|
||||||
|
|
||||||
// assert equality
|
|
||||||
assert.Equal(123, 123, "they should be equal")
|
|
||||||
|
|
||||||
// assert inequality
|
|
||||||
assert.NotEqual(123, 456, "they should not be equal")
|
|
||||||
|
|
||||||
// assert for nil (good for errors)
|
|
||||||
assert.Nil(object)
|
|
||||||
|
|
||||||
// assert for not nil (good when you expect something)
|
|
||||||
if assert.NotNil(object) {
|
|
||||||
|
|
||||||
// now we know that object isn't nil, we are safe to make
|
|
||||||
// further assertions without causing any errors
|
|
||||||
assert.Equal("Something", object.Value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
[`require`](http://godoc.org/github.com/stretchr/testify/require "API documentation") package
|
|
||||||
---------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
The `require` package provides same global functions as the `assert` package, but instead of returning a boolean result they terminate current test.
|
|
||||||
|
|
||||||
See [t.FailNow](http://golang.org/pkg/testing/#T.FailNow) for details.
|
|
||||||
|
|
||||||
|
|
||||||
[`http`](http://godoc.org/github.com/stretchr/testify/http "API documentation") package
|
|
||||||
---------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
The `http` package contains test objects useful for testing code that relies on the `net/http` package. Check out the [(deprecated) API documentation for the `http` package](http://godoc.org/github.com/stretchr/testify/http).
|
|
||||||
|
|
||||||
We recommend you use [httptest](http://golang.org/pkg/net/http/httptest) instead.
|
|
||||||
|
|
||||||
[`mock`](http://godoc.org/github.com/stretchr/testify/mock "API documentation") package
|
|
||||||
----------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
The `mock` package provides a mechanism for easily writing mock objects that can be used in place of real objects when writing test code.
|
|
||||||
|
|
||||||
An example test function that tests a piece of code that relies on an external object `testObj`, can setup expectations (testify) and assert that they indeed happened:
|
|
||||||
|
|
||||||
```go
|
|
||||||
package yours
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"github.com/stretchr/testify/mock"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
Test objects
|
|
||||||
*/
|
|
||||||
|
|
||||||
// MyMockedObject is a mocked object that implements an interface
|
|
||||||
// that describes an object that the code I am testing relies on.
|
|
||||||
type MyMockedObject struct{
|
|
||||||
mock.Mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// DoSomething is a method on MyMockedObject that implements some interface
|
|
||||||
// and just records the activity, and returns what the Mock object tells it to.
|
|
||||||
//
|
|
||||||
// In the real object, this method would do something useful, but since this
|
|
||||||
// is a mocked object - we're just going to stub it out.
|
|
||||||
//
|
|
||||||
// NOTE: This method is not being tested here, code that uses this object is.
|
|
||||||
func (m *MyMockedObject) DoSomething(number int) (bool, error) {
|
|
||||||
|
|
||||||
args := m.Called(number)
|
|
||||||
return args.Bool(0), args.Error(1)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Actual test functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TestSomething is an example of how to use our test object to
|
|
||||||
// make assertions about some target code we are testing.
|
|
||||||
func TestSomething(t *testing.T) {
|
|
||||||
|
|
||||||
// create an instance of our test object
|
|
||||||
testObj := new(MyMockedObject)
|
|
||||||
|
|
||||||
// setup expectations
|
|
||||||
testObj.On("DoSomething", 123).Return(true, nil)
|
|
||||||
|
|
||||||
// call the code we are testing
|
|
||||||
targetFuncThatDoesSomethingWithObj(testObj)
|
|
||||||
|
|
||||||
// assert that the expectations were met
|
|
||||||
testObj.AssertExpectations(t)
|
|
||||||
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
For more information on how to write mock code, check out the [API documentation for the `mock` package](http://godoc.org/github.com/stretchr/testify/mock).
|
|
||||||
|
|
||||||
You can use the [mockery tool](http://github.com/vektra/mockery) to autogenerate the mock code against an interface as well, making using mocks much quicker.
|
|
||||||
|
|
||||||
[`suite`](http://godoc.org/github.com/stretchr/testify/suite "API documentation") package
|
|
||||||
-----------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
The `suite` package provides functionality that you might be used to from more common object oriented languages. With it, you can build a testing suite as a struct, build setup/teardown methods and testing methods on your struct, and run them with 'go test' as per normal.
|
|
||||||
|
|
||||||
An example suite is shown below:
|
|
||||||
|
|
||||||
```go
|
|
||||||
// Basic imports
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
"github.com/stretchr/testify/suite"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Define the suite, and absorb the built-in basic suite
|
|
||||||
// functionality from testify - including a T() method which
|
|
||||||
// returns the current testing context
|
|
||||||
type ExampleTestSuite struct {
|
|
||||||
suite.Suite
|
|
||||||
VariableThatShouldStartAtFive int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure that VariableThatShouldStartAtFive is set to five
|
|
||||||
// before each test
|
|
||||||
func (suite *ExampleTestSuite) SetupTest() {
|
|
||||||
suite.VariableThatShouldStartAtFive = 5
|
|
||||||
}
|
|
||||||
|
|
||||||
// All methods that begin with "Test" are run as tests within a
|
|
||||||
// suite.
|
|
||||||
func (suite *ExampleTestSuite) TestExample() {
|
|
||||||
assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive)
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order for 'go test' to run this suite, we need to create
|
|
||||||
// a normal test function and pass our suite to suite.Run
|
|
||||||
func TestExampleTestSuite(t *testing.T) {
|
|
||||||
suite.Run(t, new(ExampleTestSuite))
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
For a more complete example, using all of the functionality provided by the suite package, look at our [example testing suite](https://github.com/stretchr/testify/blob/master/suite/suite_test.go)
|
|
||||||
|
|
||||||
For more information on writing suites, check out the [API documentation for the `suite` package](http://godoc.org/github.com/stretchr/testify/suite).
|
|
||||||
|
|
||||||
`Suite` object has assertion methods:
|
|
||||||
|
|
||||||
```go
|
|
||||||
// Basic imports
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"github.com/stretchr/testify/suite"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Define the suite, and absorb the built-in basic suite
|
|
||||||
// functionality from testify - including assertion methods.
|
|
||||||
type ExampleTestSuite struct {
|
|
||||||
suite.Suite
|
|
||||||
VariableThatShouldStartAtFive int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure that VariableThatShouldStartAtFive is set to five
|
|
||||||
// before each test
|
|
||||||
func (suite *ExampleTestSuite) SetupTest() {
|
|
||||||
suite.VariableThatShouldStartAtFive = 5
|
|
||||||
}
|
|
||||||
|
|
||||||
// All methods that begin with "Test" are run as tests within a
|
|
||||||
// suite.
|
|
||||||
func (suite *ExampleTestSuite) TestExample() {
|
|
||||||
suite.Equal(suite.VariableThatShouldStartAtFive, 5)
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order for 'go test' to run this suite, we need to create
|
|
||||||
// a normal test function and pass our suite to suite.Run
|
|
||||||
func TestExampleTestSuite(t *testing.T) {
|
|
||||||
suite.Run(t, new(ExampleTestSuite))
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
Installation
|
|
||||||
============
|
|
||||||
|
|
||||||
To install Testify, use `go get`:
|
|
||||||
|
|
||||||
* Latest version: go get github.com/stretchr/testify
|
|
||||||
* Specific version: go get gopkg.in/stretchr/testify.v1
|
|
||||||
|
|
||||||
This will then make the following packages available to you:
|
|
||||||
|
|
||||||
github.com/stretchr/testify/assert
|
|
||||||
github.com/stretchr/testify/mock
|
|
||||||
github.com/stretchr/testify/http
|
|
||||||
|
|
||||||
Import the `testify/assert` package into your code using this template:
|
|
||||||
|
|
||||||
```go
|
|
||||||
package yours
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSomething(t *testing.T) {
|
|
||||||
|
|
||||||
assert.True(t, true, "True is true!")
|
|
||||||
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
Staying up to date
|
|
||||||
==================
|
|
||||||
|
|
||||||
To update Testify to the latest version, use `go get -u github.com/stretchr/testify`.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
Version History
|
|
||||||
===============
|
|
||||||
|
|
||||||
* 1.0 - New package versioning strategy adopted.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
============
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
Licence
|
|
||||||
=======
|
|
||||||
Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell
|
|
||||||
|
|
||||||
Please consider promoting this project if you find it useful.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,352 +0,0 @@
|
||||||
/*
|
|
||||||
* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen
|
|
||||||
* THIS FILE MUST NOT BE EDITED BY HAND
|
|
||||||
*/
|
|
||||||
|
|
||||||
package assert
|
|
||||||
|
|
||||||
import (
|
|
||||||
http "net/http"
|
|
||||||
url "net/url"
|
|
||||||
time "time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
|
||||||
func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {
|
|
||||||
return Condition(a.t, comp, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// a.Contains("Hello World", "World", "But 'Hello World' does contain 'World'")
|
|
||||||
// a.Contains(["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'")
|
|
||||||
// a.Contains({"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return Contains(a.t, s, contains, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
|
||||||
// a slice or a channel with len == 0.
|
|
||||||
//
|
|
||||||
// a.Empty(obj)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return Empty(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal asserts that two objects are equal.
|
|
||||||
//
|
|
||||||
// a.Equal(123, 123, "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// 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 {
|
|
||||||
return Equal(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
|
||||||
// and that it is equal to the provided error.
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// a.EqualError(err, expectedErrorString, "An error was expected")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {
|
|
||||||
return EqualError(a.t, theError, errString, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
|
||||||
// and equal.
|
|
||||||
//
|
|
||||||
// a.EqualValues(uint32(123), int32(123), "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return EqualValues(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error asserts that a function returned an error (i.e. not `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if a.Error(err, "An error was expected") {
|
|
||||||
// assert.Equal(t, err, expectedError)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {
|
|
||||||
return Error(a.t, err, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exactly asserts that two objects are equal is value and type.
|
|
||||||
//
|
|
||||||
// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return Exactly(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fail reports a failure through
|
|
||||||
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {
|
|
||||||
return Fail(a.t, failureMessage, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FailNow fails test
|
|
||||||
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {
|
|
||||||
return FailNow(a.t, failureMessage, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// False asserts that the specified value is false.
|
|
||||||
//
|
|
||||||
// a.False(myBool, "myBool should be false")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {
|
|
||||||
return False(a.t, value, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
|
||||||
// body that contains a string.
|
|
||||||
//
|
|
||||||
// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {
|
|
||||||
return HTTPBodyContains(a.t, handler, method, url, values, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
|
||||||
// body that does not contain a string.
|
|
||||||
//
|
|
||||||
// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {
|
|
||||||
return HTTPBodyNotContains(a.t, handler, method, url, values, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
|
||||||
//
|
|
||||||
// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool {
|
|
||||||
return HTTPError(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
|
||||||
//
|
|
||||||
// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool {
|
|
||||||
return HTTPRedirect(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
|
||||||
//
|
|
||||||
// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool {
|
|
||||||
return HTTPSuccess(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
|
||||||
//
|
|
||||||
// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject")
|
|
||||||
func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return Implements(a.t, interfaceObject, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDelta asserts that the two numerals are within delta of each other.
|
|
||||||
//
|
|
||||||
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
|
||||||
return InDelta(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
|
||||||
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
|
|
||||||
return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
|
||||||
return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
|
||||||
func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
|
|
||||||
return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
|
||||||
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return IsType(a.t, expectedType, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONEq asserts that two JSON strings are equivalent.
|
|
||||||
//
|
|
||||||
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool {
|
|
||||||
return JSONEq(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Len asserts that the specified object has specific length.
|
|
||||||
// Len also fails if the object has a type that len() not accept.
|
|
||||||
//
|
|
||||||
// a.Len(mySlice, 3, "The size of slice is not 3")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool {
|
|
||||||
return Len(a.t, object, length, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nil asserts that the specified object is nil.
|
|
||||||
//
|
|
||||||
// a.Nil(err, "err should be nothing")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return Nil(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoError asserts that a function returned no error (i.e. `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if a.NoError(err) {
|
|
||||||
// assert.Equal(t, actualObj, expectedObj)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {
|
|
||||||
return NoError(a.t, err, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// a.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
|
|
||||||
// a.NotContains(["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'")
|
|
||||||
// a.NotContains({"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return NotContains(a.t, s, contains, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// if a.NotEmpty(obj) {
|
|
||||||
// assert.Equal(t, "two", obj[1])
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return NotEmpty(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotEqual asserts that the specified values are NOT equal.
|
|
||||||
//
|
|
||||||
// a.NotEqual(obj1, obj2, "two objects shouldn't be equal")
|
|
||||||
//
|
|
||||||
// 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 {
|
|
||||||
return NotEqual(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotNil asserts that the specified object is not nil.
|
|
||||||
//
|
|
||||||
// a.NotNil(err, "err should be something")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return NotNil(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
|
||||||
//
|
|
||||||
// a.NotPanics(func(){
|
|
||||||
// RemainCalm()
|
|
||||||
// }, "Calling RemainCalm() should NOT panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
|
||||||
return NotPanics(a.t, f, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotRegexp asserts that a specified regexp does not match a string.
|
|
||||||
//
|
|
||||||
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
|
|
||||||
// a.NotRegexp("^start", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return NotRegexp(a.t, rx, str, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
return NotZero(a.t, i, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
|
||||||
//
|
|
||||||
// a.Panics(func(){
|
|
||||||
// GoCrazy()
|
|
||||||
// }, "Calling GoCrazy() should panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
|
|
||||||
return Panics(a.t, f, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regexp asserts that a specified regexp matches a string.
|
|
||||||
//
|
|
||||||
// a.Regexp(regexp.MustCompile("start"), "it's starting")
|
|
||||||
// a.Regexp("start...$", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return Regexp(a.t, rx, str, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// True asserts that the specified value is true.
|
|
||||||
//
|
|
||||||
// a.True(myBool, "myBool should be true")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {
|
|
||||||
return True(a.t, value, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
|
|
||||||
return WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zero asserts that i is the zero value for its type and returns the truth.
|
|
||||||
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {
|
|
||||||
return Zero(a.t, i, msgAndArgs...)
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,45 +0,0 @@
|
||||||
// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system.
|
|
||||||
//
|
|
||||||
// Example Usage
|
|
||||||
//
|
|
||||||
// The following is a complete example using assert in a standard test function:
|
|
||||||
// import (
|
|
||||||
// "testing"
|
|
||||||
// "github.com/stretchr/testify/assert"
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// func TestSomething(t *testing.T) {
|
|
||||||
//
|
|
||||||
// var a string = "Hello"
|
|
||||||
// var b string = "Hello"
|
|
||||||
//
|
|
||||||
// assert.Equal(t, a, b, "The two words should be the same.")
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if you assert many times, use the format below:
|
|
||||||
//
|
|
||||||
// import (
|
|
||||||
// "testing"
|
|
||||||
// "github.com/stretchr/testify/assert"
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// func TestSomething(t *testing.T) {
|
|
||||||
// assert := assert.New(t)
|
|
||||||
//
|
|
||||||
// var a string = "Hello"
|
|
||||||
// var b string = "Hello"
|
|
||||||
//
|
|
||||||
// assert.Equal(a, b, "The two words should be the same.")
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Assertions
|
|
||||||
//
|
|
||||||
// Assertions allow you to easily write test code, and are global funcs in the `assert` package.
|
|
||||||
// All assertion functions take, as the first argument, the `*testing.T` object provided by the
|
|
||||||
// testing framework. This allows the assertion funcs to write the failings and other details to
|
|
||||||
// the correct place.
|
|
||||||
//
|
|
||||||
// Every assertion function also takes an optional string message as the final argument,
|
|
||||||
// allowing custom error messages to be appended to the message the assertion method outputs.
|
|
||||||
package assert
|
|
|
@ -1,10 +0,0 @@
|
||||||
package assert
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AnError is an error instance useful for testing. If the code does not care
|
|
||||||
// about error specifics, and only needs to return the error for example, this
|
|
||||||
// error should be used to make the test code more readable.
|
|
||||||
var AnError = errors.New("assert.AnError general error for testing")
|
|
|
@ -1,16 +0,0 @@
|
||||||
package assert
|
|
||||||
|
|
||||||
// Assertions provides assertion methods around the
|
|
||||||
// TestingT interface.
|
|
||||||
type Assertions struct {
|
|
||||||
t TestingT
|
|
||||||
}
|
|
||||||
|
|
||||||
// New makes a new Assertions object for the specified TestingT.
|
|
||||||
func New(t TestingT) *Assertions {
|
|
||||||
return &Assertions{
|
|
||||||
t: t,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl
|
|
|
@ -1,106 +0,0 @@
|
||||||
package assert
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"net/http/httptest"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// httpCode is a helper that returns HTTP code of the response. It returns -1
|
|
||||||
// if building a new request fails.
|
|
||||||
func httpCode(handler http.HandlerFunc, method, url string, values url.Values) int {
|
|
||||||
w := httptest.NewRecorder()
|
|
||||||
req, err := http.NewRequest(method, url+"?"+values.Encode(), nil)
|
|
||||||
if err != nil {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
handler(w, req)
|
|
||||||
return w.Code
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool {
|
|
||||||
code := httpCode(handler, method, url, values)
|
|
||||||
if code == -1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return code >= http.StatusOK && code <= http.StatusPartialContent
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool {
|
|
||||||
code := httpCode(handler, method, url, values)
|
|
||||||
if code == -1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool {
|
|
||||||
code := httpCode(handler, method, url, values)
|
|
||||||
if code == -1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return code >= http.StatusBadRequest
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBody is a helper that returns HTTP body of the response. It returns
|
|
||||||
// empty string if building a new request fails.
|
|
||||||
func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string {
|
|
||||||
w := httptest.NewRecorder()
|
|
||||||
req, err := http.NewRequest(method, url+"?"+values.Encode(), nil)
|
|
||||||
if err != nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
handler(w, req)
|
|
||||||
return w.Body.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
|
||||||
// body that contains a string.
|
|
||||||
//
|
|
||||||
// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool {
|
|
||||||
body := HTTPBody(handler, method, url, values)
|
|
||||||
|
|
||||||
contains := strings.Contains(body, fmt.Sprint(str))
|
|
||||||
if !contains {
|
|
||||||
Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body))
|
|
||||||
}
|
|
||||||
|
|
||||||
return contains
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
|
||||||
// body that does not contain a string.
|
|
||||||
//
|
|
||||||
// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool {
|
|
||||||
body := HTTPBody(handler, method, url, values)
|
|
||||||
|
|
||||||
contains := strings.Contains(body, fmt.Sprint(str))
|
|
||||||
if contains {
|
|
||||||
Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body))
|
|
||||||
}
|
|
||||||
|
|
||||||
return !contains
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
// Package require implements the same assertions as the `assert` package but
|
|
||||||
// stops test execution when a test fails.
|
|
||||||
//
|
|
||||||
// Example Usage
|
|
||||||
//
|
|
||||||
// The following is a complete example using require in a standard test function:
|
|
||||||
// import (
|
|
||||||
// "testing"
|
|
||||||
// "github.com/stretchr/testify/require"
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// func TestSomething(t *testing.T) {
|
|
||||||
//
|
|
||||||
// var a string = "Hello"
|
|
||||||
// var b string = "Hello"
|
|
||||||
//
|
|
||||||
// require.Equal(t, a, b, "The two words should be the same.")
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Assertions
|
|
||||||
//
|
|
||||||
// The `require` package have same global functions as in the `assert` package,
|
|
||||||
// but instead of returning a boolean result they call `t.FailNow()`.
|
|
||||||
//
|
|
||||||
// Every assertion function also takes an optional string message as the final argument,
|
|
||||||
// allowing custom error messages to be appended to the message the assertion method outputs.
|
|
||||||
package require
|
|
|
@ -1,16 +0,0 @@
|
||||||
package require
|
|
||||||
|
|
||||||
// Assertions provides assertion methods around the
|
|
||||||
// TestingT interface.
|
|
||||||
type Assertions struct {
|
|
||||||
t TestingT
|
|
||||||
}
|
|
||||||
|
|
||||||
// New makes a new Assertions object for the specified TestingT.
|
|
||||||
func New(t TestingT) *Assertions {
|
|
||||||
return &Assertions{
|
|
||||||
t: t,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl
|
|
|
@ -1,429 +0,0 @@
|
||||||
/*
|
|
||||||
* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen
|
|
||||||
* THIS FILE MUST NOT BE EDITED BY HAND
|
|
||||||
*/
|
|
||||||
|
|
||||||
package require
|
|
||||||
|
|
||||||
import (
|
|
||||||
assert "github.com/stretchr/testify/assert"
|
|
||||||
http "net/http"
|
|
||||||
url "net/url"
|
|
||||||
time "time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
|
||||||
func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Condition(t, comp, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// assert.Contains(t, "Hello World", "World", "But 'Hello World' does contain 'World'")
|
|
||||||
// assert.Contains(t, ["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'")
|
|
||||||
// assert.Contains(t, {"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Contains(t, s, contains, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
|
||||||
// a slice or a channel with len == 0.
|
|
||||||
//
|
|
||||||
// assert.Empty(t, obj)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Empty(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal asserts that two objects are equal.
|
|
||||||
//
|
|
||||||
// assert.Equal(t, 123, 123, "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// 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 interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Equal(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
|
||||||
// and that it is equal to the provided error.
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// assert.EqualError(t, err, expectedErrorString, "An error was expected")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.EqualError(t, theError, errString, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
|
||||||
// and equal.
|
|
||||||
//
|
|
||||||
// assert.EqualValues(t, uint32(123), int32(123), "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.EqualValues(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error asserts that a function returned an error (i.e. not `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if assert.Error(t, err, "An error was expected") {
|
|
||||||
// assert.Equal(t, err, expectedError)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Error(t TestingT, err error, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Error(t, err, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exactly asserts that two objects are equal is value and type.
|
|
||||||
//
|
|
||||||
// assert.Exactly(t, int32(123), int64(123), "123 and 123 should NOT be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Exactly(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fail reports a failure through
|
|
||||||
func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Fail(t, failureMessage, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FailNow fails test
|
|
||||||
func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.FailNow(t, failureMessage, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// False asserts that the specified value is false.
|
|
||||||
//
|
|
||||||
// assert.False(t, myBool, "myBool should be false")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func False(t TestingT, value bool, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.False(t, value, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
|
||||||
// body that contains a string.
|
|
||||||
//
|
|
||||||
// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
if !assert.HTTPBodyContains(t, handler, method, url, values, str) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
|
||||||
// body that does not contain a string.
|
|
||||||
//
|
|
||||||
// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
if !assert.HTTPBodyNotContains(t, handler, method, url, values, str) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
if !assert.HTTPError(t, handler, method, url, values) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
if !assert.HTTPRedirect(t, handler, method, url, values) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
|
||||||
//
|
|
||||||
// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
if !assert.HTTPSuccess(t, handler, method, url, values) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
|
||||||
//
|
|
||||||
// assert.Implements(t, (*MyInterface)(nil), new(MyObject), "MyObject")
|
|
||||||
func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Implements(t, interfaceObject, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDelta asserts that the two numerals are within delta of each other.
|
|
||||||
//
|
|
||||||
// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
|
||||||
func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
|
||||||
func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
|
||||||
func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.IsType(t, expectedType, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONEq asserts that two JSON strings are equivalent.
|
|
||||||
//
|
|
||||||
// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.JSONEq(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Len asserts that the specified object has specific length.
|
|
||||||
// Len also fails if the object has a type that len() not accept.
|
|
||||||
//
|
|
||||||
// assert.Len(t, mySlice, 3, "The size of slice is not 3")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Len(t, object, length, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nil asserts that the specified object is nil.
|
|
||||||
//
|
|
||||||
// assert.Nil(t, err, "err should be nothing")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Nil(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoError asserts that a function returned no error (i.e. `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if assert.NoError(t, err) {
|
|
||||||
// assert.Equal(t, actualObj, expectedObj)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NoError(t TestingT, err error, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NoError(t, err, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// assert.NotContains(t, "Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
|
|
||||||
// assert.NotContains(t, ["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'")
|
|
||||||
// assert.NotContains(t, {"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotContains(t, s, contains, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// if assert.NotEmpty(t, obj) {
|
|
||||||
// assert.Equal(t, "two", obj[1])
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotEmpty(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotEqual asserts that the specified values are NOT equal.
|
|
||||||
//
|
|
||||||
// assert.NotEqual(t, obj1, obj2, "two objects shouldn't be equal")
|
|
||||||
//
|
|
||||||
// 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 interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotEqual(t, expected, actual, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotNil asserts that the specified object is not nil.
|
|
||||||
//
|
|
||||||
// assert.NotNil(t, err, "err should be something")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotNil(t, object, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
|
||||||
//
|
|
||||||
// assert.NotPanics(t, func(){
|
|
||||||
// RemainCalm()
|
|
||||||
// }, "Calling RemainCalm() should NOT panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotPanics(t, f, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotRegexp asserts that a specified regexp does not match a string.
|
|
||||||
//
|
|
||||||
// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting")
|
|
||||||
// assert.NotRegexp(t, "^start", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotRegexp(t, rx, str, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotZero asserts that i is not the zero value for its type and returns the truth.
|
|
||||||
func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.NotZero(t, i, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
|
||||||
//
|
|
||||||
// assert.Panics(t, func(){
|
|
||||||
// GoCrazy()
|
|
||||||
// }, "Calling GoCrazy() should panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Panics(t, f, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regexp asserts that a specified regexp matches a string.
|
|
||||||
//
|
|
||||||
// assert.Regexp(t, regexp.MustCompile("start"), "it's starting")
|
|
||||||
// assert.Regexp(t, "start...$", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Regexp(t, rx, str, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// True asserts that the specified value is true.
|
|
||||||
//
|
|
||||||
// assert.True(t, myBool, "myBool should be true")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func True(t TestingT, value bool, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.True(t, value, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithinDuration asserts that the two times are within duration delta of each other.
|
|
||||||
//
|
|
||||||
// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zero asserts that i is the zero value for its type and returns the truth.
|
|
||||||
func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
if !assert.Zero(t, i, msgAndArgs...) {
|
|
||||||
t.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,353 +0,0 @@
|
||||||
/*
|
|
||||||
* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen
|
|
||||||
* THIS FILE MUST NOT BE EDITED BY HAND
|
|
||||||
*/
|
|
||||||
|
|
||||||
package require
|
|
||||||
|
|
||||||
import (
|
|
||||||
assert "github.com/stretchr/testify/assert"
|
|
||||||
http "net/http"
|
|
||||||
url "net/url"
|
|
||||||
time "time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
|
||||||
func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) {
|
|
||||||
Condition(a.t, comp, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Contains asserts that the specified string, list(array, slice...) or map contains the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// a.Contains("Hello World", "World", "But 'Hello World' does contain 'World'")
|
|
||||||
// a.Contains(["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'")
|
|
||||||
// a.Contains({"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Contains(a.t, s, contains, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
|
|
||||||
// a slice or a channel with len == 0.
|
|
||||||
//
|
|
||||||
// a.Empty(obj)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Empty(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal asserts that two objects are equal.
|
|
||||||
//
|
|
||||||
// a.Equal(123, 123, "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// 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{}) {
|
|
||||||
Equal(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualError asserts that a function returned an error (i.e. not `nil`)
|
|
||||||
// and that it is equal to the provided error.
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// a.EqualError(err, expectedErrorString, "An error was expected")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) {
|
|
||||||
EqualError(a.t, theError, errString, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertable to the same types
|
|
||||||
// and equal.
|
|
||||||
//
|
|
||||||
// a.EqualValues(uint32(123), int32(123), "123 and 123 should be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
EqualValues(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error asserts that a function returned an error (i.e. not `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if a.Error(err, "An error was expected") {
|
|
||||||
// assert.Equal(t, err, expectedError)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Error(err error, msgAndArgs ...interface{}) {
|
|
||||||
Error(a.t, err, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exactly asserts that two objects are equal is value and type.
|
|
||||||
//
|
|
||||||
// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Exactly(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fail reports a failure through
|
|
||||||
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
Fail(a.t, failureMessage, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FailNow fails test
|
|
||||||
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) {
|
|
||||||
FailNow(a.t, failureMessage, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// False asserts that the specified value is false.
|
|
||||||
//
|
|
||||||
// a.False(myBool, "myBool should be false")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) False(value bool, msgAndArgs ...interface{}) {
|
|
||||||
False(a.t, value, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyContains asserts that a specified handler returns a
|
|
||||||
// body that contains a string.
|
|
||||||
//
|
|
||||||
// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
HTTPBodyContains(a.t, handler, method, url, values, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyNotContains asserts that a specified handler returns a
|
|
||||||
// body that does not contain a string.
|
|
||||||
//
|
|
||||||
// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {
|
|
||||||
HTTPBodyNotContains(a.t, handler, method, url, values, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPError asserts that a specified handler returns an error status code.
|
|
||||||
//
|
|
||||||
// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
HTTPError(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPRedirect asserts that a specified handler returns a redirect status code.
|
|
||||||
//
|
|
||||||
// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
HTTPRedirect(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPSuccess asserts that a specified handler returns a success status code.
|
|
||||||
//
|
|
||||||
// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) {
|
|
||||||
HTTPSuccess(a.t, handler, method, url, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements asserts that an object is implemented by the specified interface.
|
|
||||||
//
|
|
||||||
// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject")
|
|
||||||
func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Implements(a.t, interfaceObject, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDelta asserts that the two numerals are within delta of each other.
|
|
||||||
//
|
|
||||||
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
InDelta(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InDeltaSlice is the same as InDelta, except it compares two slices.
|
|
||||||
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
|
|
||||||
InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilon asserts that expected and actual have a relative error less than epsilon
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
|
|
||||||
func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {
|
|
||||||
InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsType asserts that the specified objects are of the same type.
|
|
||||||
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
IsType(a.t, expectedType, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONEq asserts that two JSON strings are equivalent.
|
|
||||||
//
|
|
||||||
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) {
|
|
||||||
JSONEq(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Len asserts that the specified object has specific length.
|
|
||||||
// Len also fails if the object has a type that len() not accept.
|
|
||||||
//
|
|
||||||
// a.Len(mySlice, 3, "The size of slice is not 3")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) {
|
|
||||||
Len(a.t, object, length, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nil asserts that the specified object is nil.
|
|
||||||
//
|
|
||||||
// a.Nil(err, "err should be nothing")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Nil(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoError asserts that a function returned no error (i.e. `nil`).
|
|
||||||
//
|
|
||||||
// actualObj, err := SomeFunction()
|
|
||||||
// if a.NoError(err) {
|
|
||||||
// assert.Equal(t, actualObj, expectedObj)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) {
|
|
||||||
NoError(a.t, err, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
|
|
||||||
// specified substring or element.
|
|
||||||
//
|
|
||||||
// a.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
|
|
||||||
// a.NotContains(["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'")
|
|
||||||
// a.NotContains({"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotContains(a.t, s, contains, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// if a.NotEmpty(obj) {
|
|
||||||
// assert.Equal(t, "two", obj[1])
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotEmpty(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotEqual asserts that the specified values are NOT equal.
|
|
||||||
//
|
|
||||||
// a.NotEqual(obj1, obj2, "two objects shouldn't be equal")
|
|
||||||
//
|
|
||||||
// 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{}) {
|
|
||||||
NotEqual(a.t, expected, actual, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotNil asserts that the specified object is not nil.
|
|
||||||
//
|
|
||||||
// a.NotNil(err, "err should be something")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotNil(a.t, object, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
|
|
||||||
//
|
|
||||||
// a.NotPanics(func(){
|
|
||||||
// RemainCalm()
|
|
||||||
// }, "Calling RemainCalm() should NOT panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
NotPanics(a.t, f, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotRegexp asserts that a specified regexp does not match a string.
|
|
||||||
//
|
|
||||||
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
|
|
||||||
// a.NotRegexp("^start", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotRegexp(a.t, rx, str, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotZero asserts that i is not the zero value for its type and returns the truth.
|
|
||||||
func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
NotZero(a.t, i, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
|
||||||
//
|
|
||||||
// a.Panics(func(){
|
|
||||||
// GoCrazy()
|
|
||||||
// }, "Calling GoCrazy() should panic")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {
|
|
||||||
Panics(a.t, f, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Regexp asserts that a specified regexp matches a string.
|
|
||||||
//
|
|
||||||
// a.Regexp(regexp.MustCompile("start"), "it's starting")
|
|
||||||
// a.Regexp("start...$", "it's not starting")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Regexp(a.t, rx, str, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// True asserts that the specified value is true.
|
|
||||||
//
|
|
||||||
// a.True(myBool, "myBool should be true")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) True(value bool, msgAndArgs ...interface{}) {
|
|
||||||
True(a.t, value, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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")
|
|
||||||
//
|
|
||||||
// Returns whether the assertion was successful (true) or not (false).
|
|
||||||
func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {
|
|
||||||
WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zero asserts that i is the zero value for its type and returns the truth.
|
|
||||||
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) {
|
|
||||||
Zero(a.t, i, msgAndArgs...)
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
package require
|
|
||||||
|
|
||||||
// TestingT is an interface wrapper around *testing.T
|
|
||||||
type TestingT interface {
|
|
||||||
Errorf(format string, args ...interface{})
|
|
||||||
FailNow()
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl
|
|
Loading…
Reference in New Issue