/* * Copyright © 2018 Christian Persch * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . */ #include "config.h" #include "refptr.hh" /* Test object */ typedef struct _TestObject TestObject; typedef struct _TestObjectClass TestObjectClass; struct _TestObject { GObject parent_instance; }; struct _TestObjectClass{ GObjectClass parent_class; }; static GType test_object_get_type(void); G_DEFINE_TYPE(TestObject, test_object, G_TYPE_OBJECT) static void test_object_init(TestObject* object) { } static void test_object_finalize(GObject *object) { G_OBJECT_CLASS(test_object_parent_class)->finalize(object); } static void test_object_class_init(TestObjectClass* klass) { GObjectClass* gobject_class = G_OBJECT_CLASS(klass); gobject_class->finalize = test_object_finalize; } static TestObject* test_object_new(void) { return reinterpret_cast(g_object_new(test_object_get_type(), nullptr)); } /* Tests */ typedef union { TestObject* obj; void* ptr; } obj_t; static void test_glib_refptr(void) { obj_t obj1; obj1.obj = test_object_new(); g_object_add_weak_pointer(G_OBJECT(obj1.obj), &obj1.ptr); auto ptr1 = vte::glib::RefPtr{obj1.obj}; g_assert_true(ptr1.get() == obj1.obj); auto ptr2 = std::move(ptr1); g_assert_true(ptr1.get() == nullptr); g_assert_true(ptr2.get() == obj1.obj); obj_t obj2; obj2.obj = test_object_new(); g_object_add_weak_pointer(G_OBJECT(obj2.obj), &obj2.ptr); g_assert_nonnull(obj2.ptr); ptr2.reset(obj2.obj); g_assert_null(obj1.ptr); g_assert_true(ptr2.get() == obj2.obj); g_assert_nonnull(obj2.ptr); ptr2 = nullptr; g_assert_null(obj2.ptr); obj_t obj3; obj3.obj = test_object_new(); g_object_add_weak_pointer(G_OBJECT(obj3.obj), &obj3.ptr); g_assert_nonnull(obj3.ptr); auto ptr3 = vte::glib::RefPtr{obj3.obj}; TestObject* obj4 = ptr3.release(); g_assert_null(ptr3.get()); g_assert_nonnull(obj4); g_object_unref(obj4); g_assert_null(obj3.ptr); obj_t obj5; obj5.obj = test_object_new(); g_object_add_weak_pointer(G_OBJECT(obj5.obj), &obj5.ptr); g_assert_nonnull(obj5.ptr); vte::glib::RefPtr ptr5{obj5.obj}; obj_t obj6; obj6.obj = test_object_new(); g_object_add_weak_pointer(G_OBJECT(obj6.obj), &obj6.ptr); g_assert_nonnull(obj6.ptr); ptr5.reset(obj6.obj); g_assert_null(obj5.ptr); ptr5.reset(); g_assert_null(obj6.ptr); g_assert_null(ptr5.get()); } int main(int argc, char* argv[]) { g_test_init(&argc, &argv, nullptr); g_test_add_func("/vte/glib/refptr", test_glib_refptr); return g_test_run(); }