diff options
Diffstat (limited to 'gobject/tests/signals.c')
-rw-r--r-- | gobject/tests/signals.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/gobject/tests/signals.c b/gobject/tests/signals.c index 1c7085244..310b7f2e6 100644 --- a/gobject/tests/signals.c +++ b/gobject/tests/signals.c @@ -1788,6 +1788,44 @@ test_signal_is_valid_name (void) g_assert_false (g_signal_is_valid_name (invalid_names[i])); } +typedef struct +{ + GWeakRef wr; + gulong handler; +} TestWeakRefDisconnect; + +static void +weak_ref_disconnect_notify (gpointer data, + GObject *where_object_was) +{ + TestWeakRefDisconnect *state = data; + g_assert_null (g_weak_ref_get (&state->wr)); + state->handler = 0; +} + +static void +test_weak_ref_disconnect (void) +{ + TestWeakRefDisconnect state; + GObject *test; + + test = g_object_new (test_get_type (), NULL); + g_weak_ref_init (&state.wr, test); + state.handler = g_signal_connect_data (test, + "simple", + G_CALLBACK (dont_reach), + &state, + (GClosureNotify) weak_ref_disconnect_notify, + 0); + g_assert_cmpint (state.handler, >, 0); + + g_object_unref (test); + + g_assert_cmpint (state.handler, ==, 0); + g_assert_null (g_weak_ref_get (&state.wr)); + g_weak_ref_clear (&state.wr); +} + /* --- */ int @@ -1825,6 +1863,7 @@ main (int argc, g_test_add_data_func ("/gobject/signals/invalid-name/first-char", "7zip", test_signals_invalid_name); g_test_add_data_func ("/gobject/signals/invalid-name/empty", "", test_signals_invalid_name); g_test_add_func ("/gobject/signals/is-valid-name", test_signal_is_valid_name); + g_test_add_func ("/gobject/signals/weak-ref-disconnect", test_weak_ref_disconnect); return g_test_run (); } |