Merge branch '0.8'
[swfdec.git] / test / swfdec_test_test.c
blobe7771ca890b2b878c0ee0aa82bc393b817260488
1 /* Swfdec
2 * Copyright (C) 2007 Benjamin Otte <otte@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301 USA
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
24 #include <string.h>
25 #include <unistd.h>
27 #include "swfdec_test_test.h"
28 #include "swfdec_test_buffer.h"
29 #include "swfdec_test_function.h"
30 #include "swfdec_test_image.h"
31 #include "swfdec_test_socket.h"
32 #include "swfdec_test_utils.h"
34 /*** PLUGIN HANDLING ***/
36 #define SWFDEC_TEST_TEST_FROM_PLUGIN(x) \
37 SWFDEC_TEST_TEST ((gpointer) ((guint8 *) (x) - G_STRUCT_OFFSET (SwfdecTestTest, plugin)))
39 char *swfdec_test_plugin_name = NULL;
41 static void
42 swfdec_test_test_quit (SwfdecTestPlugin *plugin)
44 SwfdecTestTest *test = SWFDEC_TEST_TEST_FROM_PLUGIN (plugin);
46 test->plugin_quit = TRUE;
49 static void
50 swfdec_test_test_error (SwfdecTestPlugin *plugin, const char *description)
52 SwfdecTestTest *test = SWFDEC_TEST_TEST_FROM_PLUGIN (plugin);
54 if (test->plugin_error)
55 return;
56 test->plugin_error = TRUE;
57 swfdec_test_throw (swfdec_gc_object_get_context (test), description);
60 static void
61 swfdec_test_test_trace (SwfdecTestPlugin *plugin, const char *message)
63 SwfdecTestTest *test = SWFDEC_TEST_TEST_FROM_PLUGIN (plugin);
64 gsize len = strlen (message);
65 SwfdecBuffer *buffer;
67 buffer = swfdec_buffer_new (len + 1);
68 memcpy (buffer->data, message, len);
69 buffer->data[len] = '\n';
70 swfdec_buffer_queue_push (test->trace, buffer);
73 static void
74 swfdec_test_test_launch (SwfdecTestPlugin *plugin, const char *url)
76 SwfdecTestTest *test = SWFDEC_TEST_TEST_FROM_PLUGIN (plugin);
77 gsize len = strlen (url);
78 SwfdecBuffer *buffer;
80 buffer = swfdec_buffer_new (len + 1);
81 memcpy (buffer->data, url, len);
82 buffer->data[len] = '\n';
83 swfdec_buffer_queue_push (test->launched, buffer);
86 static void
87 swfdec_test_test_request_socket (SwfdecTestPlugin *plugin,
88 SwfdecTestPluginSocket *psock)
90 SwfdecTestTest *test = SWFDEC_TEST_TEST_FROM_PLUGIN (plugin);
91 SwfdecAsContext *cx = swfdec_gc_object_get_context (test);
92 SwfdecTestSocket *sock;
93 SwfdecAsValue val;
95 sock = swfdec_test_socket_new (test, psock);
96 SWFDEC_AS_VALUE_SET_OBJECT (&val, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (sock)));
97 swfdec_as_relay_call (SWFDEC_AS_RELAY (test), swfdec_as_context_get_string (cx, "onSocket"),
98 1, &val, NULL);
101 static void
102 swfdec_test_test_load_plugin (SwfdecTestTest *test, const char *filename)
104 memset (&test->plugin, 0, sizeof (SwfdecTestPlugin));
105 /* initialize test->plugin */
106 /* FIXME: This assumes filenames - do we wanna allow http? */
107 if (g_path_is_absolute (filename)) {
108 test->plugin.filename = g_strdup (filename);
109 } else {
110 char *cur = g_get_current_dir ();
111 test->plugin.filename = g_build_filename (cur, filename, NULL);
112 g_free (cur);
114 test->plugin.trace = swfdec_test_test_trace;
115 test->plugin.launch = swfdec_test_test_launch;
116 test->plugin.quit = swfdec_test_test_quit;
117 test->plugin.error = swfdec_test_test_error;
118 test->plugin.request_socket = swfdec_test_test_request_socket;
120 /* load the right values */
121 if (swfdec_test_plugin_name) {
122 void (*init) (SwfdecTestPlugin *plugin);
123 char *dir = g_build_filename (g_get_home_dir (), ".swfdec-test", NULL);
124 char *name = g_module_build_path (dir, swfdec_test_plugin_name);
125 g_free (dir);
126 test->module = g_module_open (name, G_MODULE_BIND_LOCAL);
127 if (test->module == NULL) {
128 swfdec_test_throw (swfdec_gc_object_get_context (test), "could not find player \"%s\"",
129 swfdec_test_plugin_name);
130 return;
132 if (!g_module_symbol (test->module, "swfdec_test_plugin_init", (gpointer) &init)) {
133 g_module_close (test->module);
134 test->module = NULL;
136 init (&test->plugin);
137 } else {
138 swfdec_test_plugin_swfdec_new (&test->plugin);
140 test->plugin_loaded = TRUE;
143 static void
144 swfdec_test_test_unload_plugin (SwfdecTestTest *test)
146 if (!test->plugin_loaded)
147 return;
149 /* unload all objects generated by the plugin first */
150 while (test->sockets)
151 swfdec_test_socket_close (test->sockets->data);
153 test->plugin.finish (&test->plugin);
154 g_free (test->plugin.filename);
155 if (test->module) {
156 g_module_close (test->module);
157 test->module = NULL;
159 test->plugin_quit = FALSE;
160 test->plugin_error = FALSE;
161 test->plugin_loaded = FALSE;
164 /*** SWFDEC_TEST_TEST ***/
166 G_DEFINE_TYPE (SwfdecTestTest, swfdec_test_test, SWFDEC_TYPE_AS_RELAY)
168 static void
169 swfdec_test_test_dispose (GObject *object)
171 SwfdecTestTest *test = SWFDEC_TEST_TEST (object);
173 test->plugin_error = TRUE; /* set to avoid callbacks into the engine */
174 swfdec_test_test_unload_plugin (test);
176 if (test->trace) {
177 swfdec_buffer_queue_unref (test->trace);
178 test->trace = NULL;
181 if (test->launched) {
182 swfdec_buffer_queue_unref (test->launched);
183 test->launched = NULL;
186 g_free (test->filename);
187 test->filename = NULL;
189 G_OBJECT_CLASS (swfdec_test_test_parent_class)->dispose (object);
192 static void
193 swfdec_test_test_mark (SwfdecGcObject *object)
195 SwfdecTestTest *test = SWFDEC_TEST_TEST (object);
197 g_slist_foreach (test->sockets, (GFunc) swfdec_gc_object_mark, NULL);
199 SWFDEC_GC_OBJECT_CLASS (swfdec_test_test_parent_class)->mark (object);
202 static void
203 swfdec_test_test_class_init (SwfdecTestTestClass *klass)
205 GObjectClass *object_class = G_OBJECT_CLASS (klass);
206 SwfdecGcObjectClass *gc_class = SWFDEC_GC_OBJECT_CLASS (klass);
208 object_class->dispose = swfdec_test_test_dispose;
210 gc_class->mark = swfdec_test_test_mark;
213 static void
214 swfdec_test_test_init (SwfdecTestTest *test)
216 test->trace = swfdec_buffer_queue_new ();
217 test->launched = swfdec_buffer_queue_new ();
220 static void
221 swfdec_test_do_reset (SwfdecTestTest *test, const char *filename)
223 swfdec_test_test_unload_plugin (test);
224 swfdec_buffer_queue_clear (test->trace);
225 if (filename == NULL)
226 return;
228 swfdec_test_test_load_plugin (test, filename);
231 SWFDEC_TEST_FUNCTION ("Test_advance", swfdec_test_test_advance)
232 void
233 swfdec_test_test_advance (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
234 SwfdecAsValue *argv, SwfdecAsValue *retval)
236 SwfdecTestTest *test;
237 int msecs;
239 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "i", &msecs);
241 if (msecs < 0 || !test->plugin_loaded || test->plugin_error || test->plugin_quit)
242 return;
244 if (test->plugin.advance) {
245 test->plugin.advance (&test->plugin, msecs);
246 } else {
247 swfdec_test_throw (cx, "plugin doesn't implement advance");
251 SWFDEC_TEST_FUNCTION ("Test_reset", swfdec_test_test_reset)
252 void
253 swfdec_test_test_reset (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
254 SwfdecAsValue *argv, SwfdecAsValue *retval)
256 SwfdecTestTest *test;
257 const char *filename = NULL;
259 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "|s", &filename);
261 swfdec_test_do_reset (test, filename);
264 SWFDEC_TEST_FUNCTION ("Test_mouse_move", swfdec_test_test_mouse_move)
265 void
266 swfdec_test_test_mouse_move (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
267 SwfdecAsValue *argv, SwfdecAsValue *retval)
269 SwfdecTestTest *test;
270 double x, y;
272 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "nn", &x, &y);
274 if (!test->plugin_loaded || test->plugin_error || test->plugin_quit)
275 return;
277 if (test->plugin.advance) {
278 test->plugin.mouse_move (&test->plugin, x, y);
279 } else {
280 swfdec_test_throw (cx, "plugin doesn't implement mouse_move");
284 SWFDEC_TEST_FUNCTION ("Test_mouse_press", swfdec_test_test_mouse_press)
285 void
286 swfdec_test_test_mouse_press (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
287 SwfdecAsValue *argv, SwfdecAsValue *retval)
289 SwfdecTestTest *test;
290 double x, y;
291 int button = 1;
293 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "nn|i", &x, &y, &button);
295 if (!test->plugin_loaded || test->plugin_error || test->plugin_quit)
296 return;
298 button = CLAMP (button, 1, 32);
299 if (test->plugin.advance) {
300 test->plugin.mouse_press (&test->plugin, x, y, button);
301 } else {
302 swfdec_test_throw (cx, "plugin doesn't implement mouse_press");
306 SWFDEC_TEST_FUNCTION ("Test_mouse_release", swfdec_test_test_mouse_release)
307 void
308 swfdec_test_test_mouse_release (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
309 SwfdecAsValue *argv, SwfdecAsValue *retval)
311 SwfdecTestTest *test;
312 double x, y;
313 int button = 1;
315 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "nn|i", &x, &y, &button);
317 if (!test->plugin_loaded || test->plugin_error || test->plugin_quit)
318 return;
320 button = CLAMP (button, 1, 32);
321 if (test->plugin.advance) {
322 test->plugin.mouse_release (&test->plugin, x, y, button);
323 } else {
324 swfdec_test_throw (cx, "plugin doesn't implement mouse_release");
328 SWFDEC_TEST_FUNCTION ("Test_render", swfdec_test_test_render)
329 void
330 swfdec_test_test_render (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
331 SwfdecAsValue *argv, SwfdecAsValue *retval)
333 SwfdecTestTest *test;
334 SwfdecTestImage *image;
335 int x = 0, y = 0, w = 0, h = 0;
337 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "|iiii", &x, &y, &w, &h);
339 if (!test->plugin_loaded || test->plugin_error || test->plugin_quit)
340 return;
342 if (argc == 0) {
343 w = test->plugin.width;
344 h = test->plugin.height;
346 image = swfdec_test_image_new (cx, w, h);
348 if (test->plugin.screenshot) {
349 test->plugin.screenshot (&test->plugin,
350 cairo_image_surface_get_data (SWFDEC_TEST_IMAGE (image)->surface),
351 x, y, w, h);
352 SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (image)));
353 } else {
354 swfdec_test_throw (cx, "plugin doesn't implement render");
358 SWFDEC_TEST_FUNCTION ("Test", swfdec_test_test_new)
359 void
360 swfdec_test_test_new (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
361 SwfdecAsValue *argv, SwfdecAsValue *retval)
363 SwfdecTestTest *test;
364 const char *filename = NULL;
366 if (!swfdec_as_context_is_constructing (cx))
367 return;
369 SWFDEC_AS_CHECK (0, NULL, "|s", &filename);
371 test = g_object_new (SWFDEC_TYPE_TEST_TEST, "context", cx, NULL);
372 swfdec_test_do_reset (test, filename);
374 swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (test));
375 SWFDEC_AS_VALUE_SET_OBJECT (retval, object);
378 SWFDEC_TEST_FUNCTION ("Test_get_launched", swfdec_test_test_get_launched)
379 void
380 swfdec_test_test_get_launched (SwfdecAsContext *cx, SwfdecAsObject *object,
381 guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
383 SwfdecTestTest *test;
384 SwfdecTestBuffer *buf;
385 SwfdecBuffer *buffer;
386 gsize len;
388 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "");
390 len = swfdec_buffer_queue_get_depth (test->launched);
391 buffer = swfdec_buffer_queue_peek (test->launched, len);
392 buf = swfdec_test_buffer_new (cx, buffer);
393 SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buf)));
396 SWFDEC_TEST_FUNCTION ("Test_get_trace", swfdec_test_test_get_trace)
397 void
398 swfdec_test_test_get_trace (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
399 SwfdecAsValue *argv, SwfdecAsValue *retval)
401 SwfdecTestTest *test;
402 SwfdecTestBuffer *buf;
403 SwfdecBuffer *buffer;
404 gsize len;
406 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "");
408 len = swfdec_buffer_queue_get_depth (test->trace);
409 buffer = swfdec_buffer_queue_peek (test->trace, len);
410 buf = swfdec_test_buffer_new (cx, buffer);
411 SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buf)));
414 SWFDEC_TEST_FUNCTION ("Test_get_quit", swfdec_test_test_get_quit)
415 void
416 swfdec_test_test_get_quit (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
417 SwfdecAsValue *argv, SwfdecAsValue *retval)
419 SwfdecTestTest *test;
421 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "");
423 /* FIXME: or not quit on error? */
424 SWFDEC_AS_VALUE_SET_BOOLEAN (retval, !test->plugin_loaded || test->plugin_error || test->plugin_quit);
427 SWFDEC_TEST_FUNCTION ("Test_get_rate", swfdec_test_test_get_rate)
428 void
429 swfdec_test_test_get_rate (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
430 SwfdecAsValue *argv, SwfdecAsValue *retval)
432 SwfdecTestTest *test;
434 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "");
436 if (!test->plugin_loaded)
437 return;
439 *retval = swfdec_as_value_from_number (cx, test->plugin.rate / 256.0);