@@ -1,11 +1,13 @@
1package csync
1package csync
4 "sync/atomic"
5 "sync/atomic"
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/assert"
10+ "github.com/stretchr/testify/require"
11func TestLazySlice_Seq(t *testing.T) {
13func TestLazySlice_Seq(t *testing.T) {
@@ -85,3 +87,210 @@ func TestLazySlice_EarlyBreak(t *testing.T) {
86 assert.Equal(t, []string{"a", "b"}, result)
88 assert.Equal(t, []string{"a", "b"}, result)
91+func TestSlice(t *testing.T) {
92+ t.Run("NewSlice", func(t *testing.T) {
94+ assert.Equal(t, 0, s.Len())
97+ t.Run("NewSliceFrom", func(t *testing.T) {
98+ original := []int{1, 2, 3}
99+ s := NewSliceFrom(original)
100+ assert.Equal(t, 3, s.Len())
102+ // Verify it's a copy, not a reference
106+ assert.Equal(t, 1, val)
109+ t.Run("Append", func(t *testing.T) {
110+ s := NewSlice[string]()
114+ assert.Equal(t, 2, s.Len())
117+ assert.Equal(t, "hello", val)
121+ assert.Equal(t, "world", val)
124+ t.Run("Prepend", func(t *testing.T) {
125+ s := NewSlice[string]()
129+ assert.Equal(t, 2, s.Len())
132+ assert.Equal(t, "hello", val)
136+ assert.Equal(t, "world", val)
139+ t.Run("Delete", func(t *testing.T) {
140+ s := NewSliceFrom([]int{1, 2, 3, 4, 5})
142+ // Delete middle element
145+ assert.Equal(t, 4, s.Len())
147+ expected := []int{1, 2, 4, 5}
149+ assert.Equal(t, expected, actual)
151+ // Delete out of bounds
154+ assert.Equal(t, 4, s.Len())
156+ // Delete negative index
159+ assert.Equal(t, 4, s.Len())
162+ t.Run("Get", func(t *testing.T) {
163+ s := NewSliceFrom([]string{"a", "b", "c"})
167+ assert.Equal(t, "b", val)
178+ t.Run("Set", func(t *testing.T) {
179+ s := NewSliceFrom([]string{"a", "b", "c"})
181+ ok := s.Set(1, "modified")
186+ assert.Equal(t, "modified", val)
189+ ok = s.Set(10, "invalid")
193+ ok = s.Set(-1, "invalid")
197+ t.Run("SetSlice", func(t *testing.T) {
198+ s := NewSlice[int]()
202+ newItems := []int{10, 20, 30}
203+ s.SetSlice(newItems)
205+ assert.Equal(t, 3, s.Len())
206+ assert.Equal(t, newItems, s.Slice())
208+ // Verify it's a copy
212+ assert.Equal(t, 10, val)
215+ t.Run("Clear", func(t *testing.T) {
216+ s := NewSliceFrom([]int{1, 2, 3})
217+ assert.Equal(t, 3, s.Len())
220+ assert.Equal(t, 0, s.Len())
223+ t.Run("Slice", func(t *testing.T) {
224+ original := []int{1, 2, 3}
225+ s := NewSliceFrom(original)
228+ assert.Equal(t, original, copy)
230+ // Verify it's a copy
234+ assert.Equal(t, 1, val)
237+ t.Run("Seq", func(t *testing.T) {
238+ s := NewSliceFrom([]int{1, 2, 3})
241+ for v := range s.Seq() {
242+ result = append(result, v)
245+ assert.Equal(t, []int{1, 2, 3}, result)
248+ t.Run("SeqWithIndex", func(t *testing.T) {
249+ s := NewSliceFrom([]string{"a", "b", "c"})
253+ for i, v := range s.Seq2() {
254+ indices = append(indices, i)
255+ values = append(values, v)
258+ assert.Equal(t, []int{0, 1, 2}, indices)
259+ assert.Equal(t, []string{"a", "b", "c"}, values)
262+ t.Run("ConcurrentAccess", func(t *testing.T) {
263+ s := NewSlice[int]()
264+ const numGoroutines = 100
265+ const itemsPerGoroutine = 10
267+ var wg sync.WaitGroup
269+ // Concurrent appends
270+ for i := 0; i < numGoroutines; i++ {
272+ go func(start int) {
274+ for j := 0; j < itemsPerGoroutine; j++ {
275+ s.Append(start*itemsPerGoroutine + j)
281+ for i := 0; i < numGoroutines; i++ {
285+ for j := 0; j < itemsPerGoroutine; j++ {
286+ s.Len() // Just read the length
293+ // Should have all items
294+ assert.Equal(t, numGoroutines*itemsPerGoroutine, s.Len())