From 3e879a2136d2ae0f823f8d0f5457020a305799ae Mon Sep 17 00:00:00 2001 From: Josh Gwosdz Date: Thu, 29 Jan 2026 09:35:36 +0100 Subject: [PATCH] feat: add GenerateAndCollect helper that calls slices.Collect on the result of Generate to return a slice with all generated test cases --- matrix.go | 12 ++++++++++++ matrix_test.go | 22 +++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/matrix.go b/matrix.go index 4a71ec3..e1066a0 100644 --- a/matrix.go +++ b/matrix.go @@ -3,6 +3,7 @@ package matrix import ( "iter" "reflect" + "slices" ) type testingT interface { @@ -10,7 +11,18 @@ type testingT interface { Fatalf(format string, args ...any) } +// GenerateAndCollect generates all possible combinations of values for fields of the type T. +// It returns a collected slice of generated test cases. +// Use this function if you need all test cases at once, use a for-range loop on Generate otherwise. +// - len(dims) must equal len(fields(T)) +// - dimensions[i].(type) must equal [](fields(T)[i].(type)) +// - T must only have exported fields. +func GenerateAndCollect[T any](t testingT, tcase T, dimensions ...any) []T { + return slices.Collect(Generate(t, tcase, dimensions...)) +} + // Generate generates all possible combinations of values for fields of the type T. +// It returns an iter.Seq[T] that can be for-ranged over. // - len(dims) must equal len(fields(T)) // - dimensions[i].(type) must equal [](fields(T)[i].(type)) // - T must only have exported fields. diff --git a/matrix_test.go b/matrix_test.go index 4371883..f3388f2 100644 --- a/matrix_test.go +++ b/matrix_test.go @@ -134,11 +134,23 @@ func TestNilPointers(t *testing.T) { {Y: nil}, {Y: ptrTo(1)}, } - generated := slices.Collect(Generate(t, tcase{}, - []*int{nil, ptrTo(1)})) + generated := GenerateAndCollect(t, tcase{}, []*int{nil, ptrTo(1)}) - if !reflect.DeepEqual(expected, generated) { - t.Logf("Expected: %v, got: %v", expected, generated) - t.Fail() + assert.Equal(t, expected, generated) +} + +func TestGenerateAndCollect(t *testing.T) { + t.Parallel() + + type tcase struct { + Y bool + } + + expected := []tcase{ + {Y: false}, + {Y: true}, } + generated := GenerateAndCollect(t, tcase{}, []bool{false, true}) + + assert.Equal(t, expected, generated) }