[folks] tests: Allow data to be stored in unit test closures



commit 7612d6720bab91b7a397036e6a22203b2f7093e6
Author: Philip Withnall <philip withnall collabora co uk>
Date:   Wed Jun 17 17:18:21 2015 +0100

    tests: Allow data to be stored in unit test closures
    
    Previously, unit test closures had to be entirely pure — now they can
    store data. This will be useful for adding unit tests dynamically.

 tests/lib/test-case-helper.c |   25 ++++++++++++++++++++-----
 tests/lib/test-case.vala     |    7 ++++---
 2 files changed, 24 insertions(+), 8 deletions(-)
---
diff --git a/tests/lib/test-case-helper.c b/tests/lib/test-case-helper.c
index bd5c0ee..a4bdb7c 100644
--- a/tests/lib/test-case-helper.c
+++ b/tests/lib/test-case-helper.c
@@ -1,6 +1,7 @@
 /* test-case-helper.c
  *
  * Copyright © 2013 Intel Corporation
+ * Copyright © 2015 Collabora Ltd.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -29,6 +30,8 @@
 typedef struct {
     gpointer self;
     FolksTestCaseTestMethod test;
+    gpointer test_data;
+    GDestroyNotify test_data_free;
 } FolksTestCaseWeakMethod;
 
 static void
@@ -52,7 +55,7 @@ folks_test_case_weak_method_test (gpointer fixture G_GNUC_UNUSED,
   g_return_if_fail (wm->self != NULL);
   g_return_if_fail (FOLKS_IS_TEST_CASE (wm->self));
 
-  wm->test (wm->self);
+  wm->test (wm->test_data);
 }
 
 static void
@@ -67,21 +70,33 @@ folks_test_case_weak_method_teardown (gpointer fixture G_GNUC_UNUSED,
   folks_test_case_tear_down (wm->self);
 }
 
+static void
+test_case_destroyed_cb (gpointer data,
+    GObject *test_case_location)
+{
+  FolksTestCaseWeakMethod *wm = data;
+
+  if (wm->test_data != NULL && wm->test_data_free != NULL)
+    wm->test_data_free (wm->test_data);
+}
+
 GTestCase *
 folks_test_case_add_test_helper (FolksTestCase *self,
     const gchar *name,
     FolksTestCaseTestMethod test,
-    void *test_target)
+    void *test_target,
+    GDestroyNotify test_target_destroy_notify)
 {
   FolksTestCaseWeakMethod *wm;
 
-  g_return_val_if_fail (self == (FolksTestCase *) test_target, NULL);
-
   /* This will never be freed, so make sure not to hold references. */
   wm = g_new0 (FolksTestCaseWeakMethod, 1);
   wm->self = self;
   wm->test = test;
-  g_object_add_weak_pointer (G_OBJECT (self), &wm->self);
+  wm->test_data = test_target;
+  wm->test_data_free = test_target_destroy_notify;
+
+  g_object_weak_ref (G_OBJECT (self), test_case_destroyed_cb, wm);
 
   return g_test_create_case (name,
       0,
diff --git a/tests/lib/test-case.vala b/tests/lib/test-case.vala
index 604b3a5..bdf7930 100644
--- a/tests/lib/test-case.vala
+++ b/tests/lib/test-case.vala
@@ -376,13 +376,14 @@ public abstract class Folks.TestCase : Object
       TestSuite.get_root ().add_suite (this._suite);
     }
 
-  public void add_test (string name, TestMethod test)
+  public void add_test (string name, owned TestMethod test)
     {
-      this._suite.add (add_test_helper (name, test));
+      this._suite.add (add_test_helper (name, (owned) test));
     }
 
   /* implemented in test-case-helper.c */
-  internal extern GLib.TestCase add_test_helper (string name, TestMethod test);
+  internal extern GLib.TestCase add_test_helper (string name,
+      owned TestMethod test);
 
   /**
    * Set up for one test. If you have more than one test, this will


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]