circular-buffer-test.cc
3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// sherpa-onnx/csrc/circular-buffer-test.cc
//
// Copyright (c) 2023 Xiaomi Corporation
#include "sherpa-onnx/csrc/circular-buffer.h"
#include <vector>
#include "gtest/gtest.h"
#include "sherpa-onnx/csrc/macros.h"
namespace sherpa_onnx {
TEST(CircularBuffer, Push) {
CircularBuffer buffer(10);
EXPECT_EQ(buffer.Size(), 0);
EXPECT_EQ(buffer.Head(), 0);
EXPECT_EQ(buffer.Tail(), 0);
std::vector<float> a = {0, 1, 2, 3, 4, 5};
buffer.Push(a.data(), a.size());
EXPECT_EQ(buffer.Size(), 6);
EXPECT_EQ(buffer.Head(), 0);
EXPECT_EQ(buffer.Tail(), 6);
auto c = buffer.Get(0, a.size());
EXPECT_EQ(a.size(), c.size());
for (int32_t i = 0; i != a.size(); ++i) {
EXPECT_EQ(a[i], c[i]);
}
std::vector<float> d = {-6, -7, -8, -9};
buffer.Push(d.data(), d.size());
c = buffer.Get(a.size(), d.size());
EXPECT_EQ(d.size(), c.size());
for (int32_t i = 0; i != d.size(); ++i) {
EXPECT_EQ(d[i], c[i]);
}
}
TEST(CircularBuffer, PushAndPop) {
CircularBuffer buffer(5);
std::vector<float> a = {0, 1, 2, 3};
buffer.Push(a.data(), a.size());
EXPECT_EQ(buffer.Size(), 4);
EXPECT_EQ(buffer.Head(), 0);
EXPECT_EQ(buffer.Tail(), 4);
buffer.Pop(2);
EXPECT_EQ(buffer.Size(), 2);
EXPECT_EQ(buffer.Head(), 2);
EXPECT_EQ(buffer.Tail(), 4);
auto c = buffer.Get(2, 2);
EXPECT_EQ(c.size(), 2);
EXPECT_EQ(c[0], 2);
EXPECT_EQ(c[1], 3);
a = {10, 20, 30};
buffer.Push(a.data(), a.size());
EXPECT_EQ(buffer.Size(), 5);
EXPECT_EQ(buffer.Head(), 2);
EXPECT_EQ(buffer.Tail(), 7);
c = buffer.Get(2, 5);
EXPECT_EQ(c.size(), 5);
EXPECT_EQ(c[0], 2);
EXPECT_EQ(c[1], 3);
EXPECT_EQ(c[2], 10);
EXPECT_EQ(c[3], 20);
EXPECT_EQ(c[4], 30);
c = buffer.Get(3, 4);
EXPECT_EQ(c.size(), 4);
EXPECT_EQ(c[0], 3);
EXPECT_EQ(c[1], 10);
EXPECT_EQ(c[2], 20);
EXPECT_EQ(c[3], 30);
c = buffer.Get(4, 3);
EXPECT_EQ(c.size(), 3);
EXPECT_EQ(c[0], 10);
EXPECT_EQ(c[1], 20);
EXPECT_EQ(c[2], 30);
buffer.Pop(4);
EXPECT_EQ(buffer.Size(), 1);
EXPECT_EQ(buffer.Head(), 6);
EXPECT_EQ(buffer.Tail(), 7);
c = buffer.Get(6, 1);
EXPECT_EQ(c.size(), 1);
EXPECT_EQ(c[0], 30);
a = {100, 200, 300, 400};
buffer.Push(a.data(), a.size());
EXPECT_EQ(buffer.Size(), 5);
EXPECT_EQ(buffer.Size(), 5);
EXPECT_EQ(buffer.Head(), 6);
EXPECT_EQ(buffer.Tail(), 11);
c = buffer.Get(6, 5);
EXPECT_EQ(c.size(), 5);
EXPECT_EQ(c[0], 30);
EXPECT_EQ(c[1], 100);
EXPECT_EQ(c[2], 200);
EXPECT_EQ(c[3], 300);
EXPECT_EQ(c[4], 400);
buffer.Pop(3);
EXPECT_EQ(buffer.Size(), 2);
EXPECT_EQ(buffer.Head(), 9);
EXPECT_EQ(buffer.Tail(), 11);
c = buffer.Get(10, 1);
EXPECT_EQ(c.size(), 1);
EXPECT_EQ(c[0], 400);
a = {1000, 2000, 3000};
buffer.Push(a.data(), a.size());
EXPECT_EQ(buffer.Size(), 5);
EXPECT_EQ(buffer.Head(), 9);
EXPECT_EQ(buffer.Tail(), 14);
buffer.Pop(1);
EXPECT_EQ(buffer.Size(), 4);
EXPECT_EQ(buffer.Head(), 10);
EXPECT_EQ(buffer.Tail(), 14);
a = {4000};
buffer.Push(a.data(), a.size());
EXPECT_EQ(buffer.Size(), 5);
EXPECT_EQ(buffer.Head(), 10);
EXPECT_EQ(buffer.Tail(), 15);
c = buffer.Get(13, 2);
EXPECT_EQ(c.size(), 2);
EXPECT_EQ(c[0], 3000);
EXPECT_EQ(c[1], 4000);
}
} // namespace sherpa_onnx