summaryrefslogtreecommitdiffstats
path: root/libdimension
diff options
context:
space:
mode:
Diffstat (limited to 'libdimension')
-rw-r--r--libdimension/tests/Makefile.am4
-rw-r--r--libdimension/tests/refcount.c72
2 files changed, 76 insertions, 0 deletions
diff --git a/libdimension/tests/Makefile.am b/libdimension/tests/Makefile.am
index 0673023..bcfa2c6 100644
--- a/libdimension/tests/Makefile.am
+++ b/libdimension/tests/Makefile.am
@@ -26,6 +26,7 @@ check_PROGRAMS = warning.test \
warning-as-error.test \
error.test \
custom-error-fn.test \
+ refcount.test \
dictionary.test \
polynomial.test \
prtree.test \
@@ -73,6 +74,9 @@ error_test_LDADD = libdimension-tests.la
custom_error_fn_test_SOURCES = custom-error-fn.c
custom_error_fn_test_LDADD = libdimension-tests.la
+refcount_test_SOURCES = refcount.c
+refcount_test_LDADD = libdimension-unit-test.la
+
dictionary_test_SOURCES = dictionary.c
dictionary_test_LDADD = libdimension-unit-test.la
diff --git a/libdimension/tests/refcount.c b/libdimension/tests/refcount.c
new file mode 100644
index 0000000..efceacd
--- /dev/null
+++ b/libdimension/tests/refcount.c
@@ -0,0 +1,72 @@
+/*************************************************************************
+ * Copyright (C) 2012 Tavian Barnes <tavianator@tavianator.com> *
+ * *
+ * This file is part of The Dimension Test Suite. *
+ * *
+ * The Dimension Test Suite is free software; you can redistribute it *
+ * and/or modify it under the terms of the GNU General Public License as *
+ * published by the Free Software Foundation; either version 3 of the *
+ * License, or (at your option) any later version. *
+ * *
+ * The Dimension Test Suite 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 *
+ * General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. *
+ *************************************************************************/
+
+/**
+ * @file
+ * Tests for the reference counting implementation.
+ */
+
+#include "dimension-internal.h"
+#include "tests.h"
+
+typedef struct dmnsn_foo {
+ DMNSN_REFCOUNT;
+} dmnsn_foo;
+
+static dmnsn_foo *
+dmnsn_new_foo(void)
+{
+ dmnsn_foo *foo = dmnsn_malloc(sizeof(dmnsn_foo));
+ DMNSN_REFCOUNT_INIT(foo);
+ return foo;
+}
+
+static void
+dmnsn_delete_foo(dmnsn_foo *foo)
+{
+ if (DMNSN_DECREF(foo)) {
+ dmnsn_free(foo);
+ }
+}
+
+static dmnsn_foo dmnsn_global_foo = {
+ DMNSN_REFCOUNT_INITIALIZER,
+};
+
+DMNSN_TEST(refcount, inc_dec)
+{
+ dmnsn_foo *foo = dmnsn_new_foo();
+ DMNSN_INCREF(foo);
+ dmnsn_delete_foo(foo);
+ dmnsn_delete_foo(foo);
+}
+
+DMNSN_TEST(refcount, decref_null)
+{
+ dmnsn_foo *foo = NULL;
+ ck_assert(!DMNSN_DECREF(foo));
+}
+
+DMNSN_TEST(refcount, global)
+{
+ /* Suppress "address will always evaluate to true" warning */
+ dmnsn_foo *global = &dmnsn_global_foo;
+ DMNSN_INCREF(global);
+ ck_assert(!DMNSN_DECREF(global));
+}