1package seq
2
3import (
4	"testing"
5
6	"github.com/blend/go-sdk/assert"
7)
8
9func TestBuffer(t *testing.T) {
10	assert := assert.New(t)
11
12	buffer := NewBuffer()
13
14	buffer.Enqueue(1)
15	assert.Equal(1, buffer.Len())
16	assert.Equal(1, buffer.Peek())
17	assert.Equal(1, buffer.PeekBack())
18
19	buffer.Enqueue(2)
20	assert.Equal(2, buffer.Len())
21	assert.Equal(1, buffer.Peek())
22	assert.Equal(2, buffer.PeekBack())
23
24	buffer.Enqueue(3)
25	assert.Equal(3, buffer.Len())
26	assert.Equal(1, buffer.Peek())
27	assert.Equal(3, buffer.PeekBack())
28
29	buffer.Enqueue(4)
30	assert.Equal(4, buffer.Len())
31	assert.Equal(1, buffer.Peek())
32	assert.Equal(4, buffer.PeekBack())
33
34	buffer.Enqueue(5)
35	assert.Equal(5, buffer.Len())
36	assert.Equal(1, buffer.Peek())
37	assert.Equal(5, buffer.PeekBack())
38
39	buffer.Enqueue(6)
40	assert.Equal(6, buffer.Len())
41	assert.Equal(1, buffer.Peek())
42	assert.Equal(6, buffer.PeekBack())
43
44	buffer.Enqueue(7)
45	assert.Equal(7, buffer.Len())
46	assert.Equal(1, buffer.Peek())
47	assert.Equal(7, buffer.PeekBack())
48
49	buffer.Enqueue(8)
50	assert.Equal(8, buffer.Len())
51	assert.Equal(1, buffer.Peek())
52	assert.Equal(8, buffer.PeekBack())
53
54	value := buffer.Dequeue()
55	assert.Equal(1, value)
56	assert.Equal(7, buffer.Len())
57	assert.Equal(2, buffer.Peek())
58	assert.Equal(8, buffer.PeekBack())
59
60	value = buffer.Dequeue()
61	assert.Equal(2, value)
62	assert.Equal(6, buffer.Len())
63	assert.Equal(3, buffer.Peek())
64	assert.Equal(8, buffer.PeekBack())
65
66	value = buffer.Dequeue()
67	assert.Equal(3, value)
68	assert.Equal(5, buffer.Len())
69	assert.Equal(4, buffer.Peek())
70	assert.Equal(8, buffer.PeekBack())
71
72	value = buffer.Dequeue()
73	assert.Equal(4, value)
74	assert.Equal(4, buffer.Len())
75	assert.Equal(5, buffer.Peek())
76	assert.Equal(8, buffer.PeekBack())
77
78	value = buffer.Dequeue()
79	assert.Equal(5, value)
80	assert.Equal(3, buffer.Len())
81	assert.Equal(6, buffer.Peek())
82	assert.Equal(8, buffer.PeekBack())
83
84	value = buffer.Dequeue()
85	assert.Equal(6, value)
86	assert.Equal(2, buffer.Len())
87	assert.Equal(7, buffer.Peek())
88	assert.Equal(8, buffer.PeekBack())
89
90	value = buffer.Dequeue()
91	assert.Equal(7, value)
92	assert.Equal(1, buffer.Len())
93	assert.Equal(8, buffer.Peek())
94	assert.Equal(8, buffer.PeekBack())
95
96	value = buffer.Dequeue()
97	assert.Equal(8, value)
98	assert.Equal(0, buffer.Len())
99	assert.Zero(buffer.Peek())
100	assert.Zero(buffer.PeekBack())
101}
102
103func TestBufferClear(t *testing.T) {
104	assert := assert.New(t)
105
106	buffer := NewBuffer()
107	buffer.Enqueue(1)
108	buffer.Enqueue(1)
109	buffer.Enqueue(1)
110	buffer.Enqueue(1)
111	buffer.Enqueue(1)
112	buffer.Enqueue(1)
113	buffer.Enqueue(1)
114	buffer.Enqueue(1)
115
116	assert.Equal(8, buffer.Len())
117
118	buffer.Clear()
119	assert.Equal(0, buffer.Len())
120	assert.Zero(buffer.Peek())
121	assert.Zero(buffer.PeekBack())
122}
123
124func TestBufferArray(t *testing.T) {
125	assert := assert.New(t)
126
127	buffer := NewBuffer()
128	buffer.Enqueue(1)
129	buffer.Enqueue(2)
130	buffer.Enqueue(3)
131	buffer.Enqueue(4)
132	buffer.Enqueue(5)
133
134	contents := buffer.Array()
135	assert.Len(5, contents)
136	assert.Equal(1, contents[0])
137	assert.Equal(2, contents[1])
138	assert.Equal(3, contents[2])
139	assert.Equal(4, contents[3])
140	assert.Equal(5, contents[4])
141}
142
143func TestBufferEach(t *testing.T) {
144	assert := assert.New(t)
145
146	buffer := NewBuffer()
147
148	for x := 1; x < 17; x++ {
149		buffer.Enqueue(float64(x))
150	}
151
152	called := 0
153	buffer.Each(func(_ int, v float64) {
154		if v == float64(called+1) {
155			called++
156		}
157	})
158
159	assert.Equal(16, called)
160}
161
162func TestNewBuffer(t *testing.T) {
163	assert := assert.New(t)
164
165	empty := NewBuffer()
166	assert.NotNil(empty)
167	assert.Zero(empty.Len())
168	assert.Equal(bufferDefaultCapacity, empty.Capacity())
169	assert.Zero(empty.Peek())
170	assert.Zero(empty.PeekBack())
171}
172
173func TestNewBufferWithValues(t *testing.T) {
174	assert := assert.New(t)
175
176	values := NewBuffer(1, 2, 3, 4, 5)
177	assert.NotNil(values)
178	assert.Equal(5, values.Len())
179	assert.Equal(1, values.Peek())
180	assert.Equal(5, values.PeekBack())
181}
182
183func TestBufferGrowth(t *testing.T) {
184	assert := assert.New(t)
185
186	values := NewBuffer(1, 2, 3, 4, 5)
187	for i := 0; i < 1<<10; i++ {
188		values.Enqueue(float64(i))
189	}
190
191	assert.Equal(1<<10-1, values.PeekBack())
192}
193