test-object.c revision db99589529a22a2113bcef1680ab6d9b934f382e
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{
46db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_blob_get_empty ();
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{
71db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_face_create_for_data ((hb_blob_t *) create_blob_inert (), 0);
72db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
73db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
74db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
75db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font (void)
76db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
77db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_font_create ();
78db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
79db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
80db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_inert (void)
81db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
82db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return NULL;
83db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
84db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
85db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
86db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs (void)
87db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
88db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_font_funcs_create ();
89db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
90db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
91db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_font_funcs_inert (void)
92db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
93db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#ifdef HAVE_FREETYPE
94db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_ft_get_font_funcs ();
95db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#else
96db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return NULL;
97db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#endif
98db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
99db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
100db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
101db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs (void)
102db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
103db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_unicode_funcs_create (NULL);
104db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
105db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void *
106db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodcreate_unicode_funcs_inert (void)
107db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
108db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_unicode_funcs_get_default ();
109db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
110db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
111db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
112db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
113db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void     *(*create_func_t)         (void);
114db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void     *(*reference_func_t)      (void *obj);
115db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void      (*destroy_func_t)        (void *obj);
116db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef hb_bool_t (*set_user_data_func_t)  (void *obj, hb_user_data_key_t *key, void *data, hb_destroy_func_t destroy);
117db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void *    (*get_user_data_func_t)  (void *obj, hb_user_data_key_t *key);
118db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef void      (*make_immutable_func_t) (void *obj);
119db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef hb_bool_t (*is_immutable_func_t)   (void *obj);
120db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
121db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct {
122db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  create_func_t          create;
123db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  create_func_t          create_inert;
124db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  reference_func_t       reference;
125db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  destroy_func_t         destroy;
126db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  set_user_data_func_t   set_user_data;
127db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  get_user_data_func_t   get_user_data;
128db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  make_immutable_func_t  make_immutable;
129db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  is_immutable_func_t    is_immutable;
130db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  const char            *name;
131db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} object_t;
132db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
133db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITHOUT_IMMUTABILITY(name) \
134db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  { \
135db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name, \
136db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name##_inert, \
137db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (reference_func_t)      hb_##name##_reference, \
138db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (destroy_func_t)        hb_##name##_destroy, \
139db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (set_user_data_func_t)  hb_##name##_set_user_data, \
140db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (get_user_data_func_t)  hb_##name##_get_user_data, \
141db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (make_immutable_func_t) NULL, \
142db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (is_immutable_func_t)   NULL, \
143db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    #name, \
144db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  }
145db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define OBJECT_WITH_IMMUTABILITY(name) \
146db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  { \
147db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name, \
148db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (create_func_t)         create_##name##_inert, \
149db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (reference_func_t)      hb_##name##_reference, \
150db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (destroy_func_t)        hb_##name##_destroy, \
151db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (set_user_data_func_t)  hb_##name##_set_user_data, \
152db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (get_user_data_func_t)  hb_##name##_get_user_data, \
153db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (make_immutable_func_t) hb_##name##_make_immutable, \
154db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    (is_immutable_func_t)   hb_##name##_is_immutable, \
155db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    #name, \
156db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  }
157db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic const object_t objects[] =
158db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
159db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITHOUT_IMMUTABILITY (blob),
160db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITHOUT_IMMUTABILITY (buffer),
161db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITHOUT_IMMUTABILITY (face),
162db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITHOUT_IMMUTABILITY (font),
163db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITH_IMMUTABILITY (font_funcs),
164db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  OBJECT_WITH_IMMUTABILITY (unicode_funcs)
165db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod};
166db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#undef OBJECT
167db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
168db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
169db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC0 0x12345678
170db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod#define MAGIC1 0x76543210
171db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
172db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtypedef struct {
173db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  int value;
174db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  gboolean freed;
175db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod} data_t;
176db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
177db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic int global_data;
178db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
179db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void global_free_up (void *p G_GNUC_UNUSED)
180db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
181db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  global_data++;
182db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
183db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
184db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up0 (void *p)
185db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
186db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data_t *data = (data_t *) p;
187db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
188db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert_cmphex (data->value, ==, MAGIC0);
189db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert (!data->freed);
190db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data->freed = TRUE;
191db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
192db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
193db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void free_up1 (void *p)
194db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
195db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data_t *data = (data_t *) p;
196db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
197db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert_cmphex (data->value, ==, MAGIC1);
198db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  g_assert (!data->freed);
199db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  data->freed = TRUE;
200db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
201db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
202db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodstatic void
203db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodtest_object (void)
204db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
205db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  unsigned int i;
206db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
207db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  for (i = 0; i < G_N_ELEMENTS (objects); i++) {
208db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    const object_t *o = &objects[i];
209db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    void *obj;
210db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    hb_user_data_key_t key[2];
211db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
212db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    {
213db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      unsigned int i;
214db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
215db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
216db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_test_message ("Testing object %s", o->name);
217db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
218db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_test_message ("->create()");
219db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      obj = o->create ();
220db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (obj);
221db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
222db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (obj == o->reference (obj));
223db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
224db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
225db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (o->is_immutable)
226db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (!o->is_immutable (obj));
227db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
228db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0));
229db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[0]) == &data[0]);
230db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
231db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (o->is_immutable) {
232db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	o->make_immutable (obj);
233db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->is_immutable (obj));
234db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      }
235db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
236db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      /* Should still work even if object is made immutable */
237db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[1], &data[1], free_up1));
238db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[1]) == &data[1]);
239db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
240db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!o->set_user_data (obj, NULL, &data[0], free_up0));
241db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[0]) == &data[0]);
242db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[1], NULL));
243db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[0].freed);
244db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->get_user_data (obj, &key[0]) == &data[1]);
245db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[1].freed);
246db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
247db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data[0].freed = FALSE;
248db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0));
249db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[0].freed);
250db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], NULL, NULL));
251db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[0].freed);
252db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
253db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data[0].freed = FALSE;
254db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      global_data = 0;
255db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], &data[0], free_up0));
256db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 0);
257db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], NULL, global_free_up));
258db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 0);
259db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (o->set_user_data (obj, &key[0], NULL, NULL));
260db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 1);
261db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
262db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      global_data = 0;
263db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      for (i = 2; i < 1000; i++)
264db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->set_user_data (obj, &key[i], &data[i], global_free_up));
265db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      for (i = 2; i < 1000; i++)
266db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->get_user_data (obj, &key[i]) == &data[i]);
267db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      for (i = 100; i < 1000; i++)
268db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->set_user_data (obj, &key[i], NULL, NULL));
269db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 900);
270db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
271db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
272db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[1].freed);
273db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
274db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[0].freed);
275db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (data[1].freed);
276db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert_cmpuint (global_data, ==, 1000-2);
277db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    }
278db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
279db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    {
280db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
281db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
282db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_test_message ("->create_inert()");
283db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      obj = o->create_inert ();
284db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (!obj)
285db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	continue;
286db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
287db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (obj == o->reference (obj));
288db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
289db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
290db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      if (o->is_immutable)
291db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod	g_assert (o->is_immutable (obj));
292db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
293db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0));
294db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!o->get_user_data (obj, &key[0]));
295db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
296db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
297db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
298db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
299db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
300db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      o->destroy (obj);
301db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
302db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod      g_assert (!data[0].freed);
303db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod    }
304db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  }
305db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
306db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
307db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
308db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodint
309db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbodmain (int argc, char **argv)
310db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod{
311db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  hb_test_init (&argc, &argv);
312db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
313db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  hb_test_add (test_object);
314db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod
315db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod  return hb_test_run ();
316db99589529a22a2113bcef1680ab6d9b934f382eBehdad Esfahbod}
317