Simplify/fix state logic in GAction, test it.
[platform/upstream/glib.git] / gio / tests / actions.c
1 #include <gio/gio.h>
2 #include <stdlib.h>
3
4 typedef struct
5 {
6   GVariant *params;
7   gboolean did_run;
8 } Activation;
9
10 static void
11 activate (GAction  *action,
12           GVariant *parameter,
13           gpointer  user_data)
14 {
15   Activation *activation = user_data;
16
17   if (parameter)
18     activation->params = g_variant_ref (parameter);
19   else
20     activation->params = NULL;
21   activation->did_run = TRUE;
22 }
23
24 static void
25 test_basic (void)
26 {
27   Activation a = { 0, };
28   GAction *action;
29
30   action = g_action_new ("foo", NULL);
31   g_signal_connect (action, "activate", G_CALLBACK (activate), &a);
32   g_assert (!a.did_run);
33   g_action_activate (action, NULL);
34   g_assert (a.did_run);
35   a.did_run = FALSE;
36
37   g_action_set_enabled (action, FALSE);
38   g_action_activate (action, NULL);
39   g_assert (!a.did_run);
40
41   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
42     {
43       g_action_activate (action, g_variant_new_string ("xxx"));
44       exit (0);
45     }
46   g_test_trap_assert_failed ();
47
48   g_object_unref (action);
49   g_assert (!a.did_run);
50
51   action = g_action_new ("foo", G_VARIANT_TYPE_STRING);
52   g_signal_connect (action, "activate", G_CALLBACK (activate), &a);
53   g_assert (!a.did_run);
54   g_action_activate (action, g_variant_new_string ("Hello world"));
55   g_assert (a.did_run);
56   g_assert_cmpstr (g_variant_get_string (a.params, NULL), ==, "Hello world");
57   g_variant_unref (a.params);
58   a.did_run = FALSE;
59
60   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
61     {
62       g_action_activate (action, NULL);
63       exit (0);
64     }
65
66   g_test_trap_assert_failed ();
67
68   g_object_unref (action);
69   g_assert (!a.did_run);
70 }
71
72 static void
73 test_simple_group (void)
74 {
75   GSimpleActionGroup *group;
76   Activation a = { 0, };
77   GAction *action;
78
79   action = g_action_new ("foo", NULL);
80   g_signal_connect (action, "activate", G_CALLBACK (activate), &a);
81   g_assert (!a.did_run);
82   g_action_activate (action, NULL);
83   g_assert (a.did_run);
84   a.did_run = FALSE;
85
86   group = g_simple_action_group_new ();
87   g_simple_action_group_insert (group, action);
88   g_object_unref (action);
89
90   g_assert (!a.did_run);
91   g_action_group_activate (G_ACTION_GROUP (group), "foo", NULL);
92   g_assert (a.did_run);
93
94   a.did_run = FALSE;
95   g_object_unref (group);
96   g_assert (!a.did_run);
97 }
98
99 static void
100 test_stateful (void)
101 {
102   GAction *action;
103
104   action = g_action_new_stateful ("foo", NULL, g_variant_new_string ("hihi"));
105   g_assert (g_variant_type_equal (g_action_get_state_type (action),
106                                   G_VARIANT_TYPE_STRING));
107   g_assert_cmpstr (g_variant_get_string (g_action_get_state (action), NULL),
108                    ==, "hihi");
109
110   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
111     {
112       g_action_set_state (action, g_variant_new_int32 (123));
113       exit (0);
114     }
115   g_test_trap_assert_failed ();
116
117   g_action_set_state (action, g_variant_new_string ("hello"));
118   g_assert_cmpstr (g_variant_get_string (g_action_get_state (action), NULL),
119                    ==, "hello");
120
121   g_object_unref (action);
122
123   action = g_action_new ("foo", NULL);
124   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
125     {
126       g_action_set_state (action, g_variant_new_int32 (123));
127       exit (0);
128     }
129   g_test_trap_assert_failed ();
130   g_object_unref (action);
131 }
132
133 int
134 main (int argc, char **argv)
135 {
136   g_type_init ();
137   g_test_init (&argc, &argv, NULL);
138
139   g_test_add_func ("/actions/basic", test_basic);
140   g_test_add_func ("/actions/simplegroup", test_simple_group);
141   g_test_add_func ("/actions/stateful", test_stateful);
142
143   return g_test_run ();
144 }