The open source OpenXR runtime
at main 6.8 kB view raw
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}