Files
QuaternionEngine/third_party/fastgltf/tests/vector_tests.cpp

116 lines
3.0 KiB
C++

#include <catch2/catch_test_macros.hpp>
#include <fastgltf/types.hpp>
TEST_CASE("Verify clz", "[vector-tests]") {
REQUIRE(fastgltf::clz<std::uint8_t>(0b00000001) == 7);
REQUIRE(fastgltf::clz<std::uint8_t>(0b00000010) == 6);
REQUIRE(fastgltf::clz<std::uint8_t>(0b00000100) == 5);
REQUIRE(fastgltf::clz<std::uint8_t>(0b00001000) == 4);
REQUIRE(fastgltf::clz<std::uint8_t>(0b00010000) == 3);
REQUIRE(fastgltf::clz<std::uint8_t>(0b00100000) == 2);
REQUIRE(fastgltf::clz<std::uint8_t>(0b01000000) == 1);
REQUIRE(fastgltf::clz<std::uint8_t>(0b10000000) == 0);
}
TEST_CASE("Test resize/reserve", "[vector-tests]") {
fastgltf::SmallVector<uint32_t, 4> vec = {1, 2, 3};
REQUIRE(vec[0] == 1);
REQUIRE(vec[1] == 2);
REQUIRE(vec[2] == 3);
vec.resize(5);
REQUIRE(vec.size() == 5);
REQUIRE(vec[3] == 0);
REQUIRE(vec[4] == 0);
vec.resize(2);
REQUIRE(vec.size() == 2);
REQUIRE(vec[0] == 1);
REQUIRE(vec[1] == 2);
vec.resize(6, 4);
REQUIRE(vec.size() == 6);
for (std::size_t i = 2; i < vec.size(); ++i) {
REQUIRE(vec[i] == 4);
}
vec.reserve(8);
REQUIRE(vec.size() == 6);
REQUIRE(vec.capacity() == 8);
vec.shrink_to_fit();
REQUIRE(vec.capacity() == 6);
}
TEST_CASE("Test constructors", "[vector-tests]") {
fastgltf::SmallVector<uint32_t, 4> vec = {0, 1, 2, 3};
for (std::size_t i = 0; i < vec.size(); ++i) {
REQUIRE(vec[i] == i);
}
fastgltf::SmallVector<uint32_t, 4> vec2(vec);
for (std::size_t i = 0; i < vec2.size(); ++i) {
REQUIRE(vec2[i] == i);
}
fastgltf::SmallVector<uint32_t, 4> vec3 = std::move(vec2);
REQUIRE(vec2.empty());
vec3.resize(6);
for (std::size_t i = 0; i < 4; ++i) {
REQUIRE(vec3[i] == i);
}
REQUIRE(vec3[4] == 0);
REQUIRE(vec3[5] == 0);
}
TEST_CASE("Nested SmallVector", "[vector-tests]") {
fastgltf::SmallVector<fastgltf::SmallVector<uint32_t, 2>, 4> vectors(6, {4}); // This should heap allocate straight away.
REQUIRE(vectors.size() == 6);
for (auto& vector : vectors) {
REQUIRE(vector.size() == 1);
REQUIRE(vector.front() == 4);
vector.reserve(6);
}
}
struct RefCountedObject {
static inline std::size_t aliveObjects = 0;
RefCountedObject() {
++aliveObjects;
}
RefCountedObject(const RefCountedObject& other) {
++aliveObjects;
}
RefCountedObject(RefCountedObject&& other) = delete;
~RefCountedObject() {
--aliveObjects;
}
};
TEST_CASE("Test shrinking vectors", "[vector-tests]") {
fastgltf::SmallVector<RefCountedObject, 4> objects;
for (std::size_t i = 0; i < 4; ++i) {
objects.emplace_back();
}
REQUIRE(RefCountedObject::aliveObjects == 4);
objects.emplace_back();
REQUIRE(RefCountedObject::aliveObjects == 5);
objects.resize(4);
REQUIRE(RefCountedObject::aliveObjects == 4);
}
TEST_CASE("Test vectors with polymorphic allocators", "[vector-tests]") {
fastgltf::pmr::SmallVector<std::uint32_t, 4> ints;
ints.assign(10, 5);
REQUIRE(ints.size() == 10);
REQUIRE(ints.data() != nullptr);
for (auto& i : ints) {
REQUIRE(i == 5);
}
}