Upload Tizen2.0 source
[framework/graphics/cairo.git] / test / group-state.c
1 /* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
2 /*
3  * Copyright 2011 Andrea Canciani
4  *
5  * Permission is hereby granted, free of charge, to any person
6  * obtaining a copy of this software and associated documentation
7  * files (the "Software"), to deal in the Software without
8  * restriction, including without limitation the rights to use, copy,
9  * modify, merge, publish, distribute, sublicense, and/or sell copies
10  * of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  *
25  * Author: Andrea Canciani <ranma42@gmail.com>
26  */
27
28 #include "cairo-test.h"
29
30 #define CHECK_STATUS(status)                                            \
31     do {                                                                \
32         if (cairo_status (cr) != (status)) {                            \
33             cairo_test_log (ctx, "Expected status: %s\n",               \
34                             cairo_status_to_string (status));           \
35             cairo_test_log (ctx, "Actual status: %s\n",                 \
36                             cairo_status_to_string (cairo_status (cr))); \
37             result = CAIRO_TEST_FAILURE;                                \
38         }                                                               \
39     } while (0)
40
41 static void
42 reinit_cairo (cairo_t **cr)
43 {
44     if (*cr)
45         cairo_destroy (*cr);
46
47     *cr = cairo_create (cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1));
48     cairo_surface_destroy (cairo_get_target (*cr));
49 }
50
51 static cairo_test_status_t
52 preamble (cairo_test_context_t *ctx)
53 {
54     cairo_t *cr;
55     cairo_test_status_t result = CAIRO_TEST_SUCCESS;
56
57     cr = NULL;
58
59     reinit_cairo (&cr);
60
61     /* cairo_restore() must fail with CAIRO_STATUS_INVALID_RESTORE if
62      * no matching cairo_save() call has been performed. */
63     cairo_test_log (ctx, "Checking save(); push(); restore();\n");
64     cairo_save (cr);
65     CHECK_STATUS (CAIRO_STATUS_SUCCESS);
66     cairo_push_group (cr);
67     CHECK_STATUS (CAIRO_STATUS_SUCCESS);
68     cairo_restore (cr);
69     CHECK_STATUS (CAIRO_STATUS_INVALID_RESTORE);
70
71
72     reinit_cairo (&cr);
73
74     /* cairo_restore() must fail with CAIRO_STATUS_INVALID_RESTORE if
75      * no matching cairo_save() call has been performed. */
76     cairo_test_log (ctx, "Checking push(); save(); pop();\n");
77     cairo_push_group (cr);
78     CHECK_STATUS (CAIRO_STATUS_SUCCESS);
79     cairo_save (cr);
80     CHECK_STATUS (CAIRO_STATUS_SUCCESS);
81     cairo_pop_group_to_source (cr);
82     CHECK_STATUS (CAIRO_STATUS_INVALID_POP_GROUP);
83
84
85     cairo_destroy (cr);
86
87     return result;
88 }
89
90 CAIRO_TEST (group_state,
91             "Tests the interaction between state (cairo_save, cairo_restore) "
92             "and group (cairo_push_group/cairo_pop_group) API",
93             "api", /* keywords */
94             NULL, /* requirements */
95             0, 0,
96             preamble, NULL)