@@ -17,47 +17,211 @@ limitations under the License.
1717package buffer
1818
1919import (
20- "reflect"
2120 "testing"
2221)
2322
24- func TestGrowth (t * testing.T ) {
23+ func TestGrowthGrowing (t * testing.T ) {
2524 t .Parallel ()
26- x := 10
27- g := NewRingGrowing (1 )
28- for i := 0 ; i < x ; i ++ {
29- if e , a := i , g .readable ; ! reflect .DeepEqual (e , a ) {
30- t .Fatalf ("expected equal, got %#v, %#v" , e , a )
31- }
32- g .WriteOne (i )
33- }
34- read := 0
35- for g .readable > 0 {
36- v , ok := g .ReadOne ()
37- if ! ok {
38- t .Fatal ("expected true" )
39- }
40- if read != v {
41- t .Fatalf ("expected %#v==%#v" , read , v )
42- }
43- read ++
25+ tests := map [string ]struct {
26+ ring * TypedRingGrowing [int ]
27+ initialSize int
28+ }{
29+ "implicit-zero" : {
30+ ring : new (TypedRingGrowing [int ]),
31+ },
32+ "explicit-zero" : {
33+ ring : NewTypedRingGrowing [int ](RingGrowingOptions {InitialSize : 0 }),
34+ initialSize : 0 ,
35+ },
36+ "nonzero" : {
37+ ring : NewTypedRingGrowing [int ](RingGrowingOptions {InitialSize : 1 }),
38+ initialSize : 1 ,
39+ },
4440 }
45- if x != read {
46- t .Fatalf ("expected to have read %d items: %d" , x , read )
41+
42+ for name , test := range tests {
43+ t .Run (name , func (t * testing.T ) {
44+ initialSize := test .initialSize
45+ g := test .ring
46+
47+ if expected , actual := 0 , g .Len (); expected != actual {
48+ t .Fatalf ("expected Len to be %d, got %d" , expected , actual )
49+ }
50+ if expected , actual := initialSize , g .Cap (); expected != actual {
51+ t .Fatalf ("expected Cap to be %d, got %d" , expected , actual )
52+ }
53+
54+ x := 10
55+ for i := 0 ; i < x ; i ++ {
56+ if e , a := i , g .readable ; e != a {
57+ t .Fatalf ("expected equal, got %#v, %#v" , e , a )
58+ }
59+ g .WriteOne (i )
60+ }
61+
62+ if expected , actual := x , g .Len (); expected != actual {
63+ t .Fatalf ("expected Len to be %d, got %d" , expected , actual )
64+ }
65+ if expected , actual := 16 , g .Cap (); expected != actual {
66+ t .Fatalf ("expected Cap to be %d, got %d" , expected , actual )
67+ }
68+
69+ read := 0
70+ for g .readable > 0 {
71+ v , ok := g .ReadOne ()
72+ if ! ok {
73+ t .Fatal ("expected true" )
74+ }
75+ if read != v {
76+ t .Fatalf ("expected %#v==%#v" , read , v )
77+ }
78+ read ++
79+ }
80+ if x != read {
81+ t .Fatalf ("expected to have read %d items: %d" , x , read )
82+ }
83+ if expected , actual := 0 , g .Len (); expected != actual {
84+ t .Fatalf ("expected Len to be %d, got %d" , expected , actual )
85+ }
86+ if expected , actual := 16 , g .Cap (); expected != actual {
87+ t .Fatalf ("expected Cap to be %d, got %d" , expected , actual )
88+ }
89+ })
4790 }
48- if g .readable != 0 {
49- t .Fatalf ("expected readable to be zero: %d" , g .readable )
91+
92+ }
93+
94+ func TestGrowth (t * testing.T ) {
95+ t .Parallel ()
96+
97+ tests := map [string ]struct {
98+ ring * Ring [int ]
99+ initialSize int
100+ normalSize int
101+ }{
102+ "implicit-zero" : {
103+ ring : new (Ring [int ]),
104+ },
105+ "explicit-zero" : {
106+ ring : NewRing [int ](RingOptions {InitialSize : 0 , NormalSize : 0 }),
107+ initialSize : 0 ,
108+ normalSize : 0 ,
109+ },
110+ "smaller-initial-size" : {
111+ ring : NewRing [int ](RingOptions {InitialSize : 1 , NormalSize : 2 }),
112+ initialSize : 1 ,
113+ normalSize : 2 ,
114+ },
115+ "smaller-normal-size" : {
116+ ring : NewRing [int ](RingOptions {InitialSize : 2 , NormalSize : 1 }),
117+ initialSize : 2 ,
118+ normalSize : 1 ,
119+ },
50120 }
51- if 16 != g .n {
52- t .Fatalf ("expected N to be 16: %d" , g .n )
121+
122+ for name , test := range tests {
123+ t .Run (name , func (t * testing.T ) {
124+ initialSize := test .initialSize
125+ normalSize := test .normalSize
126+ g := test .ring
127+
128+ if expected , actual := 0 , g .Len (); expected != actual {
129+ t .Fatalf ("expected Len to be %d, got %d" , expected , actual )
130+ }
131+ if expected , actual := initialSize , g .Cap (); expected != actual {
132+ t .Fatalf ("expected Cap to be %d, got %d" , expected , actual )
133+ }
134+
135+ x := 10
136+ for i := 0 ; i < x ; i ++ {
137+ if e , a := i , g .growing .readable ; e != a {
138+ t .Fatalf ("expected equal, got %#v, %#v" , e , a )
139+ }
140+ g .WriteOne (i )
141+ }
142+
143+ if expected , actual := x , g .Len (); expected != actual {
144+ t .Fatalf ("expected Len to be %d, got %d" , expected , actual )
145+ }
146+ if expected , actual := 16 , g .Cap (); expected != actual {
147+ t .Fatalf ("expected Cap to be %d, got %d" , expected , actual )
148+ }
149+
150+ read := 0
151+ for g .growing .readable > 0 {
152+ v , ok := g .ReadOne ()
153+ if ! ok {
154+ t .Fatal ("expected true" )
155+ }
156+ if read != v {
157+ t .Fatalf ("expected %#v==%#v" , read , v )
158+ }
159+ read ++
160+ }
161+ if x != read {
162+ t .Fatalf ("expected to have read %d items: %d" , x , read )
163+ }
164+ if expected , actual := 0 , g .Len (); expected != actual {
165+ t .Fatalf ("expected Len to be %d, got %d" , expected , actual )
166+ }
167+ if expected , actual := normalSize , g .Cap (); expected != actual {
168+ t .Fatalf ("expected Cap to be %d, got %d" , expected , actual )
169+ }
170+ })
53171 }
54172}
55173
56174func TestEmpty (t * testing.T ) {
57175 t .Parallel ()
58- g := NewRingGrowing ( 1 )
176+ g := NewTypedRingGrowing [ struct {}]( RingGrowingOptions { InitialSize : 1 } )
59177 _ , ok := g .ReadOne ()
60178 if ok != false {
61179 t .Fatal ("expected false" )
62180 }
63181}
182+
183+ const (
184+ spikeSize = 100 // Number of items to write during a spike
185+ normalSize = 64 // Normal capacity for the Ring type after shrinking
186+ initialSize = 16 // Initial capacity for buffers
187+ )
188+
189+ func BenchmarkTypedRingGrowing_Spike (b * testing.B ) {
190+ b .ReportAllocs ()
191+ var item int // ensure item is used
192+
193+ for i := 0 ; i < b .N ; i ++ {
194+ buffer := NewTypedRingGrowing [int ](RingGrowingOptions {InitialSize : initialSize })
195+
196+ for j := 0 ; j < spikeSize ; j ++ {
197+ buffer .WriteOne (j )
198+ }
199+
200+ for buffer .Len () > 0 {
201+ item , _ = buffer .ReadOne ()
202+ }
203+ }
204+ _ = item // use item
205+ }
206+
207+ func BenchmarkRing_Spike_And_Shrink (b * testing.B ) {
208+ b .ReportAllocs ()
209+ var item int // ensure item is used
210+
211+ for i := 0 ; i < b .N ; i ++ {
212+ // Create a new buffer for each benchmark iteration
213+ buffer := NewRing [int ](RingOptions {
214+ InitialSize : initialSize ,
215+ NormalSize : normalSize ,
216+ })
217+
218+ for j := 0 ; j < spikeSize ; j ++ {
219+ buffer .WriteOne (j )
220+ }
221+
222+ for buffer .Len () > 0 {
223+ item , _ = buffer .ReadOne ()
224+ }
225+ }
226+ _ = item // use item
227+ }
0 commit comments