1 /*
2  * Copyright © 2010 Red Hat Inc.
3  *
4  * Permission to use, copy, modify, distribute, and sell this software
5  * and its documentation for any purpose is hereby granted without
6  * fee, provided that the above copyright notice appear in all copies
7  * and that both that copyright notice and this permission notice
8  * appear in supporting documentation, and that the name of
9  * Red Hat, Inc. not be used in advertising or publicity pertaining to
10  * distribution of the software without specific, written prior
11  * permission. Red Hat, Inc. makes no representations about the
12  * suitability of this software for any purpose.  It is provided "as
13  * is" without express or implied warranty.
14  *
15  * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
16  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17  * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
18  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
19  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
21  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22  *
23  * Author: Benjamin Otte <otte@redhat.com>
24  */
25 
26 /*
27  * WHAT THIS TEST DOES
28  *
29  * This test tests that for all public APIs Cairo behaves correct, consistent
30  * and most of all doesn't crash. It does this by calling all APIs that take
31  * surfaces or contexts and calling them on specially prepared arguments that
32  * should fail when called on this function.
33  *
34  * ADDING NEW FUNCTIONS
35  *
36  * You need (for adding the function cairo_surface_foo):
37  * 1) A surface_test_func_t named test_cairo_surface_foo that gets passed the
38  *    prepared surface and has the job of calling the function and checking
39  *    the return value (if one exists) for correctness. The top of this file
40  *    contains all these shim functions.
41  * 2) Knowledge if the function behaves like a setter or like a getter. A
42  *    setter should set an error status on the surface, a getter does not
43  *    modify the function.
44  * 3) Knowledge if the function only works for a specific surface type and for
45  *    which one.
46  * 4) An entry in the tests array using the TEST() macro. It takes as arguments:
47  *    - The function name
48  *    - TRUE if the function modifies the surface, FALSE otherwise
49  *    - the surface type for which the function is valid or -1 if it is valid
50  *      for all surface types.
51  *
52  * FIXING FAILURES
53  *
54  * The test will dump failures notices into the api-special-cases.log file (when
55  * it doesn't crash). These should be pretty self-explanatory. Usually it is
56  * enough to just add a new check to the function it complained about.
57  */
58 
59 #ifdef HAVE_CONFIG_H
60 #include "config.h"
61 #endif
62 
63 #include <assert.h>
64 #include <limits.h>
65 
66 #include "cairo-test.h"
67 
68 #if CAIRO_HAS_GL_SURFACE
69 #include <cairo-gl.h>
70 #endif
71 #if CAIRO_HAS_OS2_SURFACE
72 #include <cairo-os2.h>
73 #endif
74 #if CAIRO_HAS_PDF_SURFACE
75 #include <cairo-pdf.h>
76 #endif
77 #if CAIRO_HAS_PS_SURFACE
78 #include <cairo-ps.h>
79 #endif
80 #if CAIRO_HAS_QUARTZ_SURFACE
81 #define Cursor QuartzCursor
82 #include <cairo-quartz.h>
83 #undef Cursor
84 #endif
85 #if CAIRO_HAS_SVG_SURFACE
86 #include <cairo-svg.h>
87 #endif
88 #if CAIRO_HAS_TEE_SURFACE
89 #include <cairo-tee.h>
90 #endif
91 #if CAIRO_HAS_XCB_SURFACE
92 #include <cairo-xcb.h>
93 #endif
94 #if CAIRO_HAS_XLIB_SURFACE
95 #define Cursor XCursor
96 #include <cairo-xlib.h>
97 #undef Cursor
98 #endif
99 
100 #define surface_has_type(surface,type) (cairo_surface_get_type (surface) == (type))
101 
102 typedef cairo_test_status_t (* surface_test_func_t) (cairo_surface_t *surface);
103 typedef cairo_test_status_t (* context_test_func_t) (cairo_t *cr);
104 
105 static cairo_test_status_t
test_cairo_reference(cairo_t * cr)106 test_cairo_reference (cairo_t *cr)
107 {
108     cairo_destroy (cairo_reference (cr));
109 
110     return CAIRO_TEST_SUCCESS;
111 }
112 
113 static cairo_test_status_t
test_cairo_get_reference_count(cairo_t * cr)114 test_cairo_get_reference_count (cairo_t *cr)
115 {
116     unsigned int refcount = cairo_get_reference_count (cr);
117     if (refcount > 0)
118         return CAIRO_TEST_SUCCESS;
119     /* inert error context have a refcount of 0 */
120     return cairo_status (cr) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
121 }
122 
123 static cairo_test_status_t
test_cairo_set_user_data(cairo_t * cr)124 test_cairo_set_user_data (cairo_t *cr)
125 {
126     static cairo_user_data_key_t key;
127     cairo_status_t status;
128 
129     status = cairo_set_user_data (cr, &key, &key, NULL);
130     if (status == CAIRO_STATUS_NO_MEMORY)
131         return CAIRO_TEST_NO_MEMORY;
132     else if (status)
133         return CAIRO_TEST_SUCCESS;
134 
135     if (cairo_get_user_data (cr, &key) != &key)
136         return CAIRO_TEST_ERROR;
137 
138     return CAIRO_TEST_SUCCESS;
139 }
140 
141 static cairo_test_status_t
test_cairo_save(cairo_t * cr)142 test_cairo_save (cairo_t *cr)
143 {
144     cairo_save (cr);
145     cairo_restore (cr);
146 
147     return CAIRO_TEST_SUCCESS;
148 }
149 
150 static cairo_test_status_t
test_cairo_push_group(cairo_t * cr)151 test_cairo_push_group (cairo_t *cr)
152 {
153     cairo_pattern_t *pattern;
154     cairo_status_t status;
155 
156     cairo_push_group (cr);
157     pattern = cairo_pop_group (cr);
158     status = cairo_pattern_status (pattern);
159     cairo_pattern_destroy (pattern);
160 
161     return status == CAIRO_STATUS_SUCCESS || status == cairo_status (cr) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
162 }
163 
164 static cairo_test_status_t
test_cairo_push_group_with_content(cairo_t * cr)165 test_cairo_push_group_with_content (cairo_t *cr)
166 {
167     cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA);
168     cairo_pop_group_to_source (cr);
169 
170     return CAIRO_TEST_SUCCESS;
171 }
172 
173 static cairo_test_status_t
test_cairo_set_operator(cairo_t * cr)174 test_cairo_set_operator (cairo_t *cr)
175 {
176     cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
177 
178     return CAIRO_TEST_SUCCESS;
179 }
180 
181 static cairo_test_status_t
test_cairo_set_source(cairo_t * cr)182 test_cairo_set_source (cairo_t *cr)
183 {
184     cairo_pattern_t *source = cairo_pattern_create_rgb (0, 0, 0);
185     cairo_set_source (cr, source);
186     cairo_pattern_destroy (source);
187 
188     return CAIRO_TEST_SUCCESS;
189 }
190 
191 static cairo_test_status_t
test_cairo_set_source_rgb(cairo_t * cr)192 test_cairo_set_source_rgb (cairo_t *cr)
193 {
194     cairo_set_source_rgb (cr, 0, 0, 0);
195 
196     return CAIRO_TEST_SUCCESS;
197 }
198 
199 static cairo_test_status_t
test_cairo_set_source_rgba(cairo_t * cr)200 test_cairo_set_source_rgba (cairo_t *cr)
201 {
202     cairo_set_source_rgba (cr, 0, 0, 0, 1);
203 
204     return CAIRO_TEST_SUCCESS;
205 }
206 
207 static cairo_test_status_t
test_cairo_set_source_surface(cairo_t * cr)208 test_cairo_set_source_surface (cairo_t *cr)
209 {
210     cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
211     cairo_set_source_surface (cr, surface, 0, 0);
212     cairo_surface_destroy (surface);
213 
214     return CAIRO_TEST_SUCCESS;
215 }
216 
217 static cairo_test_status_t
test_cairo_set_tolerance(cairo_t * cr)218 test_cairo_set_tolerance (cairo_t *cr)
219 {
220     cairo_set_tolerance (cr, 42);
221 
222     return CAIRO_TEST_SUCCESS;
223 }
224 
225 static cairo_test_status_t
test_cairo_set_antialias(cairo_t * cr)226 test_cairo_set_antialias (cairo_t *cr)
227 {
228     cairo_set_antialias (cr, CAIRO_ANTIALIAS_BEST);
229 
230     return CAIRO_TEST_SUCCESS;
231 }
232 
233 static cairo_test_status_t
test_cairo_set_fill_rule(cairo_t * cr)234 test_cairo_set_fill_rule (cairo_t *cr)
235 {
236     cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
237 
238     return CAIRO_TEST_SUCCESS;
239 }
240 
241 static cairo_test_status_t
test_cairo_set_line_width(cairo_t * cr)242 test_cairo_set_line_width (cairo_t *cr)
243 {
244     cairo_set_line_width (cr, 42);
245 
246     return CAIRO_TEST_SUCCESS;
247 }
248 
249 static cairo_test_status_t
test_cairo_set_line_cap(cairo_t * cr)250 test_cairo_set_line_cap (cairo_t *cr)
251 {
252     cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
253 
254     return CAIRO_TEST_SUCCESS;
255 }
256 
257 static cairo_test_status_t
test_cairo_set_line_join(cairo_t * cr)258 test_cairo_set_line_join (cairo_t *cr)
259 {
260     cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL);
261 
262     return CAIRO_TEST_SUCCESS;
263 }
264 
265 static cairo_test_status_t
test_cairo_set_dash(cairo_t * cr)266 test_cairo_set_dash (cairo_t *cr)
267 {
268     cairo_set_dash (cr, NULL, 0, 0);
269 
270     return CAIRO_TEST_SUCCESS;
271 }
272 
273 static cairo_test_status_t
test_cairo_set_miter_limit(cairo_t * cr)274 test_cairo_set_miter_limit (cairo_t *cr)
275 {
276     cairo_set_miter_limit (cr, 2);
277 
278     return CAIRO_TEST_SUCCESS;
279 }
280 
281 static cairo_test_status_t
test_cairo_translate(cairo_t * cr)282 test_cairo_translate (cairo_t *cr)
283 {
284     cairo_translate (cr, 2, 2);
285 
286     return CAIRO_TEST_SUCCESS;
287 }
288 
289 static cairo_test_status_t
test_cairo_scale(cairo_t * cr)290 test_cairo_scale (cairo_t *cr)
291 {
292     cairo_scale (cr, 2, 2);
293 
294     return CAIRO_TEST_SUCCESS;
295 }
296 
297 static cairo_test_status_t
test_cairo_rotate(cairo_t * cr)298 test_cairo_rotate (cairo_t *cr)
299 {
300     cairo_rotate (cr, 2);
301 
302     return CAIRO_TEST_SUCCESS;
303 }
304 
305 static cairo_test_status_t
test_cairo_transform(cairo_t * cr)306 test_cairo_transform (cairo_t *cr)
307 {
308     cairo_matrix_t matrix;
309 
310     cairo_matrix_init_translate (&matrix, 1, 1);
311     cairo_transform (cr, &matrix);
312 
313     return CAIRO_TEST_SUCCESS;
314 }
315 
316 static cairo_test_status_t
test_cairo_set_matrix(cairo_t * cr)317 test_cairo_set_matrix (cairo_t *cr)
318 {
319     cairo_matrix_t matrix;
320 
321     cairo_matrix_init_translate (&matrix, 1, 1);
322     cairo_set_matrix (cr, &matrix);
323 
324     return CAIRO_TEST_SUCCESS;
325 }
326 
327 static cairo_test_status_t
test_cairo_identity_matrix(cairo_t * cr)328 test_cairo_identity_matrix (cairo_t *cr)
329 {
330     cairo_identity_matrix (cr);
331 
332     return CAIRO_TEST_SUCCESS;
333 }
334 
335 static cairo_test_status_t
test_cairo_user_to_device(cairo_t * cr)336 test_cairo_user_to_device (cairo_t *cr)
337 {
338     double x = 42, y = 42;
339 
340     cairo_user_to_device (cr, &x, &y);
341 
342     return CAIRO_TEST_SUCCESS;
343 }
344 
345 static cairo_test_status_t
test_cairo_user_to_device_distance(cairo_t * cr)346 test_cairo_user_to_device_distance (cairo_t *cr)
347 {
348     double x = 42, y = 42;
349 
350     cairo_user_to_device_distance (cr, &x, &y);
351 
352     return CAIRO_TEST_SUCCESS;
353 }
354 
355 static cairo_test_status_t
test_cairo_device_to_user(cairo_t * cr)356 test_cairo_device_to_user (cairo_t *cr)
357 {
358     double x = 42, y = 42;
359 
360     cairo_device_to_user (cr, &x, &y);
361 
362     return CAIRO_TEST_SUCCESS;
363 }
364 
365 static cairo_test_status_t
test_cairo_device_to_user_distance(cairo_t * cr)366 test_cairo_device_to_user_distance (cairo_t *cr)
367 {
368     double x = 42, y = 42;
369 
370     cairo_device_to_user_distance (cr, &x, &y);
371 
372     return CAIRO_TEST_SUCCESS;
373 }
374 
375 static cairo_test_status_t
test_cairo_new_path(cairo_t * cr)376 test_cairo_new_path (cairo_t *cr)
377 {
378     cairo_new_path (cr);
379 
380     return CAIRO_TEST_SUCCESS;
381 }
382 
383 static cairo_test_status_t
test_cairo_move_to(cairo_t * cr)384 test_cairo_move_to (cairo_t *cr)
385 {
386     cairo_move_to (cr, 2, 2);
387 
388     return CAIRO_TEST_SUCCESS;
389 }
390 
391 static cairo_test_status_t
test_cairo_new_sub_path(cairo_t * cr)392 test_cairo_new_sub_path (cairo_t *cr)
393 {
394     cairo_new_sub_path (cr);
395 
396     return CAIRO_TEST_SUCCESS;
397 }
398 
399 static cairo_test_status_t
test_cairo_line_to(cairo_t * cr)400 test_cairo_line_to (cairo_t *cr)
401 {
402     cairo_line_to (cr, 2, 2);
403 
404     return CAIRO_TEST_SUCCESS;
405 }
406 
407 static cairo_test_status_t
test_cairo_curve_to(cairo_t * cr)408 test_cairo_curve_to (cairo_t *cr)
409 {
410     cairo_curve_to (cr, 2, 2, 3, 3, 4, 4);
411 
412     return CAIRO_TEST_SUCCESS;
413 }
414 
415 static cairo_test_status_t
test_cairo_arc(cairo_t * cr)416 test_cairo_arc (cairo_t *cr)
417 {
418     cairo_arc (cr, 2, 2, 3, 0, 2 * M_PI);
419 
420     return CAIRO_TEST_SUCCESS;
421 }
422 
423 static cairo_test_status_t
test_cairo_arc_negative(cairo_t * cr)424 test_cairo_arc_negative (cairo_t *cr)
425 {
426     cairo_arc_negative (cr, 2, 2, 3, 0, 2 * M_PI);
427 
428     return CAIRO_TEST_SUCCESS;
429 }
430 
431 static cairo_test_status_t
test_cairo_rel_move_to(cairo_t * cr)432 test_cairo_rel_move_to (cairo_t *cr)
433 {
434     cairo_rel_move_to (cr, 2, 2);
435 
436     return CAIRO_TEST_SUCCESS;
437 }
438 
439 static cairo_test_status_t
test_cairo_rel_line_to(cairo_t * cr)440 test_cairo_rel_line_to (cairo_t *cr)
441 {
442     cairo_rel_line_to (cr, 2, 2);
443 
444     return CAIRO_TEST_SUCCESS;
445 }
446 
447 static cairo_test_status_t
test_cairo_rel_curve_to(cairo_t * cr)448 test_cairo_rel_curve_to (cairo_t *cr)
449 {
450     cairo_rel_curve_to (cr, 2, 2, 3, 3, 4, 4);
451 
452     return CAIRO_TEST_SUCCESS;
453 }
454 
455 static cairo_test_status_t
test_cairo_rectangle(cairo_t * cr)456 test_cairo_rectangle (cairo_t *cr)
457 {
458     cairo_rectangle (cr, 2, 2, 3, 3);
459 
460     return CAIRO_TEST_SUCCESS;
461 }
462 
463 static cairo_test_status_t
test_cairo_close_path(cairo_t * cr)464 test_cairo_close_path (cairo_t *cr)
465 {
466     cairo_close_path (cr);
467 
468     return CAIRO_TEST_SUCCESS;
469 }
470 
471 static cairo_test_status_t
test_cairo_path_extents(cairo_t * cr)472 test_cairo_path_extents (cairo_t *cr)
473 {
474     double x1, y1, x2, y2;
475     cairo_path_extents (cr, &x1, &y1, &x2, &y2);
476 
477     return CAIRO_TEST_SUCCESS;
478 }
479 
480 static cairo_test_status_t
test_cairo_paint(cairo_t * cr)481 test_cairo_paint (cairo_t *cr)
482 {
483     cairo_paint (cr);
484 
485     return CAIRO_TEST_SUCCESS;
486 }
487 
488 static cairo_test_status_t
test_cairo_paint_with_alpha(cairo_t * cr)489 test_cairo_paint_with_alpha (cairo_t *cr)
490 {
491     cairo_paint_with_alpha (cr, 0.5);
492 
493     return CAIRO_TEST_SUCCESS;
494 }
495 
496 static cairo_test_status_t
test_cairo_mask(cairo_t * cr)497 test_cairo_mask (cairo_t *cr)
498 {
499     cairo_pattern_t *pattern;
500 
501     pattern = cairo_pattern_create_rgb (0.5, 0.5, 0.5);
502     cairo_mask (cr, pattern);
503 
504     cairo_pattern_destroy (pattern);
505     return CAIRO_TEST_SUCCESS;
506 }
507 
508 static cairo_test_status_t
test_cairo_mask_surface(cairo_t * cr)509 test_cairo_mask_surface (cairo_t *cr)
510 {
511     cairo_surface_t *surface;
512 
513     surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
514     cairo_mask_surface (cr, surface, 0, 0);
515 
516     cairo_surface_destroy (surface);
517     return CAIRO_TEST_SUCCESS;
518 }
519 
520 static cairo_test_status_t
test_cairo_stroke(cairo_t * cr)521 test_cairo_stroke (cairo_t *cr)
522 {
523     cairo_stroke (cr);
524 
525     return CAIRO_TEST_SUCCESS;
526 }
527 
528 static cairo_test_status_t
test_cairo_stroke_preserve(cairo_t * cr)529 test_cairo_stroke_preserve (cairo_t *cr)
530 {
531     cairo_stroke_preserve (cr);
532 
533     return CAIRO_TEST_SUCCESS;
534 }
535 
536 static cairo_test_status_t
test_cairo_fill(cairo_t * cr)537 test_cairo_fill (cairo_t *cr)
538 {
539     cairo_fill (cr);
540 
541     return CAIRO_TEST_SUCCESS;
542 }
543 
544 static cairo_test_status_t
test_cairo_fill_preserve(cairo_t * cr)545 test_cairo_fill_preserve (cairo_t *cr)
546 {
547     cairo_fill_preserve (cr);
548 
549     return CAIRO_TEST_SUCCESS;
550 }
551 
552 static cairo_test_status_t
test_cairo_copy_page(cairo_t * cr)553 test_cairo_copy_page (cairo_t *cr)
554 {
555     cairo_copy_page (cr);
556 
557     return CAIRO_TEST_SUCCESS;
558 }
559 
560 static cairo_test_status_t
test_cairo_show_page(cairo_t * cr)561 test_cairo_show_page (cairo_t *cr)
562 {
563     cairo_show_page (cr);
564 
565     return CAIRO_TEST_SUCCESS;
566 }
567 
568 static cairo_test_status_t
test_cairo_in_stroke(cairo_t * cr)569 test_cairo_in_stroke (cairo_t *cr)
570 {
571     cairo_in_stroke (cr, 1, 1);
572 
573     return CAIRO_TEST_SUCCESS;
574 }
575 
576 static cairo_test_status_t
test_cairo_in_fill(cairo_t * cr)577 test_cairo_in_fill (cairo_t *cr)
578 {
579     cairo_in_fill (cr, 1, 1);
580 
581     return CAIRO_TEST_SUCCESS;
582 }
583 
584 static cairo_test_status_t
test_cairo_in_clip(cairo_t * cr)585 test_cairo_in_clip (cairo_t *cr)
586 {
587     cairo_in_clip (cr, 1, 1);
588 
589     return CAIRO_TEST_SUCCESS;
590 }
591 
592 static cairo_test_status_t
test_cairo_stroke_extents(cairo_t * cr)593 test_cairo_stroke_extents (cairo_t *cr)
594 {
595     double x1, y1, x2, y2;
596     cairo_stroke_extents (cr, &x1, &y1, &x2, &y2);
597 
598     return CAIRO_TEST_SUCCESS;
599 }
600 
601 static cairo_test_status_t
test_cairo_fill_extents(cairo_t * cr)602 test_cairo_fill_extents (cairo_t *cr)
603 {
604     double x1, y1, x2, y2;
605     cairo_fill_extents (cr, &x1, &y1, &x2, &y2);
606 
607     return CAIRO_TEST_SUCCESS;
608 }
609 
610 static cairo_test_status_t
test_cairo_reset_clip(cairo_t * cr)611 test_cairo_reset_clip (cairo_t *cr)
612 {
613     cairo_reset_clip (cr);
614 
615     return CAIRO_TEST_SUCCESS;
616 }
617 
618 static cairo_test_status_t
test_cairo_clip(cairo_t * cr)619 test_cairo_clip (cairo_t *cr)
620 {
621     cairo_clip (cr);
622 
623     return CAIRO_TEST_SUCCESS;
624 }
625 
626 static cairo_test_status_t
test_cairo_clip_preserve(cairo_t * cr)627 test_cairo_clip_preserve (cairo_t *cr)
628 {
629     cairo_clip_preserve (cr);
630 
631     return CAIRO_TEST_SUCCESS;
632 }
633 
634 static cairo_test_status_t
test_cairo_clip_extents(cairo_t * cr)635 test_cairo_clip_extents (cairo_t *cr)
636 {
637     double x1, y1, x2, y2;
638     cairo_clip_extents (cr, &x1, &y1, &x2, &y2);
639 
640     return CAIRO_TEST_SUCCESS;
641 }
642 
643 static cairo_test_status_t
test_cairo_copy_clip_rectangle_list(cairo_t * cr)644 test_cairo_copy_clip_rectangle_list (cairo_t *cr)
645 {
646     cairo_rectangle_list_destroy (cairo_copy_clip_rectangle_list (cr));
647 
648     return CAIRO_TEST_SUCCESS;
649 }
650 
651 static cairo_test_status_t
test_cairo_select_font_face(cairo_t * cr)652 test_cairo_select_font_face (cairo_t *cr)
653 {
654     cairo_select_font_face (cr, "Arial", CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_WEIGHT_BOLD);
655 
656     return CAIRO_TEST_SUCCESS;
657 }
658 
659 static cairo_test_status_t
test_cairo_set_font_size(cairo_t * cr)660 test_cairo_set_font_size (cairo_t *cr)
661 {
662     cairo_set_font_size (cr, 42);
663 
664     return CAIRO_TEST_SUCCESS;
665 }
666 
667 static cairo_test_status_t
test_cairo_set_font_matrix(cairo_t * cr)668 test_cairo_set_font_matrix (cairo_t *cr)
669 {
670     cairo_matrix_t matrix;
671 
672     cairo_matrix_init_translate (&matrix, 1, 1);
673     cairo_set_font_matrix (cr, &matrix);
674 
675     return CAIRO_TEST_SUCCESS;
676 }
677 
678 static cairo_test_status_t
test_cairo_get_font_matrix(cairo_t * cr)679 test_cairo_get_font_matrix (cairo_t *cr)
680 {
681     cairo_matrix_t matrix;
682 
683     cairo_get_font_matrix (cr, &matrix);
684 
685     return CAIRO_TEST_SUCCESS;
686 }
687 
688 static cairo_test_status_t
test_cairo_set_font_options(cairo_t * cr)689 test_cairo_set_font_options (cairo_t *cr)
690 {
691     cairo_font_options_t *opt = cairo_font_options_create ();
692     cairo_set_font_options (cr, opt);
693     cairo_font_options_destroy (opt);
694 
695     return CAIRO_TEST_SUCCESS;
696 }
697 
698 static cairo_test_status_t
test_cairo_get_font_options(cairo_t * cr)699 test_cairo_get_font_options (cairo_t *cr)
700 {
701     cairo_font_options_t *opt = cairo_font_options_create ();
702     cairo_get_font_options (cr, opt);
703     cairo_font_options_destroy (opt);
704 
705     return CAIRO_TEST_SUCCESS;
706 }
707 
708 static cairo_test_status_t
test_cairo_set_font_face(cairo_t * cr)709 test_cairo_set_font_face (cairo_t *cr)
710 {
711     cairo_set_font_face (cr, cairo_get_font_face (cr));
712 
713     return CAIRO_TEST_SUCCESS;
714 }
715 
716 static cairo_test_status_t
test_cairo_set_scaled_font(cairo_t * cr)717 test_cairo_set_scaled_font (cairo_t *cr)
718 {
719     cairo_set_scaled_font (cr, cairo_get_scaled_font (cr));
720 
721     return CAIRO_TEST_SUCCESS;
722 }
723 
724 static cairo_test_status_t
test_cairo_show_text(cairo_t * cr)725 test_cairo_show_text (cairo_t *cr)
726 {
727     cairo_show_text (cr, "Cairo");
728 
729     return CAIRO_TEST_SUCCESS;
730 }
731 
732 static cairo_test_status_t
test_cairo_show_glyphs(cairo_t * cr)733 test_cairo_show_glyphs (cairo_t *cr)
734 {
735     cairo_glyph_t glyph;
736 
737     glyph.index = 65;
738     glyph.x = 0;
739     glyph.y = 0;
740 
741     cairo_show_glyphs (cr, &glyph, 1);
742 
743     return CAIRO_TEST_SUCCESS;
744 }
745 
746 static cairo_test_status_t
test_cairo_show_text_glyphs(cairo_t * cr)747 test_cairo_show_text_glyphs (cairo_t *cr)
748 {
749     cairo_glyph_t glyph;
750     cairo_text_cluster_t cluster;
751 
752     glyph.index = 65;
753     glyph.x = 0;
754     glyph.y = 0;
755 
756     cluster.num_bytes = 1;
757     cluster.num_glyphs = 1;
758 
759     cairo_show_text_glyphs (cr, "a", -1, &glyph, 1, &cluster, 1, 0);
760 
761     return CAIRO_TEST_SUCCESS;
762 }
763 
764 static cairo_test_status_t
test_cairo_text_path(cairo_t * cr)765 test_cairo_text_path (cairo_t *cr)
766 {
767     cairo_text_path (cr, "Cairo");
768 
769     return CAIRO_TEST_SUCCESS;
770 }
771 
772 static cairo_test_status_t
test_cairo_glyph_path(cairo_t * cr)773 test_cairo_glyph_path (cairo_t *cr)
774 {
775     cairo_glyph_t glyph;
776 
777     glyph.index = 65;
778     glyph.x = 0;
779     glyph.y = 0;
780 
781     cairo_glyph_path (cr, &glyph, 1);
782 
783     return CAIRO_TEST_SUCCESS;
784 }
785 
786 static cairo_test_status_t
test_cairo_text_extents(cairo_t * cr)787 test_cairo_text_extents (cairo_t *cr)
788 {
789     cairo_text_extents_t extents;
790 
791     cairo_text_extents (cr, "Cairo", &extents);
792 
793     return CAIRO_TEST_SUCCESS;
794 }
795 
796 static cairo_test_status_t
test_cairo_glyph_extents(cairo_t * cr)797 test_cairo_glyph_extents (cairo_t *cr)
798 {
799     cairo_glyph_t glyph;
800     cairo_text_extents_t extents;
801 
802     glyph.index = 65;
803     glyph.x = 0;
804     glyph.y = 0;
805 
806     cairo_glyph_extents (cr, &glyph, 1, &extents);
807 
808     return CAIRO_TEST_SUCCESS;
809 }
810 
811 static cairo_test_status_t
test_cairo_font_extents(cairo_t * cr)812 test_cairo_font_extents (cairo_t *cr)
813 {
814     cairo_font_extents_t extents;
815 
816     cairo_font_extents (cr, &extents);
817 
818     return CAIRO_TEST_SUCCESS;
819 }
820 
821 static cairo_test_status_t
test_cairo_get_operator(cairo_t * cr)822 test_cairo_get_operator (cairo_t *cr)
823 {
824     cairo_get_operator (cr);
825 
826     return CAIRO_TEST_SUCCESS;
827 }
828 
829 static cairo_test_status_t
test_cairo_get_source(cairo_t * cr)830 test_cairo_get_source (cairo_t *cr)
831 {
832     cairo_get_source (cr);
833 
834     return CAIRO_TEST_SUCCESS;
835 }
836 
837 static cairo_test_status_t
test_cairo_get_tolerance(cairo_t * cr)838 test_cairo_get_tolerance (cairo_t *cr)
839 {
840     cairo_get_tolerance (cr);
841 
842     return CAIRO_TEST_SUCCESS;
843 }
844 
845 static cairo_test_status_t
test_cairo_get_antialias(cairo_t * cr)846 test_cairo_get_antialias (cairo_t *cr)
847 {
848     cairo_get_antialias (cr);
849 
850     return CAIRO_TEST_SUCCESS;
851 }
852 
853 static cairo_test_status_t
test_cairo_has_current_point(cairo_t * cr)854 test_cairo_has_current_point (cairo_t *cr)
855 {
856     cairo_has_current_point (cr);
857 
858     return CAIRO_TEST_SUCCESS;
859 }
860 
861 static cairo_test_status_t
test_cairo_get_current_point(cairo_t * cr)862 test_cairo_get_current_point (cairo_t *cr)
863 {
864     double x, y;
865 
866     cairo_get_current_point (cr, &x, &y);
867 
868     return CAIRO_TEST_SUCCESS;
869 }
870 
871 static cairo_test_status_t
test_cairo_get_fill_rule(cairo_t * cr)872 test_cairo_get_fill_rule (cairo_t *cr)
873 {
874     cairo_get_fill_rule (cr);
875 
876     return CAIRO_TEST_SUCCESS;
877 }
878 
879 static cairo_test_status_t
test_cairo_get_line_width(cairo_t * cr)880 test_cairo_get_line_width (cairo_t *cr)
881 {
882     cairo_get_line_width (cr);
883 
884     return CAIRO_TEST_SUCCESS;
885 }
886 
887 static cairo_test_status_t
test_cairo_get_line_cap(cairo_t * cr)888 test_cairo_get_line_cap (cairo_t *cr)
889 {
890     cairo_get_line_cap (cr);
891 
892     return CAIRO_TEST_SUCCESS;
893 }
894 
895 static cairo_test_status_t
test_cairo_get_line_join(cairo_t * cr)896 test_cairo_get_line_join (cairo_t *cr)
897 {
898     cairo_get_line_join (cr);
899 
900     return CAIRO_TEST_SUCCESS;
901 }
902 
903 static cairo_test_status_t
test_cairo_get_miter_limit(cairo_t * cr)904 test_cairo_get_miter_limit (cairo_t *cr)
905 {
906     cairo_get_miter_limit (cr);
907 
908     return CAIRO_TEST_SUCCESS;
909 }
910 
911 static cairo_test_status_t
test_cairo_get_dash_count(cairo_t * cr)912 test_cairo_get_dash_count (cairo_t *cr)
913 {
914     cairo_get_dash_count (cr);
915 
916     return CAIRO_TEST_SUCCESS;
917 }
918 
919 static cairo_test_status_t
test_cairo_get_dash(cairo_t * cr)920 test_cairo_get_dash (cairo_t *cr)
921 {
922     double dashes[42];
923     double offset;
924 
925     cairo_get_dash (cr, &dashes[0], &offset);
926 
927     return CAIRO_TEST_SUCCESS;
928 }
929 
930 static cairo_test_status_t
test_cairo_get_matrix(cairo_t * cr)931 test_cairo_get_matrix (cairo_t *cr)
932 {
933     cairo_matrix_t matrix;
934 
935     cairo_get_matrix (cr, &matrix);
936 
937     return CAIRO_TEST_SUCCESS;
938 }
939 
940 static cairo_test_status_t
test_cairo_get_target(cairo_t * cr)941 test_cairo_get_target (cairo_t *cr)
942 {
943     cairo_get_target (cr);
944 
945     return CAIRO_TEST_SUCCESS;
946 }
947 
948 static cairo_test_status_t
test_cairo_get_group_target(cairo_t * cr)949 test_cairo_get_group_target (cairo_t *cr)
950 {
951     cairo_get_group_target (cr);
952 
953     return CAIRO_TEST_SUCCESS;
954 }
955 
956 static cairo_test_status_t
test_cairo_copy_path(cairo_t * cr)957 test_cairo_copy_path (cairo_t *cr)
958 {
959     cairo_path_destroy (cairo_copy_path (cr));
960 
961     return CAIRO_TEST_SUCCESS;
962 }
963 
964 static cairo_test_status_t
test_cairo_copy_path_flat(cairo_t * cr)965 test_cairo_copy_path_flat (cairo_t *cr)
966 {
967     cairo_path_destroy (cairo_copy_path_flat (cr));
968 
969     return CAIRO_TEST_SUCCESS;
970 }
971 
972 static cairo_test_status_t
test_cairo_append_path(cairo_t * cr)973 test_cairo_append_path (cairo_t *cr)
974 {
975     cairo_path_data_t data[3];
976     cairo_path_t path;
977 
978     path.status = CAIRO_STATUS_SUCCESS;
979     path.data = &data[0];
980     path.num_data = ARRAY_LENGTH(data);
981 
982     data[0].header.type = CAIRO_PATH_MOVE_TO;
983     data[0].header.length = 2;
984     data[1].point.x = 1;
985     data[1].point.y = 2;
986     data[2].header.type = CAIRO_PATH_CLOSE_PATH;
987     data[2].header.length = 1;
988 
989     cairo_append_path (cr, &path);
990 
991     return CAIRO_TEST_SUCCESS;
992 }
993 
994 static cairo_test_status_t
test_cairo_surface_create_similar(cairo_surface_t * surface)995 test_cairo_surface_create_similar (cairo_surface_t *surface)
996 {
997     cairo_surface_t *similar;
998 
999     similar = cairo_surface_create_similar (surface, CAIRO_CONTENT_ALPHA, 100, 100);
1000 
1001     cairo_surface_destroy (similar);
1002     return CAIRO_TEST_SUCCESS;
1003 }
1004 
1005 static cairo_test_status_t
test_cairo_surface_create_for_rectangle(cairo_surface_t * surface)1006 test_cairo_surface_create_for_rectangle (cairo_surface_t *surface)
1007 {
1008     cairo_surface_t *similar;
1009 
1010     similar = cairo_surface_create_for_rectangle (surface, 1, 1, 8, 8);
1011 
1012     cairo_surface_destroy (similar);
1013     return CAIRO_TEST_SUCCESS;
1014 }
1015 
1016 static cairo_test_status_t
test_cairo_surface_reference(cairo_surface_t * surface)1017 test_cairo_surface_reference (cairo_surface_t *surface)
1018 {
1019     cairo_surface_destroy (cairo_surface_reference (surface));
1020     return CAIRO_TEST_SUCCESS;
1021 }
1022 
1023 static cairo_test_status_t
test_cairo_surface_finish(cairo_surface_t * surface)1024 test_cairo_surface_finish (cairo_surface_t *surface)
1025 {
1026     cairo_surface_finish (surface);
1027     return CAIRO_TEST_SUCCESS;
1028 }
1029 
1030 static cairo_test_status_t
test_cairo_surface_get_device(cairo_surface_t * surface)1031 test_cairo_surface_get_device (cairo_surface_t *surface)
1032 {
1033     /* cairo_device_t *device = */cairo_surface_get_device (surface);
1034     return CAIRO_TEST_SUCCESS;
1035 }
1036 
1037 static cairo_test_status_t
test_cairo_surface_get_reference_count(cairo_surface_t * surface)1038 test_cairo_surface_get_reference_count (cairo_surface_t *surface)
1039 {
1040     unsigned int refcount = cairo_surface_get_reference_count (surface);
1041     if (refcount > 0)
1042         return CAIRO_TEST_SUCCESS;
1043     /* inert error surfaces have a refcount of 0 */
1044     return cairo_surface_status (surface) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1045 }
1046 
1047 static cairo_test_status_t
test_cairo_surface_status(cairo_surface_t * surface)1048 test_cairo_surface_status (cairo_surface_t *surface)
1049 {
1050     cairo_status_t status = cairo_surface_status (surface);
1051     return status < CAIRO_STATUS_LAST_STATUS ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1052 }
1053 
1054 static cairo_test_status_t
test_cairo_surface_get_type(cairo_surface_t * surface)1055 test_cairo_surface_get_type (cairo_surface_t *surface)
1056 {
1057     /* cairo_surface_type_t type = */cairo_surface_get_type (surface);
1058     return CAIRO_TEST_SUCCESS;
1059 }
1060 
1061 static cairo_test_status_t
test_cairo_surface_get_content(cairo_surface_t * surface)1062 test_cairo_surface_get_content (cairo_surface_t *surface)
1063 {
1064     cairo_content_t content = cairo_surface_get_content (surface);
1065 
1066     switch (content) {
1067     case CAIRO_CONTENT_COLOR:
1068     case CAIRO_CONTENT_ALPHA:
1069     case CAIRO_CONTENT_COLOR_ALPHA:
1070         return CAIRO_TEST_SUCCESS;
1071     default:
1072         return CAIRO_TEST_ERROR;
1073     }
1074 }
1075 
1076 static cairo_test_status_t
test_cairo_surface_set_user_data(cairo_surface_t * surface)1077 test_cairo_surface_set_user_data (cairo_surface_t *surface)
1078 {
1079     static cairo_user_data_key_t key;
1080     cairo_status_t status;
1081 
1082     status = cairo_surface_set_user_data (surface, &key, &key, NULL);
1083     if (status == CAIRO_STATUS_NO_MEMORY)
1084         return CAIRO_TEST_NO_MEMORY;
1085     else if (status)
1086         return CAIRO_TEST_SUCCESS;
1087 
1088     if (cairo_surface_get_user_data (surface, &key) != &key)
1089         return CAIRO_TEST_ERROR;
1090 
1091     return CAIRO_TEST_SUCCESS;
1092 }
1093 
1094 static cairo_test_status_t
test_cairo_surface_set_mime_data(cairo_surface_t * surface)1095 test_cairo_surface_set_mime_data (cairo_surface_t *surface)
1096 {
1097     const char *mimetype = "text/x-uri";
1098     const char *data = "https://www.cairographics.org";
1099     cairo_status_t status;
1100 
1101     status = cairo_surface_set_mime_data (surface,
1102                                           mimetype,
1103                                           (const unsigned char *) data,
1104 					  strlen (data),
1105                                           NULL, NULL);
1106     return status ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1107 }
1108 
1109 static cairo_test_status_t
test_cairo_surface_get_mime_data(cairo_surface_t * surface)1110 test_cairo_surface_get_mime_data (cairo_surface_t *surface)
1111 {
1112     const char *mimetype = "text/x-uri";
1113     const unsigned char *data;
1114     unsigned long length;
1115 
1116     cairo_surface_get_mime_data (surface, mimetype, &data, &length);
1117     return data == NULL && length == 0 ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1118 }
1119 
1120 static cairo_test_status_t
test_cairo_surface_get_font_options(cairo_surface_t * surface)1121 test_cairo_surface_get_font_options (cairo_surface_t *surface)
1122 {
1123     cairo_font_options_t *options;
1124     cairo_status_t status;
1125 
1126     options = cairo_font_options_create ();
1127     if (likely (!cairo_font_options_status (options)))
1128         cairo_surface_get_font_options (surface, options);
1129     status = cairo_font_options_status (options);
1130     cairo_font_options_destroy (options);
1131     return status ? CAIRO_TEST_ERROR : CAIRO_TEST_SUCCESS;
1132 }
1133 
1134 static cairo_test_status_t
test_cairo_surface_flush(cairo_surface_t * surface)1135 test_cairo_surface_flush (cairo_surface_t *surface)
1136 {
1137     cairo_surface_flush (surface);
1138     return CAIRO_TEST_SUCCESS;
1139 }
1140 
1141 static cairo_test_status_t
test_cairo_surface_mark_dirty(cairo_surface_t * surface)1142 test_cairo_surface_mark_dirty (cairo_surface_t *surface)
1143 {
1144     cairo_surface_mark_dirty (surface);
1145     return CAIRO_TEST_SUCCESS;
1146 }
1147 
1148 static cairo_test_status_t
test_cairo_surface_mark_dirty_rectangle(cairo_surface_t * surface)1149 test_cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface)
1150 {
1151     cairo_surface_mark_dirty_rectangle (surface, 1, 1, 8, 8);
1152     return CAIRO_TEST_SUCCESS;
1153 }
1154 
1155 static cairo_test_status_t
test_cairo_surface_set_device_offset(cairo_surface_t * surface)1156 test_cairo_surface_set_device_offset (cairo_surface_t *surface)
1157 {
1158     cairo_surface_set_device_offset (surface, 5, 5);
1159     return CAIRO_TEST_SUCCESS;
1160 }
1161 
1162 static cairo_test_status_t
test_cairo_surface_get_device_offset(cairo_surface_t * surface)1163 test_cairo_surface_get_device_offset (cairo_surface_t *surface)
1164 {
1165     double x, y;
1166 
1167     cairo_surface_get_device_offset (surface, &x, &y);
1168     return CAIRO_TEST_SUCCESS;
1169 }
1170 
1171 static cairo_test_status_t
test_cairo_surface_set_fallback_resolution(cairo_surface_t * surface)1172 test_cairo_surface_set_fallback_resolution (cairo_surface_t *surface)
1173 {
1174     cairo_surface_set_fallback_resolution (surface, 42, 42);
1175     return CAIRO_TEST_SUCCESS;
1176 }
1177 
1178 static cairo_test_status_t
test_cairo_surface_get_fallback_resolution(cairo_surface_t * surface)1179 test_cairo_surface_get_fallback_resolution (cairo_surface_t *surface)
1180 {
1181     double x, y;
1182 
1183     cairo_surface_get_fallback_resolution (surface, &x, &y);
1184     return CAIRO_TEST_SUCCESS;
1185 }
1186 
1187 static cairo_test_status_t
test_cairo_surface_copy_page(cairo_surface_t * surface)1188 test_cairo_surface_copy_page (cairo_surface_t *surface)
1189 {
1190     cairo_surface_copy_page (surface);
1191     return CAIRO_TEST_SUCCESS;
1192 }
1193 
1194 static cairo_test_status_t
test_cairo_surface_show_page(cairo_surface_t * surface)1195 test_cairo_surface_show_page (cairo_surface_t *surface)
1196 {
1197     cairo_surface_show_page (surface);
1198     return CAIRO_TEST_SUCCESS;
1199 }
1200 
1201 static cairo_test_status_t
test_cairo_surface_has_show_text_glyphs(cairo_surface_t * surface)1202 test_cairo_surface_has_show_text_glyphs (cairo_surface_t *surface)
1203 {
1204     cairo_surface_has_show_text_glyphs (surface);
1205     return CAIRO_TEST_SUCCESS;
1206 }
1207 
1208 static cairo_test_status_t
test_cairo_image_surface_get_data(cairo_surface_t * surface)1209 test_cairo_image_surface_get_data (cairo_surface_t *surface)
1210 {
1211     unsigned char *data = cairo_image_surface_get_data (surface);
1212     return data == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1213 }
1214 
1215 static cairo_test_status_t
test_cairo_image_surface_get_format(cairo_surface_t * surface)1216 test_cairo_image_surface_get_format (cairo_surface_t *surface)
1217 {
1218     cairo_format_t format = cairo_image_surface_get_format (surface);
1219     return format == CAIRO_FORMAT_INVALID || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1220 }
1221 
1222 static cairo_test_status_t
test_cairo_image_surface_get_width(cairo_surface_t * surface)1223 test_cairo_image_surface_get_width (cairo_surface_t *surface)
1224 {
1225     unsigned int width = cairo_image_surface_get_width (surface);
1226     return width == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1227 }
1228 
1229 static cairo_test_status_t
test_cairo_image_surface_get_height(cairo_surface_t * surface)1230 test_cairo_image_surface_get_height (cairo_surface_t *surface)
1231 {
1232     unsigned int height = cairo_image_surface_get_height (surface);
1233     return height == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1234 }
1235 
1236 static cairo_test_status_t
test_cairo_image_surface_get_stride(cairo_surface_t * surface)1237 test_cairo_image_surface_get_stride (cairo_surface_t *surface)
1238 {
1239     unsigned int stride = cairo_image_surface_get_stride (surface);
1240     return stride == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1241 }
1242 
1243 #if CAIRO_HAS_PNG_FUNCTIONS
1244 
1245 static cairo_test_status_t
test_cairo_surface_write_to_png(cairo_surface_t * surface)1246 test_cairo_surface_write_to_png (cairo_surface_t *surface)
1247 {
1248     cairo_status_t status;
1249 
1250     status = cairo_surface_write_to_png (surface, "/this/file/will/definitely/not/exist.png");
1251 
1252     return status ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1253 }
1254 
1255 static cairo_status_t
write_func_that_always_fails(void * closure,const unsigned char * data,unsigned int length)1256 write_func_that_always_fails (void *closure, const unsigned char *data, unsigned int length)
1257 {
1258     return CAIRO_STATUS_WRITE_ERROR;
1259 }
1260 
1261 static cairo_test_status_t
test_cairo_surface_write_to_png_stream(cairo_surface_t * surface)1262 test_cairo_surface_write_to_png_stream (cairo_surface_t *surface)
1263 {
1264     cairo_status_t status;
1265 
1266     status = cairo_surface_write_to_png_stream (surface,
1267                                                 write_func_that_always_fails,
1268                                                 NULL);
1269 
1270     return status && status != CAIRO_STATUS_WRITE_ERROR ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1271 }
1272 
1273 #endif /* CAIRO_HAS_PNG_FUNCTIONS */
1274 
1275 static cairo_test_status_t
test_cairo_recording_surface_ink_extents(cairo_surface_t * surface)1276 test_cairo_recording_surface_ink_extents (cairo_surface_t *surface)
1277 {
1278     double x, y, w, h;
1279 
1280     cairo_recording_surface_ink_extents (surface, &x, &y, &w, &h);
1281     return x == 0 && y == 0 && w == 0 && h == 0 ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1282 }
1283 
1284 #if CAIRO_HAS_TEE_SURFACE
1285 
1286 static cairo_test_status_t
test_cairo_tee_surface_add(cairo_surface_t * surface)1287 test_cairo_tee_surface_add (cairo_surface_t *surface)
1288 {
1289     cairo_surface_t *image = cairo_image_surface_create (CAIRO_FORMAT_A8, 10, 10);
1290 
1291     cairo_tee_surface_add (surface, image);
1292     cairo_surface_destroy (image);
1293     return CAIRO_TEST_SUCCESS;
1294 }
1295 
1296 static cairo_test_status_t
test_cairo_tee_surface_remove(cairo_surface_t * surface)1297 test_cairo_tee_surface_remove (cairo_surface_t *surface)
1298 {
1299     cairo_surface_t *image = cairo_image_surface_create (CAIRO_FORMAT_A8, 10, 10);
1300 
1301     cairo_tee_surface_remove (surface, image);
1302     cairo_surface_destroy (image);
1303     return CAIRO_TEST_SUCCESS;
1304 }
1305 
1306 static cairo_test_status_t
test_cairo_tee_surface_index(cairo_surface_t * surface)1307 test_cairo_tee_surface_index (cairo_surface_t *surface)
1308 {
1309     cairo_surface_t *master;
1310     cairo_status_t status;
1311 
1312     master = cairo_tee_surface_index (surface, 0);
1313     status = cairo_surface_status (master);
1314     cairo_surface_destroy (master);
1315     return status ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1316 }
1317 
1318 #endif /* CAIRO_HAS_TEE_SURFACE */
1319 
1320 #if CAIRO_HAS_GL_SURFACE
1321 
1322 static cairo_test_status_t
test_cairo_gl_surface_set_size(cairo_surface_t * surface)1323 test_cairo_gl_surface_set_size (cairo_surface_t *surface)
1324 {
1325     cairo_gl_surface_set_size (surface, 5, 5);
1326     return CAIRO_TEST_SUCCESS;
1327 }
1328 
1329 static cairo_test_status_t
test_cairo_gl_surface_get_width(cairo_surface_t * surface)1330 test_cairo_gl_surface_get_width (cairo_surface_t *surface)
1331 {
1332     unsigned int width = cairo_gl_surface_get_width (surface);
1333     return width == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_GL) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1334 }
1335 
1336 static cairo_test_status_t
test_cairo_gl_surface_get_height(cairo_surface_t * surface)1337 test_cairo_gl_surface_get_height (cairo_surface_t *surface)
1338 {
1339     unsigned int height = cairo_gl_surface_get_height (surface);
1340     return height == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_GL) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1341 }
1342 
1343 static cairo_test_status_t
test_cairo_gl_surface_swapbuffers(cairo_surface_t * surface)1344 test_cairo_gl_surface_swapbuffers (cairo_surface_t *surface)
1345 {
1346     cairo_gl_surface_swapbuffers (surface);
1347     return CAIRO_TEST_SUCCESS;
1348 }
1349 
1350 #endif /* CAIRO_HAS_GL_SURFACE */
1351 
1352 #if CAIRO_HAS_PDF_SURFACE
1353 
1354 static cairo_test_status_t
test_cairo_pdf_surface_restrict_to_version(cairo_surface_t * surface)1355 test_cairo_pdf_surface_restrict_to_version (cairo_surface_t *surface)
1356 {
1357     cairo_pdf_surface_restrict_to_version (surface, CAIRO_PDF_VERSION_1_4);
1358     return CAIRO_TEST_SUCCESS;
1359 }
1360 
1361 static cairo_test_status_t
test_cairo_pdf_surface_set_size(cairo_surface_t * surface)1362 test_cairo_pdf_surface_set_size (cairo_surface_t *surface)
1363 {
1364     cairo_pdf_surface_set_size (surface, 5, 5);
1365     return CAIRO_TEST_SUCCESS;
1366 }
1367 
1368 #endif /* CAIRO_HAS_PDF_SURFACE */
1369 
1370 #if CAIRO_HAS_PS_SURFACE
1371 
1372 static cairo_test_status_t
test_cairo_ps_surface_restrict_to_level(cairo_surface_t * surface)1373 test_cairo_ps_surface_restrict_to_level (cairo_surface_t *surface)
1374 {
1375     cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2);
1376     return CAIRO_TEST_SUCCESS;
1377 }
1378 
1379 static cairo_test_status_t
test_cairo_ps_surface_set_eps(cairo_surface_t * surface)1380 test_cairo_ps_surface_set_eps (cairo_surface_t *surface)
1381 {
1382     cairo_ps_surface_set_eps (surface, TRUE);
1383     return CAIRO_TEST_SUCCESS;
1384 }
1385 
1386 static cairo_test_status_t
test_cairo_ps_surface_get_eps(cairo_surface_t * surface)1387 test_cairo_ps_surface_get_eps (cairo_surface_t *surface)
1388 {
1389     cairo_bool_t eps = cairo_ps_surface_get_eps (surface);
1390     return eps ? CAIRO_TEST_ERROR : CAIRO_TEST_SUCCESS;
1391 }
1392 
1393 static cairo_test_status_t
test_cairo_ps_surface_set_size(cairo_surface_t * surface)1394 test_cairo_ps_surface_set_size (cairo_surface_t *surface)
1395 {
1396     cairo_ps_surface_set_size (surface, 5, 5);
1397     return CAIRO_TEST_SUCCESS;
1398 }
1399 
1400 static cairo_test_status_t
test_cairo_ps_surface_dsc_comment(cairo_surface_t * surface)1401 test_cairo_ps_surface_dsc_comment (cairo_surface_t *surface)
1402 {
1403     cairo_ps_surface_dsc_comment (surface, "54, 74, 90, 2010");
1404     return CAIRO_TEST_SUCCESS;
1405 }
1406 
1407 static cairo_test_status_t
test_cairo_ps_surface_dsc_begin_setup(cairo_surface_t * surface)1408 test_cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface)
1409 {
1410     cairo_ps_surface_dsc_begin_setup (surface);
1411     return CAIRO_TEST_SUCCESS;
1412 }
1413 
1414 static cairo_test_status_t
test_cairo_ps_surface_dsc_begin_page_setup(cairo_surface_t * surface)1415 test_cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface)
1416 {
1417     cairo_ps_surface_dsc_begin_page_setup (surface);
1418     return CAIRO_TEST_SUCCESS;
1419 }
1420 
1421 #endif /* CAIRO_HAS_PS_SURFACE */
1422 
1423 #if CAIRO_HAS_QUARTZ_SURFACE
1424 
1425 static cairo_test_status_t
test_cairo_quartz_surface_get_cg_context(cairo_surface_t * surface)1426 test_cairo_quartz_surface_get_cg_context (cairo_surface_t *surface)
1427 {
1428     CGContextRef context = cairo_quartz_surface_get_cg_context (surface);
1429     return context == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_QUARTZ) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1430 }
1431 
1432 #endif /* CAIRO_HAS_QUARTZ_SURFACE */
1433 
1434 #if CAIRO_HAS_SVG_SURFACE
1435 
1436 static cairo_test_status_t
test_cairo_svg_surface_restrict_to_version(cairo_surface_t * surface)1437 test_cairo_svg_surface_restrict_to_version (cairo_surface_t *surface)
1438 {
1439     cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_1);
1440     return CAIRO_TEST_SUCCESS;
1441 }
1442 
1443 #endif /* CAIRO_HAS_SVG_SURFACE */
1444 
1445 #if CAIRO_HAS_XCB_SURFACE
1446 
1447 static cairo_test_status_t
test_cairo_xcb_surface_set_size(cairo_surface_t * surface)1448 test_cairo_xcb_surface_set_size (cairo_surface_t *surface)
1449 {
1450     cairo_xcb_surface_set_size (surface, 5, 5);
1451     return CAIRO_TEST_SUCCESS;
1452 }
1453 
1454 static cairo_test_status_t
test_cairo_xcb_surface_set_drawable(cairo_surface_t * surface)1455 test_cairo_xcb_surface_set_drawable (cairo_surface_t *surface)
1456 {
1457     cairo_xcb_surface_set_drawable (surface, 0, 5, 5);
1458     return CAIRO_TEST_SUCCESS;
1459 }
1460 
1461 #endif
1462 
1463 #if CAIRO_HAS_XLIB_SURFACE
1464 
1465 static cairo_test_status_t
test_cairo_xlib_surface_set_size(cairo_surface_t * surface)1466 test_cairo_xlib_surface_set_size (cairo_surface_t *surface)
1467 {
1468     cairo_xlib_surface_set_size (surface, 5, 5);
1469     return CAIRO_TEST_SUCCESS;
1470 }
1471 
1472 static cairo_test_status_t
test_cairo_xlib_surface_set_drawable(cairo_surface_t * surface)1473 test_cairo_xlib_surface_set_drawable (cairo_surface_t *surface)
1474 {
1475     cairo_xlib_surface_set_drawable (surface, 0, 5, 5);
1476     return CAIRO_TEST_SUCCESS;
1477 }
1478 
1479 static cairo_test_status_t
test_cairo_xlib_surface_get_display(cairo_surface_t * surface)1480 test_cairo_xlib_surface_get_display (cairo_surface_t *surface)
1481 {
1482     Display *display = cairo_xlib_surface_get_display (surface);
1483     return display == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1484 }
1485 
1486 static cairo_test_status_t
test_cairo_xlib_surface_get_screen(cairo_surface_t * surface)1487 test_cairo_xlib_surface_get_screen (cairo_surface_t *surface)
1488 {
1489     Screen *screen = cairo_xlib_surface_get_screen (surface);
1490     return screen == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1491 }
1492 
1493 static cairo_test_status_t
test_cairo_xlib_surface_get_visual(cairo_surface_t * surface)1494 test_cairo_xlib_surface_get_visual (cairo_surface_t *surface)
1495 {
1496     Visual *visual = cairo_xlib_surface_get_visual (surface);
1497     return visual == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1498 }
1499 
1500 static cairo_test_status_t
test_cairo_xlib_surface_get_drawable(cairo_surface_t * surface)1501 test_cairo_xlib_surface_get_drawable (cairo_surface_t *surface)
1502 {
1503     Drawable drawable = cairo_xlib_surface_get_drawable (surface);
1504     return drawable == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1505 }
1506 
1507 static cairo_test_status_t
test_cairo_xlib_surface_get_depth(cairo_surface_t * surface)1508 test_cairo_xlib_surface_get_depth (cairo_surface_t *surface)
1509 {
1510     int depth = cairo_xlib_surface_get_depth (surface);
1511     return depth == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1512 }
1513 
1514 static cairo_test_status_t
test_cairo_xlib_surface_get_width(cairo_surface_t * surface)1515 test_cairo_xlib_surface_get_width (cairo_surface_t *surface)
1516 {
1517     int width = cairo_xlib_surface_get_width (surface);
1518     return width == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1519 }
1520 
1521 static cairo_test_status_t
test_cairo_xlib_surface_get_height(cairo_surface_t * surface)1522 test_cairo_xlib_surface_get_height (cairo_surface_t *surface)
1523 {
1524     int height = cairo_xlib_surface_get_height (surface);
1525     return height == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR;
1526 }
1527 
1528 #endif
1529 
1530 #define TEST(name) { #name, test_ ## name }
1531 
1532 struct {
1533     const char *name;
1534     context_test_func_t func;
1535 } context_tests[] = {
1536     TEST (cairo_reference),
1537     TEST (cairo_get_reference_count),
1538     TEST (cairo_set_user_data),
1539     TEST (cairo_save),
1540     TEST (cairo_push_group),
1541     TEST (cairo_push_group_with_content),
1542     TEST (cairo_set_operator),
1543     TEST (cairo_set_source),
1544     TEST (cairo_set_source_rgb),
1545     TEST (cairo_set_source_rgba),
1546     TEST (cairo_set_source_surface),
1547     TEST (cairo_set_tolerance),
1548     TEST (cairo_set_antialias),
1549     TEST (cairo_set_fill_rule),
1550     TEST (cairo_set_line_width),
1551     TEST (cairo_set_line_cap),
1552     TEST (cairo_set_line_join),
1553     TEST (cairo_set_dash),
1554     TEST (cairo_set_miter_limit),
1555     TEST (cairo_translate),
1556     TEST (cairo_scale),
1557     TEST (cairo_rotate),
1558     TEST (cairo_transform),
1559     TEST (cairo_set_matrix),
1560     TEST (cairo_identity_matrix),
1561     TEST (cairo_user_to_device),
1562     TEST (cairo_user_to_device_distance),
1563     TEST (cairo_device_to_user),
1564     TEST (cairo_device_to_user_distance),
1565     TEST (cairo_new_path),
1566     TEST (cairo_move_to),
1567     TEST (cairo_new_sub_path),
1568     TEST (cairo_line_to),
1569     TEST (cairo_curve_to),
1570     TEST (cairo_arc),
1571     TEST (cairo_arc_negative),
1572     TEST (cairo_rel_move_to),
1573     TEST (cairo_rel_line_to),
1574     TEST (cairo_rel_curve_to),
1575     TEST (cairo_rectangle),
1576     TEST (cairo_close_path),
1577     TEST (cairo_path_extents),
1578     TEST (cairo_paint),
1579     TEST (cairo_paint_with_alpha),
1580     TEST (cairo_mask),
1581     TEST (cairo_mask_surface),
1582     TEST (cairo_stroke),
1583     TEST (cairo_stroke_preserve),
1584     TEST (cairo_fill),
1585     TEST (cairo_fill_preserve),
1586     TEST (cairo_copy_page),
1587     TEST (cairo_show_page),
1588     TEST (cairo_in_stroke),
1589     TEST (cairo_in_fill),
1590     TEST (cairo_in_clip),
1591     TEST (cairo_stroke_extents),
1592     TEST (cairo_fill_extents),
1593     TEST (cairo_reset_clip),
1594     TEST (cairo_clip),
1595     TEST (cairo_clip_preserve),
1596     TEST (cairo_clip_extents),
1597     TEST (cairo_copy_clip_rectangle_list),
1598     TEST (cairo_select_font_face),
1599     TEST (cairo_set_font_size),
1600     TEST (cairo_set_font_matrix),
1601     TEST (cairo_get_font_matrix),
1602     TEST (cairo_set_font_options),
1603     TEST (cairo_get_font_options),
1604     TEST (cairo_set_font_face),
1605     TEST (cairo_set_scaled_font),
1606     TEST (cairo_show_text),
1607     TEST (cairo_show_glyphs),
1608     TEST (cairo_show_text_glyphs),
1609     TEST (cairo_text_path),
1610     TEST (cairo_glyph_path),
1611     TEST (cairo_text_extents),
1612     TEST (cairo_glyph_extents),
1613     TEST (cairo_font_extents),
1614     TEST (cairo_get_operator),
1615     TEST (cairo_get_source),
1616     TEST (cairo_get_tolerance),
1617     TEST (cairo_get_antialias),
1618     TEST (cairo_has_current_point),
1619     TEST (cairo_get_current_point),
1620     TEST (cairo_get_fill_rule),
1621     TEST (cairo_get_line_width),
1622     TEST (cairo_get_line_cap),
1623     TEST (cairo_get_line_join),
1624     TEST (cairo_get_miter_limit),
1625     TEST (cairo_get_dash_count),
1626     TEST (cairo_get_dash),
1627     TEST (cairo_get_matrix),
1628     TEST (cairo_get_target),
1629     TEST (cairo_get_group_target),
1630     TEST (cairo_copy_path),
1631     TEST (cairo_copy_path_flat),
1632     TEST (cairo_append_path),
1633 };
1634 
1635 #undef TEST
1636 
1637 #define TEST(name, surface_type, sets_status) { #name, test_ ## name, surface_type, sets_status }
1638 
1639 struct {
1640     const char *name;
1641     surface_test_func_t func;
1642     int surface_type; /* cairo_surface_type_t or -1 */
1643     cairo_bool_t modifies_surface;
1644 } surface_tests[] = {
1645     TEST (cairo_surface_create_similar, -1, FALSE),
1646     TEST (cairo_surface_create_for_rectangle, -1, FALSE),
1647     TEST (cairo_surface_reference, -1, FALSE),
1648     TEST (cairo_surface_finish, -1, TRUE),
1649     TEST (cairo_surface_get_device, -1, FALSE),
1650     TEST (cairo_surface_get_reference_count, -1, FALSE),
1651     TEST (cairo_surface_status, -1, FALSE),
1652     TEST (cairo_surface_get_type, -1, FALSE),
1653     TEST (cairo_surface_get_content, -1, FALSE),
1654     TEST (cairo_surface_set_user_data, -1, FALSE),
1655     TEST (cairo_surface_set_mime_data, -1, TRUE),
1656     TEST (cairo_surface_get_mime_data, -1, FALSE),
1657     TEST (cairo_surface_get_font_options, -1, FALSE),
1658     TEST (cairo_surface_flush, -1, TRUE),
1659     TEST (cairo_surface_mark_dirty, -1, TRUE),
1660     TEST (cairo_surface_mark_dirty_rectangle, -1, TRUE),
1661     TEST (cairo_surface_set_device_offset, -1, TRUE),
1662     TEST (cairo_surface_get_device_offset, -1, FALSE),
1663     TEST (cairo_surface_set_fallback_resolution, -1, TRUE),
1664     TEST (cairo_surface_get_fallback_resolution, -1, FALSE),
1665     TEST (cairo_surface_copy_page, -1, TRUE),
1666     TEST (cairo_surface_show_page, -1, TRUE),
1667     TEST (cairo_surface_has_show_text_glyphs, -1, FALSE),
1668     TEST (cairo_image_surface_get_data, CAIRO_SURFACE_TYPE_IMAGE, FALSE),
1669     TEST (cairo_image_surface_get_format, CAIRO_SURFACE_TYPE_IMAGE, FALSE),
1670     TEST (cairo_image_surface_get_width, CAIRO_SURFACE_TYPE_IMAGE, FALSE),
1671     TEST (cairo_image_surface_get_height, CAIRO_SURFACE_TYPE_IMAGE, FALSE),
1672     TEST (cairo_image_surface_get_stride, CAIRO_SURFACE_TYPE_IMAGE, FALSE),
1673 #if CAIRO_HAS_PNG_FUNCTIONS
1674     TEST (cairo_surface_write_to_png, -1, FALSE),
1675     TEST (cairo_surface_write_to_png_stream, -1, FALSE),
1676 #endif
1677     TEST (cairo_recording_surface_ink_extents, CAIRO_SURFACE_TYPE_RECORDING, FALSE),
1678 #if CAIRO_HAS_TEE_SURFACE
1679     TEST (cairo_tee_surface_add, CAIRO_SURFACE_TYPE_TEE, TRUE),
1680     TEST (cairo_tee_surface_remove, CAIRO_SURFACE_TYPE_TEE, TRUE),
1681     TEST (cairo_tee_surface_index, CAIRO_SURFACE_TYPE_TEE, FALSE),
1682 #endif
1683 #if CAIRO_HAS_GL_SURFACE
1684     TEST (cairo_gl_surface_set_size, CAIRO_SURFACE_TYPE_GL, TRUE),
1685     TEST (cairo_gl_surface_get_width, CAIRO_SURFACE_TYPE_GL, FALSE),
1686     TEST (cairo_gl_surface_get_height, CAIRO_SURFACE_TYPE_GL, FALSE),
1687     TEST (cairo_gl_surface_swapbuffers, CAIRO_SURFACE_TYPE_GL, TRUE),
1688 #endif
1689 #if CAIRO_HAS_PDF_SURFACE
1690     TEST (cairo_pdf_surface_restrict_to_version, CAIRO_SURFACE_TYPE_PDF, TRUE),
1691     TEST (cairo_pdf_surface_set_size, CAIRO_SURFACE_TYPE_PDF, TRUE),
1692 #endif
1693 #if CAIRO_HAS_PS_SURFACE
1694     TEST (cairo_ps_surface_restrict_to_level, CAIRO_SURFACE_TYPE_PS, TRUE),
1695     TEST (cairo_ps_surface_set_eps, CAIRO_SURFACE_TYPE_PS, TRUE),
1696     TEST (cairo_ps_surface_get_eps, CAIRO_SURFACE_TYPE_PS, FALSE),
1697     TEST (cairo_ps_surface_set_size, CAIRO_SURFACE_TYPE_PS, TRUE),
1698     TEST (cairo_ps_surface_dsc_comment, CAIRO_SURFACE_TYPE_PS, TRUE),
1699     TEST (cairo_ps_surface_dsc_begin_setup, CAIRO_SURFACE_TYPE_PS, TRUE),
1700     TEST (cairo_ps_surface_dsc_begin_page_setup, CAIRO_SURFACE_TYPE_PS, TRUE),
1701 #endif
1702 #if CAIRO_HAS_QUARTZ_SURFACE
1703     TEST (cairo_quartz_surface_get_cg_context, CAIRO_SURFACE_TYPE_QUARTZ, FALSE),
1704 #endif
1705 #if CAIRO_HAS_SVG_SURFACE
1706     TEST (cairo_svg_surface_restrict_to_version, CAIRO_SURFACE_TYPE_SVG, TRUE),
1707 #endif
1708 #if CAIRO_HAS_XCB_SURFACE
1709     TEST (cairo_xcb_surface_set_size, CAIRO_SURFACE_TYPE_XCB, TRUE),
1710     TEST (cairo_xcb_surface_set_drawable, CAIRO_SURFACE_TYPE_XCB, TRUE),
1711 #endif
1712 #if CAIRO_HAS_XLIB_SURFACE
1713     TEST (cairo_xlib_surface_set_size, CAIRO_SURFACE_TYPE_XLIB, TRUE),
1714     TEST (cairo_xlib_surface_set_drawable, CAIRO_SURFACE_TYPE_XLIB, TRUE),
1715     TEST (cairo_xlib_surface_get_display, CAIRO_SURFACE_TYPE_XLIB, FALSE),
1716     TEST (cairo_xlib_surface_get_drawable, CAIRO_SURFACE_TYPE_XLIB, FALSE),
1717     TEST (cairo_xlib_surface_get_screen, CAIRO_SURFACE_TYPE_XLIB, FALSE),
1718     TEST (cairo_xlib_surface_get_visual, CAIRO_SURFACE_TYPE_XLIB, FALSE),
1719     TEST (cairo_xlib_surface_get_depth, CAIRO_SURFACE_TYPE_XLIB, FALSE),
1720     TEST (cairo_xlib_surface_get_width, CAIRO_SURFACE_TYPE_XLIB, FALSE),
1721     TEST (cairo_xlib_surface_get_height, CAIRO_SURFACE_TYPE_XLIB, FALSE),
1722 #endif
1723 };
1724 
1725 static cairo_test_status_t
preamble(cairo_test_context_t * ctx)1726 preamble (cairo_test_context_t *ctx)
1727 {
1728     cairo_surface_t *surface;
1729     cairo_t *cr;
1730     cairo_test_status_t test_status;
1731     cairo_status_t status_before, status_after;
1732     unsigned int i;
1733 
1734     /* Test an error surface */
1735     for (i = 0; i < ARRAY_LENGTH (surface_tests); i++) {
1736         surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, INT_MAX, INT_MAX);
1737         status_before = cairo_surface_status (surface);
1738         assert (status_before);
1739 
1740         test_status = surface_tests[i].func (surface);
1741 
1742         status_after = cairo_surface_status (surface);
1743         cairo_surface_destroy (surface);
1744 
1745         if (test_status != CAIRO_TEST_SUCCESS) {
1746             cairo_test_log (ctx,
1747                             "Failed test %s with %d\n",
1748                             surface_tests[i].name, (int) test_status);
1749             return test_status;
1750         }
1751 
1752         if (status_before != status_after) {
1753             cairo_test_log (ctx,
1754                             "Failed test %s: Modified surface status from %u (%s) to %u (%s)\n",
1755                             surface_tests[i].name,
1756                             status_before, cairo_status_to_string (status_before),
1757                             status_after, cairo_status_to_string (status_after));
1758             return CAIRO_TEST_ERROR;
1759         }
1760     }
1761 
1762     /* Test an error context */
1763     for (i = 0; i < ARRAY_LENGTH (context_tests); i++) {
1764         cr = cairo_create (NULL);
1765         status_before = cairo_status (cr);
1766         assert (status_before);
1767 
1768         test_status = context_tests[i].func (cr);
1769 
1770         status_after = cairo_status (cr);
1771         cairo_destroy (cr);
1772 
1773         if (test_status != CAIRO_TEST_SUCCESS) {
1774             cairo_test_log (ctx,
1775                             "Failed test %s with %d\n",
1776                             context_tests[i].name, (int) test_status);
1777             return test_status;
1778         }
1779 
1780         if (status_before != status_after) {
1781             cairo_test_log (ctx,
1782                             "Failed test %s: Modified context status from %u (%s) to %u (%s)\n",
1783                             context_tests[i].name,
1784                             status_before, cairo_status_to_string (status_before),
1785                             status_after, cairo_status_to_string (status_after));
1786             return CAIRO_TEST_ERROR;
1787         }
1788     }
1789 
1790     /* Test a context for an error surface */
1791     for (i = 0; i < ARRAY_LENGTH (context_tests); i++) {
1792         surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, INT_MAX, INT_MAX);
1793         cr = cairo_create (surface);
1794         cairo_surface_destroy (surface);
1795         status_before = cairo_status (cr);
1796         assert (status_before);
1797 
1798         test_status = context_tests[i].func (cr);
1799 
1800         status_after = cairo_status (cr);
1801         cairo_destroy (cr);
1802 
1803         if (test_status != CAIRO_TEST_SUCCESS) {
1804             cairo_test_log (ctx,
1805                             "Failed test %s with %d\n",
1806                             context_tests[i].name, (int) test_status);
1807             return test_status;
1808         }
1809 
1810         if (status_before != status_after) {
1811             cairo_test_log (ctx,
1812                             "Failed test %s: Modified context status from %u (%s) to %u (%s)\n",
1813                             context_tests[i].name,
1814                             status_before, cairo_status_to_string (status_before),
1815                             status_after, cairo_status_to_string (status_after));
1816             return CAIRO_TEST_ERROR;
1817         }
1818     }
1819 
1820     return CAIRO_TEST_SUCCESS;
1821 }
1822 
1823 static cairo_test_status_t
test_context(const cairo_test_context_t * ctx,cairo_t * cr,const char * name,unsigned int i)1824 test_context (const cairo_test_context_t *ctx, cairo_t *cr, const char *name, unsigned int i)
1825 {
1826     cairo_test_status_t test_status;
1827     cairo_status_t status_before, status_after;
1828 
1829     /* Make sure that there is a current point */
1830     cairo_move_to (cr, 0, 0);
1831 
1832     status_before = cairo_status (cr);
1833     test_status = context_tests[i].func (cr);
1834     status_after = cairo_status (cr);
1835 
1836     if (test_status != CAIRO_TEST_SUCCESS) {
1837         cairo_test_log (ctx,
1838                         "Failed test %s on %s with %d\n",
1839                         context_tests[i].name, name, (int) test_status);
1840         return test_status;
1841     }
1842 
1843     if (status_after != CAIRO_STATUS_SURFACE_FINISHED && status_before != status_after) {
1844         cairo_test_log (ctx,
1845                         "Failed test %s on %s: Modified context status from %u (%s) to %u (%s)\n",
1846                         context_tests[i].name, name,
1847                         status_before, cairo_status_to_string (status_before),
1848                         status_after, cairo_status_to_string (status_after));
1849         return CAIRO_TEST_ERROR;
1850     }
1851 
1852     return CAIRO_TEST_SUCCESS;
1853 }
1854 
1855 static cairo_test_status_t
draw(cairo_t * cr,int width,int height)1856 draw (cairo_t *cr, int width, int height)
1857 {
1858     const cairo_test_context_t *ctx = cairo_test_get_context (cr);
1859     cairo_surface_t *similar, *target;
1860     cairo_test_status_t test_status;
1861     cairo_status_t status;
1862     cairo_t *cr2;
1863     unsigned int i;
1864 
1865     target = cairo_get_target (cr);
1866 
1867     /* Test a finished similar surface */
1868     for (i = 0; i < ARRAY_LENGTH (surface_tests); i++) {
1869         similar = cairo_surface_create_similar (target,
1870                                                 cairo_surface_get_content (target),
1871                                                 10, 10);
1872         cairo_surface_finish (similar);
1873         test_status = surface_tests[i].func (similar);
1874         status = cairo_surface_status (similar);
1875         cairo_surface_destroy (similar);
1876 
1877         if (test_status != CAIRO_TEST_SUCCESS) {
1878             cairo_test_log (ctx,
1879                             "Failed test %s with %d\n",
1880                             surface_tests[i].name, (int) test_status);
1881             return test_status;
1882         }
1883 
1884         if (surface_tests[i].modifies_surface &&
1885             strcmp (surface_tests[i].name, "cairo_surface_finish") &&
1886             strcmp (surface_tests[i].name, "cairo_surface_flush") &&
1887             status != CAIRO_STATUS_SURFACE_FINISHED) {
1888             cairo_test_log (ctx,
1889                             "Failed test %s: Finished surface not set into error state\n",
1890                             surface_tests[i].name);
1891             return CAIRO_TEST_ERROR;
1892         }
1893     }
1894 
1895     /* Test a context for a finished similar surface */
1896     for (i = 0; i < ARRAY_LENGTH (context_tests); i++) {
1897         similar = cairo_surface_create_similar (target,
1898                                                 cairo_surface_get_content (target),
1899                                                 10, 10);
1900         cairo_surface_finish (similar);
1901         cr2 = cairo_create (similar);
1902         test_status = test_context (ctx, cr2, "finished surface", i);
1903         cairo_surface_destroy (similar);
1904         cairo_destroy (cr2);
1905 
1906         if (test_status != CAIRO_TEST_SUCCESS)
1907             return test_status;
1908     }
1909 
1910     /* Test a context for a similar surface finished later */
1911     for (i = 0; i < ARRAY_LENGTH (context_tests); i++) {
1912         similar = cairo_surface_create_similar (target,
1913                                                 cairo_surface_get_content (target),
1914                                                 10, 10);
1915         cr2 = cairo_create (similar);
1916         cairo_surface_finish (similar);
1917         test_status = test_context (ctx, cr2, "finished surface after create", i);
1918         cairo_surface_destroy (similar);
1919         cairo_destroy (cr2);
1920 
1921         if (test_status != CAIRO_TEST_SUCCESS)
1922             return test_status;
1923     }
1924 
1925     /* Test a context for a similar surface finished later with a path */
1926     for (i = 0; i < ARRAY_LENGTH (context_tests); i++) {
1927         similar = cairo_surface_create_similar (target,
1928                                                 cairo_surface_get_content (target),
1929                                                 10, 10);
1930         cr2 = cairo_create (similar);
1931         cairo_rectangle (cr2, 2, 2, 4, 4);
1932         cairo_surface_finish (similar);
1933         test_status = test_context (ctx, cr2, "finished surface with path", i);
1934         cairo_surface_destroy (similar);
1935         cairo_destroy (cr2);
1936 
1937         if (test_status != CAIRO_TEST_SUCCESS)
1938             return test_status;
1939     }
1940 
1941     /* Test a normal surface for functions that have the wrong type */
1942     for (i = 0; i < ARRAY_LENGTH (surface_tests); i++) {
1943         cairo_status_t desired_status;
1944 
1945         if (surface_tests[i].surface_type == -1)
1946             continue;
1947         similar = cairo_surface_create_similar (target,
1948                                                 cairo_surface_get_content (target),
1949                                                 10, 10);
1950         if (cairo_surface_get_type (similar) == (cairo_surface_type_t) surface_tests[i].surface_type) {
1951             cairo_surface_destroy (similar);
1952             continue;
1953         }
1954 
1955         test_status = surface_tests[i].func (similar);
1956         status = cairo_surface_status (similar);
1957         cairo_surface_destroy (similar);
1958 
1959         if (test_status != CAIRO_TEST_SUCCESS) {
1960             cairo_test_log (ctx,
1961                             "Failed test %s with %d\n",
1962                             surface_tests[i].name, (int) test_status);
1963             return test_status;
1964         }
1965 
1966         desired_status = surface_tests[i].modifies_surface ? CAIRO_STATUS_SURFACE_TYPE_MISMATCH : CAIRO_STATUS_SUCCESS;
1967         if (status != desired_status) {
1968             cairo_test_log (ctx,
1969                             "Failed test %s: Surface status should be %u (%s), but is %u (%s)\n",
1970                             surface_tests[i].name,
1971                             desired_status, cairo_status_to_string (desired_status),
1972                             status, cairo_status_to_string (status));
1973             return CAIRO_TEST_ERROR;
1974         }
1975     }
1976 
1977     /* 565-compatible gray background */
1978     cairo_set_source_rgb (cr, 0.51613, 0.55555, 0.51613);
1979     cairo_paint (cr);
1980 
1981     return CAIRO_TEST_SUCCESS;
1982 }
1983 
1984 CAIRO_TEST (api_special_cases,
1985 	    "Check surface functions properly handle wrong surface arguments",
1986 	    "api", /* keywords */
1987 	    NULL, /* requirements */
1988 	    10, 10,
1989 	    preamble, draw)
1990