/*
* 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).
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()
//   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 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 two slices.
func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {
  if !assert.InEpsilonSlice(t, expected, actual, delta, 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).
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()
  }
}
