util/uniq: add ModifySliceFunc (#5504)

Follow-up to #5491. This was used in control... oops!

Signed-off-by: Andrew Dunham <andrew@tailscale.com>
This commit is contained in:
Andrew Dunham
2022-08-30 18:51:18 -04:00
committed by GitHub
parent 7ca17b6bdb
commit 70ed22ccf9
2 changed files with 49 additions and 12 deletions

View File

@ -12,22 +12,23 @@ import (
"tailscale.com/util/uniq"
)
func runTests(t *testing.T, cb func(*[]int)) {
func runTests(t *testing.T, cb func(*[]uint32)) {
tests := []struct {
in []int
want []int
// Use uint32 to be different from an int-typed slice index
in []uint32
want []uint32
}{
{in: []int{0, 1, 2}, want: []int{0, 1, 2}},
{in: []int{0, 1, 2, 2}, want: []int{0, 1, 2}},
{in: []int{0, 0, 1, 2}, want: []int{0, 1, 2}},
{in: []int{0, 1, 0, 2}, want: []int{0, 1, 0, 2}},
{in: []int{0}, want: []int{0}},
{in: []int{0, 0}, want: []int{0}},
{in: []int{}, want: []int{}},
{in: []uint32{0, 1, 2}, want: []uint32{0, 1, 2}},
{in: []uint32{0, 1, 2, 2}, want: []uint32{0, 1, 2}},
{in: []uint32{0, 0, 1, 2}, want: []uint32{0, 1, 2}},
{in: []uint32{0, 1, 0, 2}, want: []uint32{0, 1, 0, 2}},
{in: []uint32{0}, want: []uint32{0}},
{in: []uint32{0, 0}, want: []uint32{0}},
{in: []uint32{}, want: []uint32{}},
}
for _, test := range tests {
in := make([]int, len(test.in))
in := make([]uint32, len(test.in))
copy(in, test.in)
cb(&test.in)
if !reflect.DeepEqual(test.in, test.want) {
@ -44,11 +45,19 @@ func runTests(t *testing.T, cb func(*[]int)) {
}
func TestModifySlice(t *testing.T) {
runTests(t, func(slice *[]int) {
runTests(t, func(slice *[]uint32) {
uniq.ModifySlice(slice)
})
}
func TestModifySliceFunc(t *testing.T) {
runTests(t, func(slice *[]uint32) {
uniq.ModifySliceFunc(slice, func(i, j uint32) bool {
return i == j
})
})
}
func Benchmark(b *testing.B) {
benches := []struct {
name string