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
|
#include "../src/core/rcuList.h"
#include "../src/core/types.h"
#include <catch.hpp>
using namespace giada;
using namespace giada::m;
TEST_CASE("RCUList")
{
struct Object
{
Object(ID id) : id(id) {}
ID id;
};
RCUList<Object> list;
REQUIRE(list.size() == 0);
REQUIRE(list.changed == false);
SECTION("test push")
{
list.push(std::make_unique<Object>(1));
list.push(std::make_unique<Object>(2));
list.push(std::make_unique<Object>(3));
REQUIRE(list.size() == 3);
REQUIRE(list.changed == true);
SECTION("test retrieval")
{
RCUList<Object>::Lock l(list);
REQUIRE(list.get(0)->id == 1);
REQUIRE(list.get(1)->id == 2);
REQUIRE(list.get(2)->id == 3);
REQUIRE(list[0]->id == 1);
REQUIRE(list[1]->id == 2);
REQUIRE(list[2]->id == 3);
REQUIRE(list.back()->id == 3);
}
SECTION("test iterator")
{
RCUList<Object>::Lock l(list);
ID id = 1;
for (Object* o : list)
REQUIRE(o->id == id++);
}
SECTION("test const iterator")
{
RCUList<Object>::Lock l(list);
ID id = 1;
for (const Object* o : list)
REQUIRE(o->id == id++);
}
SECTION("test pop")
{
list.pop(0);
REQUIRE(list.size() == 2);
REQUIRE(list.changed == true);
}
SECTION("test clear")
{
list.clear();
REQUIRE(list.size() == 0);
REQUIRE(list.changed == true);
}
}
SECTION("test swap")
{
list.push(std::make_unique<Object>(1));
list.swap(std::make_unique<Object>(16));
REQUIRE(list.size() == 1);
REQUIRE(list.changed == true);
RCUList<Object>::Lock l(list);
REQUIRE(list.get(0)->id == 16);
}
}
|