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.
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
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
;
42 swfdec_test_test_quit (SwfdecTestPlugin
*plugin
)
44 SwfdecTestTest
*test
= SWFDEC_TEST_TEST_FROM_PLUGIN (plugin
);
46 test
->plugin_quit
= TRUE
;
50 swfdec_test_test_error (SwfdecTestPlugin
*plugin
, const char *description
)
52 SwfdecTestTest
*test
= SWFDEC_TEST_TEST_FROM_PLUGIN (plugin
);
54 if (test
->plugin_error
)
56 test
->plugin_error
= TRUE
;
57 swfdec_test_throw (swfdec_gc_object_get_context (test
), description
);
61 swfdec_test_test_trace (SwfdecTestPlugin
*plugin
, const char *message
)
63 SwfdecTestTest
*test
= SWFDEC_TEST_TEST_FROM_PLUGIN (plugin
);
64 gsize len
= strlen (message
);
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
);
74 swfdec_test_test_launch (SwfdecTestPlugin
*plugin
, const char *url
)
76 SwfdecTestTest
*test
= SWFDEC_TEST_TEST_FROM_PLUGIN (plugin
);
77 gsize len
= strlen (url
);
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
);
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
;
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"),
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
);
110 char *cur
= g_get_current_dir ();
111 test
->plugin
.filename
= g_build_filename (cur
, filename
, NULL
);
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
);
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
);
132 if (!g_module_symbol (test
->module
, "swfdec_test_plugin_init", (gpointer
) &init
)) {
133 g_module_close (test
->module
);
136 init (&test
->plugin
);
138 swfdec_test_plugin_swfdec_new (&test
->plugin
);
140 test
->plugin_loaded
= TRUE
;
144 swfdec_test_test_unload_plugin (SwfdecTestTest
*test
)
146 if (!test
->plugin_loaded
)
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
);
156 g_module_close (test
->module
);
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
)
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
);
177 swfdec_buffer_queue_unref (test
->trace
);
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
);
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
);
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
;
214 swfdec_test_test_init (SwfdecTestTest
*test
)
216 test
->trace
= swfdec_buffer_queue_new ();
217 test
->launched
= swfdec_buffer_queue_new ();
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
)
228 swfdec_test_test_load_plugin (test
, filename
);
231 SWFDEC_TEST_FUNCTION ("Test_advance", swfdec_test_test_advance
)
233 swfdec_test_test_advance (SwfdecAsContext
*cx
, SwfdecAsObject
*object
, guint argc
,
234 SwfdecAsValue
*argv
, SwfdecAsValue
*retval
)
236 SwfdecTestTest
*test
;
239 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST
, &test
, "i", &msecs
);
241 if (msecs
< 0 || !test
->plugin_loaded
|| test
->plugin_error
|| test
->plugin_quit
)
244 if (test
->plugin
.advance
) {
245 test
->plugin
.advance (&test
->plugin
, msecs
);
247 swfdec_test_throw (cx
, "plugin doesn't implement advance");
251 SWFDEC_TEST_FUNCTION ("Test_reset", swfdec_test_test_reset
)
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
)
266 swfdec_test_test_mouse_move (SwfdecAsContext
*cx
, SwfdecAsObject
*object
, guint argc
,
267 SwfdecAsValue
*argv
, SwfdecAsValue
*retval
)
269 SwfdecTestTest
*test
;
272 SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST
, &test
, "nn", &x
, &y
);
274 if (!test
->plugin_loaded
|| test
->plugin_error
|| test
->plugin_quit
)
277 if (test
->plugin
.advance
) {
278 test
->plugin
.mouse_move (&test
->plugin
, x
, y
);
280 swfdec_test_throw (cx
, "plugin doesn't implement mouse_move");
284 SWFDEC_TEST_FUNCTION ("Test_mouse_press", swfdec_test_test_mouse_press
)
286 swfdec_test_test_mouse_press (SwfdecAsContext
*cx
, SwfdecAsObject
*object
, guint argc
,
287 SwfdecAsValue
*argv
, SwfdecAsValue
*retval
)
289 SwfdecTestTest
*test
;
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
)
298 button
= CLAMP (button
, 1, 32);
299 if (test
->plugin
.advance
) {
300 test
->plugin
.mouse_press (&test
->plugin
, x
, y
, button
);
302 swfdec_test_throw (cx
, "plugin doesn't implement mouse_press");
306 SWFDEC_TEST_FUNCTION ("Test_mouse_release", swfdec_test_test_mouse_release
)
308 swfdec_test_test_mouse_release (SwfdecAsContext
*cx
, SwfdecAsObject
*object
, guint argc
,
309 SwfdecAsValue
*argv
, SwfdecAsValue
*retval
)
311 SwfdecTestTest
*test
;
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
)
320 button
= CLAMP (button
, 1, 32);
321 if (test
->plugin
.advance
) {
322 test
->plugin
.mouse_release (&test
->plugin
, x
, y
, button
);
324 swfdec_test_throw (cx
, "plugin doesn't implement mouse_release");
328 SWFDEC_TEST_FUNCTION ("Test_render", swfdec_test_test_render
)
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
)
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
),
352 SWFDEC_AS_VALUE_SET_OBJECT (retval
, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (image
)));
354 swfdec_test_throw (cx
, "plugin doesn't implement render");
358 SWFDEC_TEST_FUNCTION ("Test", swfdec_test_test_new
)
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
))
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
)
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
;
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
)
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
;
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
)
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
)
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
)
439 *retval
= swfdec_as_value_from_number (cx
, test
->plugin
.rate
/ 256.0);