11 "github.com/stretchr/testify/require"
14func TestLazySlice_Seq(t *testing.T) {
17 synctest.Test(t, func(t *testing.T) {
19 data := []string{"a", "b", "c"}
20 s := NewLazySlice(func() []string {
21 time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
24 require.Equal(t, data, slices.Collect(s.Seq()))
28func TestLazySlice_SeqWaitsForLoading(t *testing.T) {
30 synctest.Test(t, func(t *testing.T) {
33 var loaded atomic.Bool
34 data := []string{"x", "y", "z"}
36 s := NewLazySlice(func() []string {
37 time.Sleep(100 * time.Millisecond)
42 require.False(t, loaded.Load(), "should not be loaded immediately")
43 require.Equal(t, data, slices.Collect(s.Seq()))
44 require.True(t, loaded.Load(), "should be loaded after Seq")
48func TestLazySlice_EmptySlice(t *testing.T) {
50 s := NewLazySlice(func() []string {
53 require.Empty(t, slices.Collect(s.Seq()))
56func TestLazySlice_EarlyBreak(t *testing.T) {
59 synctest.Test(t, func(t *testing.T) {
61 data := []string{"a", "b", "c", "d", "e"}
62 s := NewLazySlice(func() []string {
63 time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
68 for v := range s.Seq() {
69 result = append(result, v)
75 require.Equal(t, []string{"a", "b"}, result)
79func TestSlice(t *testing.T) {
80 t.Run("NewSlice", func(t *testing.T) {
82 require.Equal(t, 0, s.Len())
85 t.Run("NewSliceFrom", func(t *testing.T) {
86 original := []int{1, 2, 3}
87 s := NewSliceFrom(original)
88 require.Equal(t, 3, s.Len())
90 // Verify it's a copy, not a reference
94 require.Equal(t, 1, val)
97 t.Run("Append", func(t *testing.T) {
98 s := NewSlice[string]()
102 require.Equal(t, 2, s.Len())
105 require.Equal(t, "hello", val)
109 require.Equal(t, "world", val)
112 t.Run("Prepend", func(t *testing.T) {
113 s := NewSlice[string]()
117 require.Equal(t, 2, s.Len())
120 require.Equal(t, "hello", val)
124 require.Equal(t, "world", val)
127 t.Run("Delete", func(t *testing.T) {
128 s := NewSliceFrom([]int{1, 2, 3, 4, 5})
130 // Delete middle element
133 require.Equal(t, 4, s.Len())
135 expected := []int{1, 2, 4, 5}
136 actual := slices.Collect(s.Seq())
137 require.Equal(t, expected, actual)
139 // Delete out of bounds
142 require.Equal(t, 4, s.Len())
144 // Delete negative index
147 require.Equal(t, 4, s.Len())
150 t.Run("Get", func(t *testing.T) {
151 s := NewSliceFrom([]string{"a", "b", "c"})
155 require.Equal(t, "b", val)
166 t.Run("Set", func(t *testing.T) {
167 s := NewSliceFrom([]string{"a", "b", "c"})
169 ok := s.Set(1, "modified")
174 require.Equal(t, "modified", val)
177 ok = s.Set(10, "invalid")
181 ok = s.Set(-1, "invalid")
185 t.Run("SetSlice", func(t *testing.T) {
190 newItems := []int{10, 20, 30}
193 require.Equal(t, 3, s.Len())
194 require.Equal(t, newItems, slices.Collect(s.Seq()))
196 // Verify it's a copy
200 require.Equal(t, 10, val)
203 t.Run("Slice", func(t *testing.T) {
204 original := []int{1, 2, 3}
205 s := NewSliceFrom(original)
207 copied := slices.Collect(s.Seq())
208 require.Equal(t, original, copied)
210 // Verify it's a copy
214 require.Equal(t, 1, val)
217 t.Run("Seq", func(t *testing.T) {
218 s := NewSliceFrom([]int{1, 2, 3})
221 for v := range s.Seq() {
222 result = append(result, v)
225 require.Equal(t, []int{1, 2, 3}, result)
228 t.Run("SeqWithIndex", func(t *testing.T) {
229 s := NewSliceFrom([]string{"a", "b", "c"})
233 for i, v := range s.Seq2() {
234 indices = append(indices, i)
235 values = append(values, v)
238 require.Equal(t, []int{0, 1, 2}, indices)
239 require.Equal(t, []string{"a", "b", "c"}, values)
242 t.Run("ConcurrentAccess", func(t *testing.T) {
244 const numGoroutines = 100
245 const itemsPerGoroutine = 10
247 var wg sync.WaitGroup
249 // Concurrent appends
250 for i := range numGoroutines {
254 for j := range itemsPerGoroutine {
255 s.Append(start*itemsPerGoroutine + j)
260 for range itemsPerGoroutine {
261 s.Len() // Just read the length
268 // Should have all items
269 require.Equal(t, numGoroutines*itemsPerGoroutine, s.Len())
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list