diff options
Diffstat (limited to 'src/slices/iter_test.go')
-rw-r--r-- | src/slices/iter_test.go | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/src/slices/iter_test.go b/src/slices/iter_test.go new file mode 100644 index 0000000000..67520f60c9 --- /dev/null +++ b/src/slices/iter_test.go @@ -0,0 +1,184 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package slices_test + +import ( + "iter" + "math/rand/v2" + . "slices" + "testing" +) + +func TestAll(t *testing.T) { + for size := 0; size < 10; size++ { + var s []int + for i := range size { + s = append(s, i) + } + ei, ev := 0, 0 + cnt := 0 + for i, v := range All(s) { + if i != ei || v != ev { + t.Errorf("at iteration %d got %d, %d want %d, %d", cnt, i, v, ei, ev) + } + ei++ + ev++ + cnt++ + } + if cnt != size { + t.Errorf("read %d values expected %d", cnt, size) + } + } +} + +func TestBackward(t *testing.T) { + for size := 0; size < 10; size++ { + var s []int + for i := range size { + s = append(s, i) + } + ei, ev := size-1, size-1 + cnt := 0 + for i, v := range Backward(s) { + if i != ei || v != ev { + t.Errorf("at iteration %d got %d, %d want %d, %d", cnt, i, v, ei, ev) + } + ei-- + ev-- + cnt++ + } + if cnt != size { + t.Errorf("read %d values expected %d", cnt, size) + } + } +} + +func TestValues(t *testing.T) { + for size := 0; size < 10; size++ { + var s []int + for i := range size { + s = append(s, i) + } + ev := 0 + cnt := 0 + for v := range Values(s) { + if v != ev { + t.Errorf("at iteration %d got %d want %d", cnt, v, ev) + } + ev++ + cnt++ + } + if cnt != size { + t.Errorf("read %d values expected %d", cnt, size) + } + } +} + +func testSeq(yield func(int) bool) { + for i := 0; i < 10; i += 2 { + if !yield(i) { + return + } + } +} + +var testSeqResult = []int{0, 2, 4, 6, 8} + +func TestAppendSeq(t *testing.T) { + s := AppendSeq([]int{1, 2}, testSeq) + want := append([]int{1, 2}, testSeqResult...) + if !Equal(s, want) { + t.Errorf("got %v, want %v", s, want) + } +} + +func TestCollect(t *testing.T) { + s := Collect(testSeq) + want := testSeqResult + if !Equal(s, want) { + t.Errorf("got %v, want %v", s, want) + } +} + +var iterTests = [][]string{ + nil, + {"a"}, + {"a", "b"}, + {"b", "a"}, + strs[:], +} + +func TestValuesAppendSeq(t *testing.T) { + for _, prefix := range iterTests { + for _, s := range iterTests { + got := AppendSeq(prefix, Values(s)) + want := append(prefix, s...) + if !Equal(got, want) { + t.Errorf("AppendSeq(%v, Values(%v)) == %v, want %v", prefix, s, got, want) + } + } + } +} + +func TestValuesCollect(t *testing.T) { + for _, s := range iterTests { + got := Collect(Values(s)) + if !Equal(got, s) { + t.Errorf("Collect(Values(%v)) == %v, want %v", s, got, s) + } + } +} + +func TestSorted(t *testing.T) { + s := Sorted(Values(ints[:])) + if !IsSorted(s) { + t.Errorf("sorted %v", ints) + t.Errorf(" got %v", s) + } +} + +func TestSortedFunc(t *testing.T) { + s := SortedFunc(Values(ints[:]), func(a, b int) int { return a - b }) + if !IsSorted(s) { + t.Errorf("sorted %v", ints) + t.Errorf(" got %v", s) + } +} + +func TestSortedStableFunc(t *testing.T) { + n, m := 1000, 100 + data := make(intPairs, n) + for i := range data { + data[i].a = rand.IntN(m) + } + data.initB() + + s := intPairs(SortedStableFunc(Values(data), intPairCmp)) + if !IsSortedFunc(s, intPairCmp) { + t.Errorf("SortedStableFunc didn't sort %d ints", n) + } + if !s.inOrder(false) { + t.Errorf("SortedStableFunc wasn't stable on %d ints", n) + } + + // iterVal converts a Seq2 to a Seq. + iterVal := func(seq iter.Seq2[int, intPair]) iter.Seq[intPair] { + return func(yield func(intPair) bool) { + for _, v := range seq { + if !yield(v) { + return + } + } + } + } + + s = intPairs(SortedStableFunc(iterVal(Backward(data)), intPairCmp)) + if !IsSortedFunc(s, intPairCmp) { + t.Errorf("SortedStableFunc didn't sort %d reverse ints", n) + } + if !s.inOrder(true) { + t.Errorf("SortedStableFunc wasn't stable on %d reverse ints", n) + } +} |