1package csync
2
3import (
4 "sync/atomic"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/assert"
9)
10
11func TestLazySlice_Iter(t *testing.T) {
12 t.Parallel()
13
14 data := []string{"a", "b", "c"}
15 s := NewLazySlice(func() []string {
16 // TODO: use synctest when new Go is out.
17 time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
18 return data
19 })
20
21 var result []string
22 for v := range s.Iter() {
23 result = append(result, v)
24 }
25
26 assert.Equal(t, data, result)
27}
28
29func TestLazySlice_IterWaitsForLoading(t *testing.T) {
30 t.Parallel()
31
32 var loaded atomic.Bool
33 data := []string{"x", "y", "z"}
34
35 s := NewLazySlice(func() []string {
36 // TODO: use synctest when new Go is out.
37 time.Sleep(100 * time.Millisecond)
38 loaded.Store(true)
39 return data
40 })
41
42 assert.False(t, loaded.Load(), "should not be loaded immediately")
43
44 var result []string
45 for v := range s.Iter() {
46 result = append(result, v)
47 }
48
49 assert.True(t, loaded.Load(), "should be loaded after Iter")
50 assert.Equal(t, data, result)
51}
52
53func TestLazySlice_EmptySlice(t *testing.T) {
54 t.Parallel()
55
56 s := NewLazySlice(func() []string {
57 return []string{}
58 })
59
60 var result []string
61 for v := range s.Iter() {
62 result = append(result, v)
63 }
64
65 assert.Empty(t, result)
66}
67
68func TestLazySlice_EarlyBreak(t *testing.T) {
69 t.Parallel()
70
71 data := []string{"a", "b", "c", "d", "e"}
72 s := NewLazySlice(func() []string {
73 time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
74 return data
75 })
76
77 var result []string
78 for v := range s.Iter() {
79 result = append(result, v)
80 if len(result) == 2 {
81 break
82 }
83 }
84
85 assert.Equal(t, []string{"a", "b"}, result)
86}