aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp_unittest/utility/pointer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'meowpp_unittest/utility/pointer.cpp')
-rw-r--r--meowpp_unittest/utility/pointer.cpp130
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; }