|  | package cartesian | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "testing" | 
|  |  | 
|  | "github.com/google/go-cmp/cmp" | 
|  | ) | 
|  |  | 
|  | func TestProduct(t *testing.T) { | 
|  | for i, te := range []struct { | 
|  | data [][]string | 
|  | want [][]string | 
|  | }{ | 
|  | { | 
|  | data: [][]string{ | 
|  | {"a", "b"}, | 
|  | {"c", "d"}, | 
|  | }, | 
|  | want: [][]string{ | 
|  | {"a", "c"}, | 
|  | {"a", "d"}, | 
|  | {"b", "c"}, | 
|  | {"b", "d"}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | data: [][]string{ | 
|  | {"a", "b"}, | 
|  | }, | 
|  | want: [][]string{ | 
|  | {"a"}, | 
|  | {"b"}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | data: [][]string{}, | 
|  | want: nil, | 
|  | }, | 
|  | } { | 
|  | t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { | 
|  | got := Product(te.data...) | 
|  | if diff := cmp.Diff(te.want, got); diff != "" { | 
|  | t.Fatalf("Diff:\n%s", diff) | 
|  | } | 
|  | }) | 
|  | } | 
|  | } |