Skip to content
Snippets Groups Projects
SharedPtrTest.cpp 2.06 KiB
Newer Older
#include "SharedPtrTest.h"
#include <memory>
#include <utility>

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( SharedPtrTest, "bits" );
CPPUNIT_TEST_SUITE_REGISTRATION( SharedPtrTest );

void SharedPtrTest::setUp() {
}

void SharedPtrTest::tearDown() {
}

void SharedPtrTest::testSharedPtr1() {
	int moves;
	int copies;

	ext::cow_shared_ptr<SharedPtrTest::Moveable> one(new SharedPtrTest::Moveable(moves, copies));

	CPPUNIT_ASSERT(one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 0);

	ext::cow_shared_ptr<SharedPtrTest::Moveable> two(one);

	CPPUNIT_ASSERT(!one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 0);

	ext::make_const(two).get();
	ext::cow_shared_ptr<SharedPtrTest::Moveable> three(std::move ( two ) );
	ext::make_const(three).get();
	CPPUNIT_ASSERT(!one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 0);

	two = std::move ( three ) ;

	two.get();

	CPPUNIT_ASSERT(one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 1);
}

void SharedPtrTest::testSharedPtr2() {
	int moves;
	int copies;

	ext::cow_shared_ptr<SharedPtrTest::Moveable2> one(new SharedPtrTest::Moveable2(moves, copies));

	CPPUNIT_ASSERT(one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 0);

	ext::cow_shared_ptr<SharedPtrTest::Moveable2> two(one);

	CPPUNIT_ASSERT(!one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 0);

	ext::make_const(two).get();
	ext::cow_shared_ptr<SharedPtrTest::Moveable2> three(std::move ( two ) );
	ext::make_const(three).get();
	CPPUNIT_ASSERT(!one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 0);

	two = std::move ( three ) ;

	two.get();

	CPPUNIT_ASSERT(one.unique());
	CPPUNIT_ASSERT(moves == 0);
	CPPUNIT_ASSERT(copies == 1);
}

void SharedPtrTest::testSharedPtr3() {
	ext::cow_shared_ptr<SharedPtrTest::Base> one(new SharedPtrTest::Derived());
	ext::cow_shared_ptr<SharedPtrTest::Base> two(one);

	CPPUNIT_ASSERT(!one.unique());

	two.get();

	CPPUNIT_ASSERT(one.unique());
	CPPUNIT_ASSERT(two.unique());

	CPPUNIT_ASSERT(one.get() != two.get());
}