Skip to content

Commit 133f6ff

Browse files
committed
Document and test buffer.TypedRing(Growing) zero values
1 parent c9c88e1 commit 133f6ff

File tree

2 files changed

+144
-87
lines changed

2 files changed

+144
-87
lines changed

buffer/ring_growing.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func NewRingGrowing(initialSize int) *RingGrowing {
3838
}
3939

4040
// TypedRingGrowing is a growing ring buffer.
41+
// The zero value has an initial size of 0 and is ready to use.
4142
// Not thread safe.
4243
type TypedRingGrowing[T any] struct {
4344
data []T
@@ -77,6 +78,9 @@ func (r *TypedRingGrowing[T]) WriteOne(data T) {
7778
if r.readable == r.n {
7879
// Time to grow
7980
newN := r.n * 2
81+
if newN == 0 {
82+
newN = 1
83+
}
8084
newData := make([]T, newN)
8185
to := r.beg + r.readable
8286
if to <= r.n {
@@ -114,6 +118,7 @@ type RingOptions struct {
114118
}
115119

116120
// Ring is a dynamically-sized ring buffer which can grow and shrink as-needed.
121+
// The zero value has an initial size and normal size of 0 and is ready to use.
117122
// Not thread safe.
118123
type Ring[T any] struct {
119124
growing TypedRingGrowing[T]

buffer/ring_growing_test.go

Lines changed: 139 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -22,100 +22,152 @@ import (
2222

2323
func TestGrowthGrowing(t *testing.T) {
2424
t.Parallel()
25-
initialSize := 1
26-
g := NewTypedRingGrowing[int](RingGrowingOptions{InitialSize: initialSize})
27-
28-
if expected, actual := 0, g.Len(); expected != actual {
29-
t.Fatalf("expected Len to be %d, got %d", expected, actual)
30-
}
31-
if expected, actual := initialSize, g.Cap(); expected != actual {
32-
t.Fatalf("expected Cap to be %d, got %d", expected, actual)
33-
}
34-
35-
x := 10
36-
for i := 0; i < x; i++ {
37-
if e, a := i, g.readable; e != a {
38-
t.Fatalf("expected equal, got %#v, %#v", e, a)
39-
}
40-
g.WriteOne(i)
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+
},
40+
}
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+
})
4190
}
4291

43-
if expected, actual := x, g.Len(); expected != actual {
44-
t.Fatalf("expected Len to be %d, got %d", expected, actual)
45-
}
46-
if expected, actual := 16, g.Cap(); expected != actual {
47-
t.Fatalf("expected Cap to be %d, got %d", expected, actual)
48-
}
49-
50-
read := 0
51-
for g.readable > 0 {
52-
v, ok := g.ReadOne()
53-
if !ok {
54-
t.Fatal("expected true")
55-
}
56-
if read != v {
57-
t.Fatalf("expected %#v==%#v", read, v)
58-
}
59-
read++
60-
}
61-
if x != read {
62-
t.Fatalf("expected to have read %d items: %d", x, read)
63-
}
64-
if expected, actual := 0, g.Len(); expected != actual {
65-
t.Fatalf("expected Len to be %d, got %d", expected, actual)
66-
}
67-
if expected, actual := 16, g.Cap(); expected != actual {
68-
t.Fatalf("expected Cap to be %d, got %d", expected, actual)
69-
}
7092
}
7193

7294
func TestGrowth(t *testing.T) {
7395
t.Parallel()
74-
initialSize := 1
75-
normalSize := 2
76-
g := NewRing[int](RingOptions{InitialSize: initialSize, NormalSize: normalSize})
7796

78-
if expected, actual := 0, g.Len(); expected != actual {
79-
t.Fatalf("expected Len to be %d, got %d", expected, actual)
80-
}
81-
if expected, actual := initialSize, g.Cap(); expected != actual {
82-
t.Fatalf("expected Cap to be %d, got %d", expected, actual)
83-
}
84-
85-
x := 10
86-
for i := 0; i < x; i++ {
87-
if e, a := i, g.growing.readable; e != a {
88-
t.Fatalf("expected equal, got %#v, %#v", e, a)
89-
}
90-
g.WriteOne(i)
91-
}
92-
93-
if expected, actual := x, g.Len(); expected != actual {
94-
t.Fatalf("expected Len to be %d, got %d", expected, actual)
95-
}
96-
if expected, actual := 16, g.Cap(); expected != actual {
97-
t.Fatalf("expected Cap to be %d, got %d", expected, actual)
98-
}
99-
100-
read := 0
101-
for g.growing.readable > 0 {
102-
v, ok := g.ReadOne()
103-
if !ok {
104-
t.Fatal("expected true")
105-
}
106-
if read != v {
107-
t.Fatalf("expected %#v==%#v", read, v)
108-
}
109-
read++
110-
}
111-
if x != read {
112-
t.Fatalf("expected to have read %d items: %d", x, read)
113-
}
114-
if expected, actual := 0, g.Len(); expected != actual {
115-
t.Fatalf("expected Len to be %d, got %d", expected, actual)
116-
}
117-
if expected, actual := normalSize, g.Cap(); expected != actual {
118-
t.Fatalf("expected Cap to be %d, got %d", expected, actual)
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+
},
120+
}
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+
})
119171
}
120172
}
121173

0 commit comments

Comments
 (0)