1 /* 2 * Copyright 2009 Ryan Lortie 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License as published 6 * by the Free Software Foundation; either version 2 of the licence or (at 7 * your option) any later version. 8 * 9 * See the included COPYING file for more information. 10 */ 11 12 #include <glib/glib.h> 13 #include <gio/gio.h> 14 #include <stdlib.h> 15 #include <string.h> 16 17 static GObject *got_source; 18 static GAsyncResult *got_result; 19 static gpointer got_user_data; 20 21 static void 22 ensure_destroyed (gpointer obj) 23 { 24 g_object_add_weak_pointer (obj, &obj); 25 g_object_unref (obj); 26 g_assert (obj == NULL); 27 } 28 29 static void 30 reset (void) 31 { 32 got_source = NULL; 33 34 if (got_result) 35 ensure_destroyed (got_result); 36 37 got_result = NULL; 38 got_user_data = NULL; 39 } 40 41 static void 42 check (gpointer a, gpointer b, gpointer c) 43 { 44 g_assert (a == got_source); 45 g_assert (b == got_result); 46 g_assert (c == got_user_data); 47 } 48 49 static void 50 callback_func (GObject *source, 51 GAsyncResult *result, 52 gpointer user_data) 53 { 54 got_source = source; 55 got_result = g_object_ref (result); 56 got_user_data = user_data; 57 } 58 59 static void 60 test_simple_async (void) 61 { 62 GSimpleAsyncResult *result; 63 GObject *a, *b, *c; 64 65 a = g_object_new (G_TYPE_OBJECT, NULL); 66 b = g_object_new (G_TYPE_OBJECT, NULL); 67 c = g_object_new (G_TYPE_OBJECT, NULL); 68 69 result = g_simple_async_result_new (a, callback_func, b, test_simple_async); 70 check (NULL, NULL, NULL); 71 g_simple_async_result_complete (result); 72 check (a, result, b); 73 g_object_unref (result); 74 75 g_assert (g_simple_async_result_is_valid (got_result, a, test_simple_async)); 76 g_assert (!g_simple_async_result_is_valid (got_result, b, test_simple_async)); 77 g_assert (!g_simple_async_result_is_valid (got_result, c, test_simple_async)); 78 g_assert (!g_simple_async_result_is_valid (got_result, b, callback_func)); 79 g_assert (!g_simple_async_result_is_valid ((gpointer) a, NULL, NULL)); 80 reset (); 81 reset (); 82 reset (); 83 84 result = g_simple_async_result_new (a, callback_func, b, test_simple_async); 85 check (NULL, NULL, NULL); 86 g_simple_async_result_complete_in_idle (result); 87 g_object_unref (result); 88 check (NULL, NULL, NULL); 89 g_main_context_iteration (NULL, FALSE); 90 check (a, result, b); 91 reset (); 92 93 ensure_destroyed (a); 94 ensure_destroyed (b); 95 ensure_destroyed (c); 96 } 97 98 int 99 main (int argc, char **argv) 100 { 101 g_type_init (); 102 g_test_init (&argc, &argv, NULL); 103 104 g_test_add_func ("/gio/simple-async-result/test", test_simple_async); 105 106 return g_test_run(); 107 } 108