diffblue-cbmc/unit/util/small_shared_n_way_ptr.cpp

195 lines
3.9 KiB
C++

/// Author: Daniel Poetzl
/// \file Tests for small shared n-way pointer
#include <testing-utils/use_catch.h>
#include <util/small_shared_n_way_ptr.h>
bool data1_destructed = false;
bool data2_destructed = false;
bool data3_destructed = false;
class data1t : public small_shared_n_way_pointee_baset<2, unsigned>
{
public:
data1t() = default;
explicit data1t(int i) : d1(i)
{
}
~data1t()
{
data1_destructed = true;
}
int d1;
};
class data2t : public small_shared_n_way_pointee_baset<2, unsigned>
{
public:
data2t() = default;
explicit data2t(int i) : d2(i)
{
}
~data2t()
{
data2_destructed = true;
}
int d2;
};
class data3t : public small_shared_n_way_pointee_baset<3, unsigned>
{
public:
~data3t()
{
data3_destructed = true;
}
};
TEST_CASE("Small shared n-way pointer", "[core][util]")
{
typedef small_shared_n_way_ptrt<data1t, data2t> spt;
SECTION("Types")
{
spt sp1;
spt sp2 = spt::create_small_shared_n_way_ptr<0>(new data1t());
spt sp3 = spt::create_small_shared_n_way_ptr<1>(new data2t());
REQUIRE(sp1.is_same_type(sp1));
REQUIRE(sp2.is_same_type(sp2));
REQUIRE(sp3.is_same_type(sp3));
REQUIRE(sp1.is_same_type(sp2));
REQUIRE(sp1.is_same_type(sp3));
REQUIRE(!sp2.is_same_type(sp3));
REQUIRE(sp1.is_derived<0>());
REQUIRE(sp1.is_derived<1>());
REQUIRE(sp2.is_derived<0>());
REQUIRE(!sp2.is_derived<1>());
REQUIRE(sp3.is_derived<1>());
REQUIRE(!sp3.is_derived<0>());
}
SECTION("Basic")
{
spt sp1;
REQUIRE(!sp1);
REQUIRE(sp1.get() == nullptr);
REQUIRE(sp1.use_count() == 0);
const data1t *p;
p = sp1.get_derived<0>();
REQUIRE(p == nullptr);
spt sp2 = spt::create_small_shared_n_way_ptr<0>(new data1t());
REQUIRE(sp2.use_count() == 1);
p = sp2.get_derived<0>();
REQUIRE(p != nullptr);
spt sp3(sp2);
REQUIRE(sp3.is_derived<0>());
REQUIRE(sp2.get_derived<0>() == sp3.get_derived<0>());
REQUIRE(sp2.use_count() == 2);
REQUIRE(sp3.use_count() == 2);
sp1 = sp2;
REQUIRE(sp1.is_derived<0>());
REQUIRE(sp1.get_derived<0>() == sp2.get_derived<0>());
REQUIRE(sp1.use_count() == 3);
REQUIRE(sp2.use_count() == 3);
REQUIRE(sp3.use_count() == 3);
sp1.reset();
REQUIRE(!sp1);
REQUIRE(sp1.use_count() == 0);
REQUIRE(sp2.use_count() == 2);
REQUIRE(sp2.use_count() == 2);
{
spt sp4(sp2);
REQUIRE(sp4.use_count() == 3);
}
REQUIRE(sp2.use_count() == 2);
}
SECTION("Creation")
{
spt sp1 = make_shared_2<0, data1t, data2t>();
spt sp2 = make_shared_2<1, data1t, data2t>();
REQUIRE(!sp1.is_same_type(sp2));
sp1 = make_shared_2<0, data1t, data2t>(0);
sp2 = make_shared_2<1, data1t, data2t>(0);
REQUIRE(!sp1.is_same_type(sp2));
}
SECTION("Destruction")
{
data1_destructed = false;
data2_destructed = false;
{
spt sp = make_shared_2<0, data1t, data2t>();
REQUIRE(sp);
}
REQUIRE(data1_destructed);
REQUIRE(!data2_destructed);
data1_destructed = false;
{
spt sp1 = make_shared_2<0, data1t, data2t>();
{
spt sp2(sp1);
REQUIRE(sp2.use_count() == 2);
}
REQUIRE(!data1_destructed);
REQUIRE(!data2_destructed);
REQUIRE(sp1.use_count() == 1);
}
REQUIRE(data1_destructed);
REQUIRE(!data2_destructed);
}
SECTION("Three target types")
{
typedef small_shared_n_way_ptrt<data3t, data3t, data3t> sp3t;
sp3t sp1 = make_shared_3<0, data3t, data3t, data3t>();
REQUIRE(sp1.is_derived<0>());
REQUIRE(!sp1.is_derived<1>());
REQUIRE(!sp1.is_derived<2>());
sp3t sp2 = make_shared_3<1, data3t, data3t, data3t>();
REQUIRE(!sp2.is_derived<0>());
REQUIRE(sp2.is_derived<1>());
REQUIRE(!sp2.is_derived<2>());
sp3t sp3 = make_shared_3<2, data3t, data3t, data3t>();
REQUIRE(!sp3.is_derived<0>());
REQUIRE(!sp3.is_derived<1>());
REQUIRE(sp3.is_derived<2>());
}
}