package slice_test import ( "testing" "github.com/matryer/is" "go.sour.is/pkg/slice" ) func TestAlign(t *testing.T) { type testCase struct { left, right []string combined []slice.Pair[*string, *string] } tests := []testCase{ { left: []string{"1", "3", "5"}, right: []string{"2", "3", "4"}, combined: []slice.Pair[*string, *string]{ {ptr("1"), nil}, {nil, ptr("2")}, {ptr("3"), ptr("3")}, {nil, ptr("4")}, {ptr("5"), nil}, }, }, { left: []string{"2", "3", "4"}, right: []string{"1", "3", "5"}, combined: []slice.Pair[*string, *string]{ {nil, ptr("1")}, {ptr("2"), nil}, {ptr("3"), ptr("3")}, {ptr("4"), nil}, {nil, ptr("5")}, }, }, } is := is.New(t) for _, tt := range tests { combined := slice.Align(tt.left, tt.right, func(l, r string) bool { return l < r }) is.Equal(len(combined), len(tt.combined)) for i := range combined { is.Equal(combined[i], tt.combined[i]) } } } func ptr[T any](v T) *T { return &v }