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