aboutsummaryrefslogtreecommitdiff
path: root/src/slices/iter_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/slices/iter_test.go')
-rw-r--r--src/slices/iter_test.go184
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)
+ }
+}