85 lines
1.7 KiB
Go
85 lines
1.7 KiB
Go
package assert
|
|
|
|
import (
|
|
"reflect"
|
|
"strings"
|
|
)
|
|
|
|
// Contains asserts that a contains b
|
|
func Contains(t test, container any, element any) {
|
|
if contains(container, element) {
|
|
return
|
|
}
|
|
|
|
t.Errorf(formatMessage("Contains", element, container))
|
|
t.FailNow()
|
|
}
|
|
|
|
// NotContains asserts that a doesn't contain b
|
|
func NotContains(t test, container any, element any) {
|
|
if !contains(container, element) {
|
|
return
|
|
}
|
|
|
|
t.Errorf(formatMessage("NotContains", element, container))
|
|
t.FailNow()
|
|
}
|
|
|
|
// contains returns whether container contains the given element
|
|
func contains(container any, element any) bool {
|
|
containerValue := reflect.ValueOf(container)
|
|
|
|
switch containerValue.Kind() {
|
|
case reflect.String:
|
|
elementValue := reflect.ValueOf(element)
|
|
return strings.Contains(containerValue.String(), elementValue.String())
|
|
|
|
case reflect.Map:
|
|
keys := containerValue.MapKeys()
|
|
for _, key := range keys {
|
|
if key.Interface() == element {
|
|
return true
|
|
}
|
|
}
|
|
|
|
case reflect.Slice:
|
|
elementValue := reflect.ValueOf(element)
|
|
|
|
if elementValue.Kind() == reflect.Slice {
|
|
elementLength := elementValue.Len()
|
|
|
|
if elementLength == 0 {
|
|
return true
|
|
}
|
|
|
|
if elementLength > containerValue.Len() {
|
|
return false
|
|
}
|
|
|
|
// Check for subsequence
|
|
for i := 0; i <= containerValue.Len()-elementLength; i++ {
|
|
match := true
|
|
for j := range elementLength {
|
|
if containerValue.Index(i+j).Interface() != elementValue.Index(j).Interface() {
|
|
match = false
|
|
break
|
|
}
|
|
}
|
|
if match {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Check for single element
|
|
for i := range containerValue.Len() {
|
|
if containerValue.Index(i).Interface() == element {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|