// Package shakers provide some checker implementation the go-check.Checker interface. package shakers import ( "fmt" "strings" "github.com/go-check/check" ) // Contains checker verifies that obtained value contains a substring. var Contains check.Checker = &substringChecker{ &check.CheckerInfo{ Name: "Contains", Params: []string{"obtained", "substring"}, }, strings.Contains, } // ContainsAny checker verifies that any Unicode code points in chars // are in the obtained string. var ContainsAny check.Checker = &substringChecker{ &check.CheckerInfo{ Name: "ContainsAny", Params: []string{"obtained", "chars"}, }, strings.ContainsAny, } // HasPrefix checker verifies that obtained value has the specified substring as prefix var HasPrefix check.Checker = &substringChecker{ &check.CheckerInfo{ Name: "HasPrefix", Params: []string{"obtained", "prefix"}, }, strings.HasPrefix, } // HasSuffix checker verifies that obtained value has the specified substring as prefix var HasSuffix check.Checker = &substringChecker{ &check.CheckerInfo{ Name: "HasSuffix", Params: []string{"obtained", "suffix"}, }, strings.HasSuffix, } // EqualFold checker verifies that obtained value is, interpreted as UTF-8 strings, are equal under Unicode case-folding. var EqualFold check.Checker = &substringChecker{ &check.CheckerInfo{ Name: "EqualFold", Params: []string{"obtained", "expected"}, }, strings.EqualFold, } type substringChecker struct { *check.CheckerInfo substringFunction func(string, string) bool } func (checker *substringChecker) Check(params []interface{}, names []string) (bool, string) { obtained := params[0] substring := params[1] substringStr, ok := substring.(string) if !ok { return false, fmt.Sprintf("%s value must be a string.", names[1]) } obtainedString, obtainedIsStr := obtained.(string) if !obtainedIsStr { if obtainedWithStringer, obtainedHasStringer := obtained.(fmt.Stringer); obtainedHasStringer { obtainedString, obtainedIsStr = obtainedWithStringer.String(), true } } if obtainedIsStr { return checker.substringFunction(obtainedString, substringStr), "" } return false, "obtained value is not a string and has no .String()." } // IndexAny checker verifies that the index of the first instance of any Unicode code point from chars in the obtained value is equal to expected var IndexAny check.Checker = &substringCountChecker{ &check.CheckerInfo{ Name: "IndexAny", Params: []string{"obtained", "chars", "expected"}, }, strings.IndexAny, } // Index checker verifies that the index of the first instance of sep in the obtained value is equal to expected var Index check.Checker = &substringCountChecker{ &check.CheckerInfo{ Name: "Index", Params: []string{"obtained", "sep", "expected"}, }, strings.Index, } // Count checker verifies that obtained value has the specified number of non-overlapping instances of sep var Count check.Checker = &substringCountChecker{ &check.CheckerInfo{ Name: "Count", Params: []string{"obtained", "sep", "expected"}, }, strings.Count, } type substringCountChecker struct { *check.CheckerInfo substringFunction func(string, string) int } func (checker *substringCountChecker) Check(params []interface{}, names []string) (bool, string) { obtained := params[0] substring := params[1] expected := params[2] substringStr, ok := substring.(string) if !ok { return false, fmt.Sprintf("%s value must be a string.", names[1]) } obtainedString, obtainedIsStr := obtained.(string) if !obtainedIsStr { if obtainedWithStringer, obtainedHasStringer := obtained.(fmt.Stringer); obtainedHasStringer { obtainedString, obtainedIsStr = obtainedWithStringer.String(), true } } if obtainedIsStr { return checker.substringFunction(obtainedString, substringStr) == expected, "" } return false, "obtained value is not a string and has no .String()." } // IsLower checker verifies that the obtained value is in lower case var IsLower check.Checker = &stringTransformChecker{ &check.CheckerInfo{ Name: "IsLower", Params: []string{"obtained"}, }, strings.ToLower, } // IsUpper checker verifies that the obtained value is in lower case var IsUpper check.Checker = &stringTransformChecker{ &check.CheckerInfo{ Name: "IsUpper", Params: []string{"obtained"}, }, strings.ToUpper, } type stringTransformChecker struct { *check.CheckerInfo stringFunction func(string) string } func (checker *stringTransformChecker) Check(params []interface{}, names []string) (bool, string) { obtained := params[0] obtainedString, obtainedIsStr := obtained.(string) if !obtainedIsStr { if obtainedWithStringer, obtainedHasStringer := obtained.(fmt.Stringer); obtainedHasStringer { obtainedString, obtainedIsStr = obtainedWithStringer.String(), true } } if obtainedIsStr { return checker.stringFunction(obtainedString) == obtainedString, "" } return false, "obtained value is not a string and has no .String()." }