The open source OpenXR runtime
1// Copyright 2021-2022, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief u_id_ringbuffer collection tests.
6 * @author Rylie Pavlik <rylie.pavlik@collabora.com>
7 */
8
9#include <util/u_id_ringbuffer.h>
10
11
12
13#include "catch_amalgamated.hpp"
14
15
16TEST_CASE("u_template_historybuf")
17{
18 auto *buffer = u_id_ringbuffer_create(4);
19 SECTION("behavior when empty")
20 {
21 CHECK(u_id_ringbuffer_is_empty(buffer));
22 CHECK(0 == u_id_ringbuffer_get_size(buffer));
23 uint64_t out_id = 0;
24 CHECK(u_id_ringbuffer_get_front(buffer, &out_id) < 0);
25 CHECK(u_id_ringbuffer_get_back(buffer, &out_id) < 0);
26
27 {
28 INFO("Check after pop_back");
29 u_id_ringbuffer_pop_back(buffer);
30 CHECK(u_id_ringbuffer_is_empty(buffer));
31 }
32 }
33 SECTION("behavior with one")
34 {
35 int64_t zero_inner_index = u_id_ringbuffer_push_back(buffer, 0);
36 REQUIRE(zero_inner_index >= 0);
37 CHECK_FALSE(u_id_ringbuffer_is_empty(buffer));
38 CHECK(1 == u_id_ringbuffer_get_size(buffer));
39 CAPTURE(zero_inner_index);
40
41
42 // check front/back
43 uint64_t out_id_front = 55;
44 uint64_t out_id_back = 55;
45 CHECK(u_id_ringbuffer_get_front(buffer, &out_id_front) >= 0);
46 CHECK(u_id_ringbuffer_get_front(buffer, &out_id_front) == zero_inner_index);
47 CHECK(out_id_front == 0);
48 CHECK(u_id_ringbuffer_get_back(buffer, &out_id_back) >= 0);
49 CHECK(u_id_ringbuffer_get_back(buffer, &out_id_front) == zero_inner_index);
50 CHECK(out_id_back == 0);
51 CHECK(out_id_front == out_id_back);
52
53 // check contents
54 {
55 uint64_t out_id = 55;
56 CHECK(u_id_ringbuffer_get_at_index(buffer, 0, &out_id) == zero_inner_index);
57 CHECK(out_id == 0);
58 }
59 {
60 uint64_t out_id = 55;
61 CHECK(u_id_ringbuffer_get_at_age(buffer, 0, &out_id) == zero_inner_index);
62 CHECK(out_id == 0);
63 }
64 {
65 uint64_t out_id = 55;
66 CHECK(u_id_ringbuffer_get_at_clamped_age(buffer, 0, &out_id) == zero_inner_index);
67 CHECK(out_id == 0);
68 }
69 {
70 uint64_t out_id = 55;
71 CHECK(u_id_ringbuffer_get_at_age(buffer, 1, &out_id) < 0);
72 }
73 {
74 uint64_t out_id = 55;
75 CHECK(u_id_ringbuffer_get_at_clamped_age(buffer, 1, &out_id) == zero_inner_index);
76 CHECK(out_id == 0);
77 }
78 {
79 uint64_t out_id = 55;
80 CHECK(u_id_ringbuffer_get_at_clamped_age(buffer, 2, &out_id) == zero_inner_index);
81 CHECK(out_id == 0);
82 }
83
84 {
85 INFO("Check after pop_back");
86 u_id_ringbuffer_pop_back(buffer);
87
88 CHECK(u_id_ringbuffer_is_empty(buffer));
89
90 u_id_ringbuffer_pop_back(buffer);
91 CHECK(u_id_ringbuffer_is_empty(buffer));
92 }
93 }
94
95 SECTION("behavior with two")
96 {
97 int64_t zero_inner_index = u_id_ringbuffer_push_back(buffer, 0);
98 int64_t one_inner_index = u_id_ringbuffer_push_back(buffer, 1);
99 REQUIRE(zero_inner_index >= 0);
100 REQUIRE(one_inner_index >= 0);
101 REQUIRE(zero_inner_index != one_inner_index);
102 CAPTURE(zero_inner_index);
103 CAPTURE(one_inner_index);
104 CHECK_FALSE(u_id_ringbuffer_is_empty(buffer));
105 CHECK(2 == u_id_ringbuffer_get_size(buffer));
106
107 SECTION("check front and back")
108 {
109 // check front/back
110 uint64_t out_id_front = 55;
111 uint64_t out_id_back = 55;
112 CHECK(u_id_ringbuffer_get_front(buffer, &out_id_front) == zero_inner_index);
113 CHECK(out_id_front == 0);
114 CHECK(u_id_ringbuffer_get_back(buffer, &out_id_back) == one_inner_index);
115 CHECK(out_id_back == 1);
116 CHECK(out_id_front != out_id_back);
117 }
118 SECTION("check contents")
119 {
120 // check contents
121 {
122 uint64_t out_id = 55;
123 CHECK(u_id_ringbuffer_get_at_index(buffer, 0, &out_id) == zero_inner_index);
124 CHECK(out_id == 0);
125 }
126 {
127 uint64_t out_id = 55;
128 CHECK(u_id_ringbuffer_get_at_index(buffer, 1, &out_id) == one_inner_index);
129 CHECK(out_id == 1);
130 }
131 {
132 uint64_t out_id = 55;
133 CHECK(u_id_ringbuffer_get_at_index(buffer, 2, &out_id) < 0);
134 }
135
136 {
137 uint64_t out_id = 55;
138 CHECK(u_id_ringbuffer_get_at_age(buffer, 0, &out_id) == one_inner_index);
139 CHECK(out_id == 1);
140 }
141 {
142 uint64_t out_id = 55;
143 CHECK(u_id_ringbuffer_get_at_clamped_age(buffer, 0, &out_id) == one_inner_index);
144 CHECK(out_id == 1);
145 }
146
147 {
148 uint64_t out_id = 55;
149 CHECK(u_id_ringbuffer_get_at_age(buffer, 1, &out_id) == zero_inner_index);
150 CHECK(out_id == 0);
151 }
152 {
153 uint64_t out_id = 55;
154 CHECK(u_id_ringbuffer_get_at_clamped_age(buffer, 1, &out_id) == zero_inner_index);
155 CHECK(out_id == 0);
156 }
157
158 {
159 uint64_t out_id = 55;
160 CHECK(u_id_ringbuffer_get_at_age(buffer, 2, &out_id) < 0);
161 }
162 {
163 uint64_t out_id = 55;
164 CHECK(u_id_ringbuffer_get_at_clamped_age(buffer, 2, &out_id) == zero_inner_index);
165 CHECK(out_id == 0);
166 }
167 {
168 uint64_t out_id = 55;
169 CHECK(u_id_ringbuffer_get_at_clamped_age(buffer, 3, &out_id) == zero_inner_index);
170 CHECK(out_id == 0);
171 }
172 }
173 SECTION("Check after pop_back")
174 {
175 u_id_ringbuffer_pop_back(buffer);
176 CHECK(1 == u_id_ringbuffer_get_size(buffer));
177 uint64_t out_id_front = 55;
178 CHECK(u_id_ringbuffer_get_front(buffer, &out_id_front) == zero_inner_index);
179 CHECK(out_id_front == 0);
180
181 u_id_ringbuffer_pop_back(buffer);
182 CHECK(0 == u_id_ringbuffer_get_size(buffer));
183 uint64_t out_id = 0;
184 CHECK(u_id_ringbuffer_get_front(buffer, &out_id) < 0);
185 }
186 }
187
188 SECTION("algorithm behavior with 3")
189 {
190 int64_t zero_inner_index = u_id_ringbuffer_push_back(buffer, 0);
191 int64_t two_inner_index = u_id_ringbuffer_push_back(buffer, 2);
192 int64_t four_inner_index = u_id_ringbuffer_push_back(buffer, 4);
193 REQUIRE(zero_inner_index >= 0);
194 REQUIRE(two_inner_index >= 0);
195 REQUIRE(four_inner_index >= 0);
196 CAPTURE(zero_inner_index);
197 CAPTURE(two_inner_index);
198 CAPTURE(four_inner_index);
199 CHECK_FALSE(u_id_ringbuffer_is_empty(buffer));
200 CHECK(3 == u_id_ringbuffer_get_size(buffer));
201
202 uint64_t out_id = 55;
203 uint32_t out_index = 55;
204 CHECK(u_id_ringbuffer_find_id_unordered(buffer, 0, nullptr, nullptr) == zero_inner_index);
205 CHECK(u_id_ringbuffer_find_id_unordered(buffer, 0, &out_id, &out_index) == zero_inner_index);
206 CHECK(out_id == 0);
207 CHECK(out_index == 0);
208
209 CHECK(u_id_ringbuffer_find_id_unordered(buffer, 2, nullptr, nullptr) == two_inner_index);
210 CHECK(u_id_ringbuffer_find_id_unordered(buffer, 2, &out_id, &out_index) == two_inner_index);
211 CHECK(out_id == 2);
212 CHECK(out_index == 1);
213
214 CHECK(u_id_ringbuffer_find_id_unordered(buffer, 4, nullptr, nullptr) == four_inner_index);
215 CHECK(u_id_ringbuffer_find_id_unordered(buffer, 4, &out_id, &out_index) == four_inner_index);
216 CHECK(out_id == 4);
217 CHECK(out_index == 2);
218
219 // first id not less than 1 is id 2.
220 out_id = 55;
221 out_index = 55;
222 CHECK(u_id_ringbuffer_lower_bound_id(buffer, 1, nullptr, nullptr) == two_inner_index);
223 CHECK(u_id_ringbuffer_lower_bound_id(buffer, 1, &out_id, &out_index) == two_inner_index);
224 CHECK(out_id == 2);
225 CHECK(out_index == 1);
226 }
227 u_id_ringbuffer_destroy(&buffer);
228}