test-object.c revision 80a6833b032bc63b4e8c3da6489d3767af1168f3
1db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod/*
2db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * Copyright © 2011  Google, Inc.
3db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod *
4db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
5db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod *
6db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * Permission is hereby granted, without written agreement and without
7db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
8db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * software and its documentation for any purpose, provided that the
9db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * above copyright notice and the following two paragraphs appear in
10db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * all copies of this software.
11db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod *
12db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * DAMAGE.
17db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod *
18db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod *
24db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod * Google Author(s): Behdad Esfahbod
25db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod */
26db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
27db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#include "hb-test.h"
28db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
29db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod/* Unit tests for hb-object-private.h */
30db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
31db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
32db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#ifdef HAVE_FREETYPE
33db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#include <hb-ft.h>
34db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#endif
35db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
36db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
37db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
38db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_blob (void)
39db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
40db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  static char data[] = "test data";
41db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_blob_create (data, sizeof (data), HB_MEMORY_MODE_READONLY, NULL, NULL);
42db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
43db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
44db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_blob_inert (void)
45db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
4680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod  return hb_blob_create (NULL, 0, HB_MEMORY_MODE_DUPLICATE, NULL, NULL);
47db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
48db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
49db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
50db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_buffer (void)
51db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
52db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_buffer_create (0);
53db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
54db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
55db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_buffer_inert (void)
56db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
57db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_buffer_create (-1);
58db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
59db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
60db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
61db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_face (void)
62db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
63db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  hb_blob_t *blob = (hb_blob_t *) create_blob ();
64db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  hb_face_t *face = hb_face_create_for_data (blob, 0);
65db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  hb_blob_destroy (blob);
66db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return face;
67db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
68db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
69db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_face_inert (void)
70db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
7180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod  return hb_face_create_for_data (hb_blob_get_empty (), 0);
72db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
73db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
74db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
75db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font (void)
76db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
7772657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod  hb_face_t *face = (hb_face_t *) create_face ();
7872657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod  hb_font_t *font = hb_font_create (face);
7972657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod  hb_face_destroy (face);
8072657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod  return font;
81db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
82db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
83db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_inert (void)
84db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
8580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod  return hb_font_create (hb_face_get_empty ());
86db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
87db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
88db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
89db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs (void)
90db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
91db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_font_funcs_create ();
92db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
93db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
94db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs_inert (void)
95db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
96db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#ifdef HAVE_FREETYPE
97db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_ft_get_font_funcs ();
98db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#else
99db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return NULL;
100db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#endif
101db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
102db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
103db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
104db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs (void)
105db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
106db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_unicode_funcs_create (NULL);
107db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
108db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
109db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs_inert (void)
110db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
111db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_unicode_funcs_get_default ();
112db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
113db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
114db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
115db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
116db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void     *(*create_func_t)         (void);
117db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void     *(*reference_func_t)      (void *obj);
118db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void      (*destroy_func_t)        (void *obj);
119db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef hb_bool_t (*set_user_data_func_t)  (void *obj, hb_user_data_key_t *key, void *data, hb_destroy_func_t destroy);
120db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void *    (*get_user_data_func_t)  (void *obj, hb_user_data_key_t *key);
121db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void      (*make_immutable_func_t) (void *obj);
122db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef hb_bool_t (*is_immutable_func_t)   (void *obj);
123db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
124db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct {
125db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  create_func_t          create;
126db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  create_func_t          create_inert;
12780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod  create_func_t          get_empty;
128db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  reference_func_t       reference;
129db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  destroy_func_t         destroy;
130db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  set_user_data_func_t   set_user_data;
131db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  get_user_data_func_t   get_user_data;
132db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  make_immutable_func_t  make_immutable;
133db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  is_immutable_func_t    is_immutable;
134db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  const char            *name;
135db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} object_t;
136db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
137db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITHOUT_IMMUTABILITY(name) \
138db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  { \
139db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name, \
140db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name##_inert, \
14180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod    (create_func_t)         hb_##name##_get_empty, \
142db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (reference_func_t)      hb_##name##_reference, \
143db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (destroy_func_t)        hb_##name##_destroy, \
144db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (set_user_data_func_t)  hb_##name##_set_user_data, \
145db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (get_user_data_func_t)  hb_##name##_get_user_data, \
146db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (make_immutable_func_t) NULL, \
147db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (is_immutable_func_t)   NULL, \
148db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    #name, \
149db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  }
150db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITH_IMMUTABILITY(name) \
151db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  { \
152db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name, \
153db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name##_inert, \
15480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod    (create_func_t)         hb_##name##_get_empty, \
155db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (reference_func_t)      hb_##name##_reference, \
156db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (destroy_func_t)        hb_##name##_destroy, \
157db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (set_user_data_func_t)  hb_##name##_set_user_data, \
158db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (get_user_data_func_t)  hb_##name##_get_user_data, \
159db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (make_immutable_func_t) hb_##name##_make_immutable, \
160db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (is_immutable_func_t)   hb_##name##_is_immutable, \
161db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    #name, \
162db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  }
163db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic const object_t objects[] =
164db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
165db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITHOUT_IMMUTABILITY (buffer),
166db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITHOUT_IMMUTABILITY (face),
1671c9f8717eb12c37c219333cbb0d123e1d2da4896Behdad Esfahbod  OBJECT_WITH_IMMUTABILITY (blob),
16874f1d896f2479500d65649cf3ec86dd201f0663aBehdad Esfahbod  OBJECT_WITH_IMMUTABILITY (font),
169db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITH_IMMUTABILITY (font_funcs),
170db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITH_IMMUTABILITY (unicode_funcs)
171db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod};
172db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#undef OBJECT
173db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
174db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
175db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC0 0x12345678
176db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC1 0x76543210
177db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
178db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct {
179db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  int value;
180db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  gboolean freed;
181db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} data_t;
182db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
183db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic int global_data;
184db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
185db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void global_free_up (void *p G_GNUC_UNUSED)
186db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
187db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  global_data++;
188db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
189db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
190db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up0 (void *p)
191db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
192db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data_t *data = (data_t *) p;
193db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
194db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert_cmphex (data->value, ==, MAGIC0);
195db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert (!data->freed);
196db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data->freed = TRUE;
197db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
198db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
199db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up1 (void *p)
200db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
201db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data_t *data = (data_t *) p;
202db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
203db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert_cmphex (data->value, ==, MAGIC1);
204db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert (!data->freed);
205db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data->freed = TRUE;
206db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
207db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
2086a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod
2096a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbodtypedef struct {
2106a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod  const object_t *klass;
2116a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod  void *object;
2126a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod  hb_user_data_key_t key;
2136a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod} deadlock_test_t;
2146a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod
2156a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbodstatic void free_deadlock_test (void *p)
2166a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod{
2176a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod  deadlock_test_t *t = (deadlock_test_t *) p;
2186a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod
2196a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod  g_assert (NULL == t->klass->get_user_data (t->object, &t->key));
2206a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod}
2216a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod
2226a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod
223db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void
224db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtest_object (void)
225db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
226db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  unsigned int i;
227db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
228db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  for (i = 0; i < G_N_ELEMENTS (objects); i++) {
229db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    const object_t *o = &objects[i];
230db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    void *obj;
231db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    hb_user_data_key_t key[2];
232db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
233db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    {
234db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      unsigned int i;
235db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
2366a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod      deadlock_test_t deadlock_test;
237db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
238db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_test_message ("Testing object %s", o->name);
239db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
240db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_test_message ("->create()");
241db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      obj = o->create ();
242db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (obj);
243db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
244db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (obj == o->reference (obj));
245db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
246db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
247db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (o->is_immutable)
248db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (!o->is_immutable (obj));
249db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
250db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0));
251db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[0]) == &data[0]);
252db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
253db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (o->is_immutable) {
254db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	o->make_immutable (obj);
255db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->is_immutable (obj));
256db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      }
257db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
258db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      /* Should still work even if object is made immutable */
259db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[1], &data[1], free_up1));
260db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[1]) == &data[1]);
261db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
262db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!o->set_user_data (obj, NULL, &data[0], free_up0));
263db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[0]) == &data[0]);
264db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[1], NULL));
265db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[0].freed);
266db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[0]) == &data[1]);
267db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[1].freed);
268db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
269db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data[0].freed = FALSE;
270db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0));
271db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[0].freed);
272db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], NULL, NULL));
273db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[0].freed);
274db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
275db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data[0].freed = FALSE;
276db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      global_data = 0;
277db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0));
278db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 0);
279db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], NULL, global_free_up));
280db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 0);
281db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], NULL, NULL));
282db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 1);
283db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
284db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      global_data = 0;
285db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      for (i = 2; i < 1000; i++)
286db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->set_user_data (obj, &key[i], &data[i], global_free_up));
287db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      for (i = 2; i < 1000; i++)
288db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->get_user_data (obj, &key[i]) == &data[i]);
289db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      for (i = 100; i < 1000; i++)
290db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->set_user_data (obj, &key[i], NULL, NULL));
291811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod      for (i = 2; i < 100; i++)
292811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod	g_assert (o->get_user_data (obj, &key[i]) == &data[i]);
293811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod      for (i = 100; i < 1000; i++)
294811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod	g_assert (!o->get_user_data (obj, &key[i]));
295db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 900);
296db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
2976a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod      /* Test set_user_data where the destroy() func calls user_data functions.
2986a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod       * Make sure it doesn't deadlock or corrupt memory. */
2996a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod      deadlock_test.klass = o;
3006a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod      deadlock_test.object = obj;
3016a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod      g_assert (o->set_user_data (obj, &deadlock_test.key, &deadlock_test, free_deadlock_test));
3026a9093cc486c1899197cd7cc9a3eb907c2e756f7Behdad Esfahbod      g_assert (o->set_user_data (obj, &deadlock_test.key, NULL, NULL));
303db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
304db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[1].freed);
305db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
306db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[0].freed);
307db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[1].freed);
308db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 1000-2);
309db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    }
310db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
311db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    {
312db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
313db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
31480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      g_test_message ("->get_empty()");
31580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      obj = o->get_empty ();
31680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      g_assert (obj);
31780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod
31880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      g_assert (obj == o->reference (obj));
31980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      o->destroy (obj);
32080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod
32180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      if (o->is_immutable)
32280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod	g_assert (o->is_immutable (obj));
32380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod
32480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0));
32580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      g_assert (!o->get_user_data (obj, &key[0]));
32680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod
32780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      o->destroy (obj);
32880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      o->destroy (obj);
32980a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      o->destroy (obj);
33080a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      o->destroy (obj);
33180a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      o->destroy (obj);
33280a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod
33380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      g_assert (!data[0].freed);
33480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod    }
33580a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod
33680a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod    {
33780a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
33880a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod
339db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_test_message ("->create_inert()");
340db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      obj = o->create_inert ();
341db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (!obj)
342db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	continue;
34380a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod      if (obj == o->get_empty ())
34480a6833b032bc63b4e8c3da6489d3767af1168f3Behdad Esfahbod        continue; /* Tested already */
345db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
346db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (obj == o->reference (obj));
347db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
348db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
349db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (o->is_immutable)
350db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->is_immutable (obj));
351db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
352db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0));
353db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!o->get_user_data (obj, &key[0]));
354db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
355db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
356db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
357db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
358db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
359db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
360db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
361db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[0].freed);
362db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    }
363db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  }
364db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
365db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
366db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
367db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodint
368db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodmain (int argc, char **argv)
369db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
370db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  hb_test_init (&argc, &argv);
371db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
372db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  hb_test_add (test_object);
373db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
374db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_test_run ();
375db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
376