blob: 34ef5a309fd2d58a5972b174e37311779d8a7e73 [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#include <rive/refcnt.hpp>
#include <catch.hpp>
#include <cstdio>
using namespace rive;
class MyRefCnt : public RefCnt {
public:
MyRefCnt() {}
void require_count(int value) {
REQUIRE(this->debugging_refcnt() == value);
}
};
TEST_CASE("refcnt", "[basics]") {
MyRefCnt my;
REQUIRE(my.debugging_refcnt() == 1);
my.ref();
REQUIRE(my.debugging_refcnt() == 2);
my.unref();
REQUIRE(my.debugging_refcnt() == 1);
safe_ref(&my);
REQUIRE(my.debugging_refcnt() == 2);
safe_unref(&my);
REQUIRE(my.debugging_refcnt() == 1);
// just exercise these to be sure they don't crash
safe_ref((MyRefCnt*)nullptr);
safe_unref((MyRefCnt*)nullptr);
}
TEST_CASE("rcp", "[basics]") {
rcp<MyRefCnt> r0(nullptr);
REQUIRE(r0.get() == nullptr);
REQUIRE(!r0);
rcp<MyRefCnt> r1(new MyRefCnt);
REQUIRE(r1.get() != nullptr);
REQUIRE(r1);
REQUIRE(r1 != r0);
REQUIRE(r1->debugging_refcnt() == 1);
auto r2 = r1;
REQUIRE(r1.get() == r2.get());
REQUIRE(r1 == r2);
REQUIRE(r2->debugging_refcnt() == 2);
auto ptr = r2.release();
REQUIRE(r2.get() == nullptr);
REQUIRE(r1.get() == ptr);
// This is important, calling release() does not modify the ref count on the object
// We have to manage that explicit since we called release()
REQUIRE(r1->debugging_refcnt() == 2);
ptr->unref();
REQUIRE(r1->debugging_refcnt() == 1);
r1.reset();
REQUIRE(r1.get() == nullptr);
}