123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- package assertions
- import (
- "fmt"
- "reflect"
- "github.com/smartystreets/assertions/internal/oglematchers"
- )
- // ShouldContain receives exactly two parameters. The first is a slice and the
- // second is a proposed member. Membership is determined using ShouldEqual.
- func ShouldContain(actual interface{}, expected ...interface{}) string {
- if fail := need(1, expected); fail != success {
- return fail
- }
- if matchError := oglematchers.Contains(expected[0]).Matches(actual); matchError != nil {
- typeName := reflect.TypeOf(actual)
- if fmt.Sprintf("%v", matchError) == "which is not a slice or array" {
- return fmt.Sprintf(shouldHaveBeenAValidCollection, typeName)
- }
- return fmt.Sprintf(shouldHaveContained, typeName, expected[0])
- }
- return success
- }
- // ShouldNotContain receives exactly two parameters. The first is a slice and the
- // second is a proposed member. Membership is determinied using ShouldEqual.
- func ShouldNotContain(actual interface{}, expected ...interface{}) string {
- if fail := need(1, expected); fail != success {
- return fail
- }
- typeName := reflect.TypeOf(actual)
- if matchError := oglematchers.Contains(expected[0]).Matches(actual); matchError != nil {
- if fmt.Sprintf("%v", matchError) == "which is not a slice or array" {
- return fmt.Sprintf(shouldHaveBeenAValidCollection, typeName)
- }
- return success
- }
- return fmt.Sprintf(shouldNotHaveContained, typeName, expected[0])
- }
- // ShouldContainKey receives exactly two parameters. The first is a map and the
- // second is a proposed key. Keys are compared with a simple '=='.
- func ShouldContainKey(actual interface{}, expected ...interface{}) string {
- if fail := need(1, expected); fail != success {
- return fail
- }
- keys, isMap := mapKeys(actual)
- if !isMap {
- return fmt.Sprintf(shouldHaveBeenAValidMap, reflect.TypeOf(actual))
- }
- if !keyFound(keys, expected[0]) {
- return fmt.Sprintf(shouldHaveContainedKey, reflect.TypeOf(actual), expected)
- }
- return ""
- }
- // ShouldNotContainKey receives exactly two parameters. The first is a map and the
- // second is a proposed absent key. Keys are compared with a simple '=='.
- func ShouldNotContainKey(actual interface{}, expected ...interface{}) string {
- if fail := need(1, expected); fail != success {
- return fail
- }
- keys, isMap := mapKeys(actual)
- if !isMap {
- return fmt.Sprintf(shouldHaveBeenAValidMap, reflect.TypeOf(actual))
- }
- if keyFound(keys, expected[0]) {
- return fmt.Sprintf(shouldNotHaveContainedKey, reflect.TypeOf(actual), expected)
- }
- return ""
- }
- func mapKeys(m interface{}) ([]reflect.Value, bool) {
- value := reflect.ValueOf(m)
- if value.Kind() != reflect.Map {
- return nil, false
- }
- return value.MapKeys(), true
- }
- func keyFound(keys []reflect.Value, expectedKey interface{}) bool {
- found := false
- for _, key := range keys {
- if key.Interface() == expectedKey {
- found = true
- }
- }
- return found
- }
- // ShouldBeIn receives at least 2 parameters. The first is a proposed member of the collection
- // that is passed in either as the second parameter, or of the collection that is comprised
- // of all the remaining parameters. This assertion ensures that the proposed member is in
- // the collection (using ShouldEqual).
- func ShouldBeIn(actual interface{}, expected ...interface{}) string {
- if fail := atLeast(1, expected); fail != success {
- return fail
- }
- if len(expected) == 1 {
- return shouldBeIn(actual, expected[0])
- }
- return shouldBeIn(actual, expected)
- }
- func shouldBeIn(actual interface{}, expected interface{}) string {
- if matchError := oglematchers.Contains(actual).Matches(expected); matchError != nil {
- return fmt.Sprintf(shouldHaveBeenIn, actual, reflect.TypeOf(expected))
- }
- return success
- }
- // ShouldNotBeIn receives at least 2 parameters. The first is a proposed member of the collection
- // that is passed in either as the second parameter, or of the collection that is comprised
- // of all the remaining parameters. This assertion ensures that the proposed member is NOT in
- // the collection (using ShouldEqual).
- func ShouldNotBeIn(actual interface{}, expected ...interface{}) string {
- if fail := atLeast(1, expected); fail != success {
- return fail
- }
- if len(expected) == 1 {
- return shouldNotBeIn(actual, expected[0])
- }
- return shouldNotBeIn(actual, expected)
- }
- func shouldNotBeIn(actual interface{}, expected interface{}) string {
- if matchError := oglematchers.Contains(actual).Matches(expected); matchError == nil {
- return fmt.Sprintf(shouldNotHaveBeenIn, actual, reflect.TypeOf(expected))
- }
- return success
- }
- // ShouldBeEmpty receives a single parameter (actual) and determines whether or not
- // calling len(actual) would return `0`. It obeys the rules specified by the len
- // function for determining length: http://golang.org/pkg/builtin/#len
- func ShouldBeEmpty(actual interface{}, expected ...interface{}) string {
- if fail := need(0, expected); fail != success {
- return fail
- }
- if actual == nil {
- return success
- }
- value := reflect.ValueOf(actual)
- switch value.Kind() {
- case reflect.Slice:
- if value.Len() == 0 {
- return success
- }
- case reflect.Chan:
- if value.Len() == 0 {
- return success
- }
- case reflect.Map:
- if value.Len() == 0 {
- return success
- }
- case reflect.String:
- if value.Len() == 0 {
- return success
- }
- case reflect.Ptr:
- elem := value.Elem()
- kind := elem.Kind()
- if (kind == reflect.Slice || kind == reflect.Array) && elem.Len() == 0 {
- return success
- }
- }
- return fmt.Sprintf(shouldHaveBeenEmpty, actual)
- }
- // ShouldNotBeEmpty receives a single parameter (actual) and determines whether or not
- // calling len(actual) would return a value greater than zero. It obeys the rules
- // specified by the `len` function for determining length: http://golang.org/pkg/builtin/#len
- func ShouldNotBeEmpty(actual interface{}, expected ...interface{}) string {
- if fail := need(0, expected); fail != success {
- return fail
- }
- if empty := ShouldBeEmpty(actual, expected...); empty != success {
- return success
- }
- return fmt.Sprintf(shouldNotHaveBeenEmpty, actual)
- }
- // ShouldHaveLength receives 2 parameters. The first is a collection to check
- // the length of, the second being the expected length. It obeys the rules
- // specified by the len function for determining length:
- // http://golang.org/pkg/builtin/#len
- func ShouldHaveLength(actual interface{}, expected ...interface{}) string {
- if fail := need(1, expected); fail != success {
- return fail
- }
- var expectedLen int64
- lenValue := reflect.ValueOf(expected[0])
- switch lenValue.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- expectedLen = lenValue.Int()
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- expectedLen = int64(lenValue.Uint())
- default:
- return fmt.Sprintf(shouldHaveBeenAValidInteger, reflect.TypeOf(expected[0]))
- }
- if expectedLen < 0 {
- return fmt.Sprintf(shouldHaveBeenAValidLength, expected[0])
- }
- value := reflect.ValueOf(actual)
- switch value.Kind() {
- case reflect.Slice,
- reflect.Chan,
- reflect.Map,
- reflect.String:
- if int64(value.Len()) == expectedLen {
- return success
- } else {
- return fmt.Sprintf(shouldHaveHadLength, actual, value.Len(), expectedLen)
- }
- case reflect.Ptr:
- elem := value.Elem()
- kind := elem.Kind()
- if kind == reflect.Slice || kind == reflect.Array {
- if int64(elem.Len()) == expectedLen {
- return success
- } else {
- return fmt.Sprintf(shouldHaveHadLength, actual, elem.Len(), expectedLen)
- }
- }
- }
- return fmt.Sprintf(shouldHaveBeenAValidCollection, reflect.TypeOf(actual))
- }
|