|
|
@@ -0,0 +1,66 @@
|
|
|
+// Copyright (c) Tailscale Inc & AUTHORS
|
|
|
+// SPDX-License-Identifier: BSD-3-Clause
|
|
|
+
|
|
|
+package slicesx
|
|
|
+
|
|
|
+import (
|
|
|
+ "reflect"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "golang.org/x/exp/slices"
|
|
|
+)
|
|
|
+
|
|
|
+func TestInterleave(t *testing.T) {
|
|
|
+ testCases := []struct {
|
|
|
+ name string
|
|
|
+ a, b []int
|
|
|
+ want []int
|
|
|
+ }{
|
|
|
+ {name: "equal", a: []int{1, 3, 5}, b: []int{2, 4, 6}, want: []int{1, 2, 3, 4, 5, 6}},
|
|
|
+ {name: "short_b", a: []int{1, 3, 5}, b: []int{2, 4}, want: []int{1, 2, 3, 4, 5}},
|
|
|
+ {name: "short_a", a: []int{1, 3}, b: []int{2, 4, 6}, want: []int{1, 2, 3, 4, 6}},
|
|
|
+ {name: "len_1", a: []int{1}, b: []int{2, 4, 6}, want: []int{1, 2, 4, 6}},
|
|
|
+ {name: "nil_a", a: nil, b: []int{2, 4, 6}, want: []int{2, 4, 6}},
|
|
|
+ {name: "nil_all", a: nil, b: nil, want: nil},
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, tc := range testCases {
|
|
|
+ t.Run(tc.name, func(t *testing.T) {
|
|
|
+ merged := Interleave(tc.a, tc.b)
|
|
|
+ if !reflect.DeepEqual(merged, tc.want) {
|
|
|
+ t.Errorf("got %v; want %v", merged, tc.want)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func BenchmarkInterleave(b *testing.B) {
|
|
|
+ b.ReportAllocs()
|
|
|
+ b.ResetTimer()
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
+ Interleave(
|
|
|
+ []int{1, 2, 3},
|
|
|
+ []int{9, 8, 7},
|
|
|
+ )
|
|
|
+ }
|
|
|
+}
|
|
|
+func TestShuffle(t *testing.T) {
|
|
|
+ var sl []int
|
|
|
+ for i := 0; i < 100; i++ {
|
|
|
+ sl = append(sl, i)
|
|
|
+ }
|
|
|
+
|
|
|
+ var wasShuffled bool
|
|
|
+ for try := 0; try < 10; try++ {
|
|
|
+ shuffled := slices.Clone(sl)
|
|
|
+ Shuffle(shuffled)
|
|
|
+ if !reflect.DeepEqual(shuffled, sl) {
|
|
|
+ wasShuffled = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if !wasShuffled {
|
|
|
+ t.Errorf("expected shuffle after 10 tries")
|
|
|
+ }
|
|
|
+}
|