diff --git a/mtest/massert/massert.go b/mtest/massert/massert.go index 7b94619..34549fc 100644 --- a/mtest/massert/massert.go +++ b/mtest/massert/massert.go @@ -8,6 +8,7 @@ import ( "path/filepath" "reflect" "runtime" + "strconv" "strings" "testing" "text/tabwriter" @@ -393,3 +394,18 @@ func HasKey(set, elem interface{}) Assertion { return errors.New("value not a key in the map") }, toStr(set)+" has key "+toStr(elem), 0) } + +// Len asserts that the given set has the given number of elements in it. The +// set may be an array, a slice, or a map. A nil value'd set is considered to be +// a length of zero. +func Len(set interface{}, length int) Assertion { + return newAssertion(func() error { + setVV, err := toSet(set, false) + if err != nil { + return err + } else if len(setVV) != length { + return errors.New("set not correct length") + } + return nil + }, toStr(set)+" has length "+strconv.Itoa(length), 0) +} diff --git a/mtest/massert/massert_test.go b/mtest/massert/massert_test.go index 703b62d..4ec2f67 100644 --- a/mtest/massert/massert_test.go +++ b/mtest/massert/massert_test.go @@ -172,3 +172,27 @@ func TestHasKey(t *T) { HasKey(map[int]int{2: 2}, 1), )) } + +func TestLen(t *T) { + Fatal(t, All( + Len([]int(nil), 0), + Len([]int{}, 0), + Len([]int{1}, 1), + Len([]int{1, 2}, 2), + Len(map[int]int(nil), 0), + Len(map[int]int{}, 0), + Len(map[int]int{1: 1}, 1), + Len(map[int]int{1: 1, 2: 2}, 2), + )) + + Fatal(t, None( + Len([]int(nil), 1), + Len([]int{}, 1), + Len([]int{1}, 0), + Len([]int{1}, 2), + Len([]int{1, 2}, 1), + Len([]int{1, 2}, 3), + Len(map[int]int(nil), 1), + Len(map[int]int{}, 1), + )) +}