On 06/01/2008, muppet <[EMAIL PROTECTED]> wrote: > > On Jan 5, 2008, at 6:46 PM, Mikkel Kamstrup Erlandsen wrote: > > > The wait_for_signal() method process the main loop until a signal is > > emitted on a given object - or maybe until a timeout is reached[1]. > > The whole idea about that method is that it should be possible to > > write your tests without using callbacks. This will help make the > > tests more expressive and easily maintained. > > > > To flag that some test case should run in a main loop you use some > > special way of registering it. Like add_test_with_main_loop. There are > > a lot of open questions on that one... Fx: > > - Should all three functions, setup, test_run, and teardown, be run > > in the mainloop, or just test_run() > > - Should the mainloop process events in between calling the three > > functions? > > > > For my purpose I think it would be nice if I could call wait_for > > signal() in setup() as well, but I could live without it. > > > > The biggest problem I see is how to pass the signal args back to the > > test case. I have no idea on how to solve that. > > > I don't think you really need to worry about having > add_test_with_main_loop() if your wait_for_signal() creates its own > main loop, so long as you don't do anything funky with main loop > contexts. > > As for passing the signal arguments back to the caller, you can do > this by using a custom GClosure with a marshaler that simply copies > all the arguments passed in. > > The attached code does this. The interesting bits are > > /* the one that does the actual work */ > gboolean wait_for_signal_values (GObject * object, > gint max_wait_ms, > guint signal_id, > GQuark detail, > GValue * return_value, > GValueArray ** param_values); > > /* varargs interface intended to be easier to use. */ > gboolean wait_for_signal (GObject * object, > gint max_wait_ms, > const gchar * detailed_signal, > ...) > > and lets you write code like > > obj = g_object_new (SOME_TYPE_OBJECT, 0); > some_object_queue_blam (SOME_OBJECT (obj), 250); > if (wait_for_signal (obj, 2000, "blam", 2, &strval, &ival)) { > g_print ("okay 1 -> \"%s\", %d\n", strval, ival); > g_free (strval); > } else > g_print ("not okay 1\n"); > > > The most verbose part is the switch on the fundamental type of the > parameters in wait_for_signal(); if anybody knows how to golf that, > please do. >
Wow, thanks muppet. You just made my day :-) I do need my test method to run in a main loop though, because some of the methods I call before wait_for_signal requires a main loop. It does not look to hard to change though. I will have a closer look at this tonight. Cheers, Mikkel _______________________________________________ gtk-devel-list mailing list gtk-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-devel-list