1
0
Assert/contains.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
}