diff options
Diffstat (limited to 'meowpp_unittest/utility/pointer.cpp')
-rw-r--r-- | meowpp_unittest/utility/pointer.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/meowpp_unittest/utility/pointer.cpp b/meowpp_unittest/utility/pointer.cpp new file mode 100644 index 0000000..b2ecb52 --- /dev/null +++ b/meowpp_unittest/utility/pointer.cpp @@ -0,0 +1,130 @@ +#define MEOWPP_UTILITY_POINTER_TESTING + +#include <meowpp/utility/pointer.h> +#include <meowpp/utility/pointer.h> +#include <meowpp/utility/pointer.h> +#include <meowpp/debug/assert.h> + +namespace meow { +class PointerTest { + private: + struct Data { + int* info; + int some_data; + Data(Data const& b) : info(b.info), some_data(b.some_data) {} + Data(int* infoo) : info(infoo) {} + ~Data() { (*info)++; } + }; + public: + PointerTest() { + { + Pointer<Data> ptr1; + Assert(ptr1.ptr_->address == NULL, ""); + Assert(ptr1.ptr_->auto_delete == false, ""); + } + int remove = 0; + Data some_data(&remove); + Pointer<Data> ptr0(&some_data, SINGLE, false); + { + Pointer<Data> ptr2(&some_data, SINGLE, false); + Assert(ptr2.ptr_->address == &some_data, ""); + Assert(ptr2.ptr_->auto_delete == false, ""); + { + Pointer<Data> ptr5(ptr2); + Assert(ptr2.ptr_ == ptr2.ptr_, ""); + } + Assert(remove == 0, ""); + } + Assert(remove == 0, ""); + { + Data* ptrr = new Data(&remove); + Assert(ptrr->info == &remove, ""); + Pointer<Data> ptr3(ptrr, SINGLE, true); + Assert(remove == 0, ""); + Assert(ptr3.ptr_->address == ptrr, ""); + Assert(remove == 0, ""); + Assert(ptrr->info == &remove, ""); + Assert(remove == 0, ""); + Assert(ptr3.ptr_->address->info == &remove, ""); + Assert(ptr3.ptr_->auto_delete == true, ""); + Assert(ptr3.address() == ptr3.ptr_->address, ""); + Assert(ptr3.auto_delete() == ptr3.ptr_->auto_delete, ""); + Assert(ptr3.ptr_->address->info == &remove, + "%llu --- %llu\n", + (unsigned long long)(ptr3.ptr_->address->info), + (unsigned long long)(&remove)); + Assert(ptr3.ptr_->counter == 1, ""); + { + Pointer<Data> ptr6(ptr3); + Assert(ptr3.ptr_ == ptr3.ptr_, ""); + Assert(ptr6.ptr_->counter == 2, ""); + } + Assert(ptr3.ptr_->counter == 1, ""); + Assert(remove == 0, ""); + } + Assert(remove == 1, " r = %d\n", remove); + { + Data* ptr = new Data(&remove); + remove = 0; + { + Pointer<Data> ptrr(ptr, SINGLE, false); + } + Assert(remove == 0, ""); + delete ptr; + } + Assert(remove == 1, ""); + (*ptr0).some_data = 0; + Assert(some_data.some_data == 0, ""); + Assert(some_data.some_data == (*ptr0).some_data, ""); + ptr0[0].some_data = 1; + Assert(some_data.some_data == 1, ""); + Assert(some_data.some_data == (*ptr0).some_data, ""); + ptr0->some_data = 2; + Assert(some_data.some_data == 2, ""); + Assert(some_data.some_data == (*ptr0).some_data, ""); + Pointer<Data> ptr7; + ptr7 = ptr0; + Assert(ptr7.ptr_ == ptr0.ptr_, ""); + { + Pointer<int> k(new int, SINGLE, true); + Pointer<int> l(new int, SINGLE, true); + (*k) = 3; + (*l) = 3; + Assert(*k == 3, ""); + Assert(*l == 3, ""); + Assert(!k.Equals(&l), ""); + Pointer<int> kk(k); + Assert(k.Equals(&kk), ""); + Assert(k.ptr_->counter == 2, ""); + *l = 10; + k.CopyFrom(&l); + Assert(k.ptr_->counter == 2, ""); + Assert(kk.ptr_->counter == 1, ""); + Assert(l.ptr_->counter == 2, ""); + Assert(k.Equals(&l), ""); + Assert((*k) == 10, ""); + Pointer<int>* cp = dynamic_cast<Pointer<int>*>(k.Copy()); + Assert((*cp) == k, ""); + Assert(cp->ptr_ == k.ptr_, ""); + Assert(cp->ptr_->counter == 3, ""); + delete cp; + Assert(k.ptr_->counter == 2, ""); + } + Pointer<int>* in = new Pointer<int>[2]; + Assert(in[0].ptr_ != NULL, ""); + Assert(in[1].ptr_ != NULL, ""); + Assert(in[0].ptr_ != in[1].ptr_, ""); + Assert(in[0].ptr_->counter == 1, ""); + Assert(in[1].ptr_->counter == 1, ""); + Assert(in[0].ptr_->auto_delete == false, ""); + Assert(in[1].ptr_->auto_delete == false, ""); + Assert(in[0].ptr_->address == NULL, ""); + Assert(in[1].ptr_->address == NULL, ""); + delete [] in; + Pointer<int> ptr(new int[2], ARRAY, true); + }; +} _; + +} + +int main() { return 0; } |