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		// TODO: use synctest when new Go is out.
74		time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
75		return data
76	})
77
78	var result []string
79	for v := range s.Iter() {
80		result = append(result, v)
81		if len(result) == 2 {
82			break
83		}
84	}
85
86	assert.Equal(t, []string{"a", "b"}, result)
87}