Home | History | Annotate | Download | only in tests
      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