6622c9f47faf9ab0faa027f165208b59e98bc0a7
[platform/upstream/glib.git] / tests / gobject / gvalue-test.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GLib Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 #undef G_DISABLE_ASSERT
28 #undef G_LOG_DOMAIN
29
30 #include <string.h>
31
32 #include <glib.h>
33 #include <glib-object.h>
34 #include "gobject/gvaluecollector.h"
35
36 static void
37 test_enum_transformation (void)
38
39   GType type; 
40   GValue orig = G_VALUE_INIT;
41   GValue xform = G_VALUE_INIT;
42   GEnumValue values[] = { {0,"0","0"}, {1,"1","1"}}; 
43   
44  type = g_enum_register_static ("TestEnum", values); 
45   
46  g_value_init (&orig, type); 
47  g_value_set_enum (&orig, 1); 
48
49  memset (&xform, 0, sizeof (GValue));
50  g_value_init (&xform, G_TYPE_CHAR); 
51  g_value_transform (&orig, &xform); 
52  g_assert (g_value_get_char (&xform) == 1);
53  g_assert (g_value_get_schar (&xform) == 1);
54
55  memset (&xform, 0, sizeof (GValue));
56  g_value_init (&xform, G_TYPE_UCHAR); 
57  g_value_transform (&orig, &xform); 
58  g_assert (g_value_get_uchar (&xform) == 1);
59
60  memset (&xform, 0, sizeof (GValue));
61  g_value_init (&xform, G_TYPE_INT); 
62  g_value_transform (&orig, &xform); 
63  g_assert (g_value_get_int (&xform) == 1);
64
65  memset (&xform, 0, sizeof (GValue));
66  g_value_init (&xform, G_TYPE_UINT); 
67  g_value_transform (&orig, &xform); 
68  g_assert (g_value_get_uint (&xform) == 1);
69
70  memset (&xform, 0, sizeof (GValue));
71  g_value_init (&xform, G_TYPE_LONG); 
72  g_value_transform (&orig, &xform); 
73  g_assert (g_value_get_long (&xform) == 1);
74
75  memset (&xform, 0, sizeof (GValue));
76  g_value_init (&xform, G_TYPE_ULONG); 
77  g_value_transform (&orig, &xform); 
78  g_assert (g_value_get_ulong (&xform) == 1);
79
80  memset (&xform, 0, sizeof (GValue));
81  g_value_init (&xform, G_TYPE_INT64); 
82  g_value_transform (&orig, &xform); 
83  g_assert (g_value_get_int64 (&xform) == 1);
84
85  memset (&xform, 0, sizeof (GValue));
86  g_value_init (&xform, G_TYPE_UINT64); 
87  g_value_transform (&orig, &xform); 
88  g_assert (g_value_get_uint64 (&xform) == 1);
89 }
90
91
92 static void
93 test_gtype_value (void)
94 {
95   GType type;
96   GValue value = G_VALUE_INIT;
97   GValue copy = G_VALUE_INIT;
98
99   g_value_init (&value, G_TYPE_GTYPE);
100
101   g_value_set_gtype (&value, G_TYPE_BOXED);
102   type = g_value_get_gtype (&value);
103   g_assert (type == G_TYPE_BOXED);
104
105   g_value_init (&copy, G_TYPE_GTYPE);
106   g_value_copy (&value, &copy);
107   type = g_value_get_gtype (&copy);
108   g_assert (type == G_TYPE_BOXED);
109 }
110
111 static gchar *
112 collect (GValue *value, ...)
113 {
114   gchar *error;
115   va_list var_args;
116
117   error = NULL;
118
119   va_start (var_args, value);
120   G_VALUE_COLLECT (value, var_args, 0, &error);
121   va_end (var_args);
122
123   return error;
124 }        
125
126 static gchar *
127 lcopy (GValue *value, ...)
128 {
129   gchar *error;
130   va_list var_args;
131
132   error = NULL;
133
134   va_start (var_args, value);
135   G_VALUE_LCOPY (value, var_args, 0, &error);
136   va_end (var_args);
137
138   return error;
139 }        
140
141 static void
142 test_collection (void)
143 {
144   GValue value = G_VALUE_INIT;
145   gchar *error;
146   
147   g_value_init (&value, G_TYPE_CHAR);
148   error = collect (&value, 'c');
149   g_assert (error == NULL);
150   g_assert (g_value_get_char (&value) == 'c');
151   
152   g_value_unset (&value);
153   g_value_init (&value, G_TYPE_UCHAR);
154   error = collect (&value, 129);
155   g_assert (error == NULL);
156   g_assert (g_value_get_uchar (&value) == 129);
157   
158   g_value_unset (&value);
159   g_value_init (&value, G_TYPE_BOOLEAN);
160   error = collect (&value, TRUE);
161   g_assert (error == NULL);
162   g_assert (g_value_get_boolean (&value) == TRUE);
163   
164   g_value_unset (&value);
165   g_value_init (&value, G_TYPE_INT);
166   error = collect (&value, G_MAXINT);
167   g_assert (error == NULL);
168   g_assert (g_value_get_int (&value) == G_MAXINT);
169   
170   g_value_unset (&value);
171   g_value_init (&value, G_TYPE_UINT);
172   error = collect (&value, G_MAXUINT);
173   g_assert (error == NULL);
174   g_assert (g_value_get_uint (&value) == G_MAXUINT);
175   
176   g_value_unset (&value);  
177   g_value_init (&value, G_TYPE_LONG);
178   error = collect (&value, G_MAXLONG);
179   g_assert (error == NULL);
180   g_assert (g_value_get_long (&value) == G_MAXLONG);
181   
182   g_value_unset (&value);
183   g_value_init (&value, G_TYPE_ULONG);
184   error = collect (&value, G_MAXULONG);
185   g_assert (error == NULL);
186   g_assert (g_value_get_ulong (&value) == G_MAXULONG);
187   
188   g_value_unset (&value);  
189   g_value_init (&value, G_TYPE_INT64);
190   error = collect (&value, G_MAXINT64);
191   g_assert (error == NULL);
192   g_assert (g_value_get_int64 (&value) == G_MAXINT64);
193   
194   g_value_unset (&value);
195   g_value_init (&value, G_TYPE_UINT64);
196   error = collect (&value, G_MAXUINT64);
197   g_assert (error == NULL);
198   g_assert (g_value_get_uint64 (&value) == G_MAXUINT64);
199   
200   g_value_unset (&value);
201   g_value_init (&value, G_TYPE_FLOAT);
202   error = collect (&value, G_MAXFLOAT);
203   g_assert (error == NULL);
204   g_assert (g_value_get_float (&value) == G_MAXFLOAT);
205   
206   g_value_unset (&value);
207   g_value_init (&value, G_TYPE_DOUBLE);
208   error = collect (&value, G_MAXDOUBLE);
209   g_assert (error == NULL);
210   g_assert (g_value_get_double (&value) == G_MAXDOUBLE);
211   
212   g_value_unset (&value);
213   g_value_init (&value, G_TYPE_STRING);
214   error = collect (&value, "string ?");
215   g_assert (error == NULL);
216   g_assert (strcmp (g_value_get_string (&value), "string ?") == 0);
217   
218   g_value_unset (&value);
219   g_value_init (&value, G_TYPE_GTYPE);
220   error = collect (&value, G_TYPE_BOXED);
221   g_assert (error == NULL);
222   g_assert (g_value_get_gtype (&value) == G_TYPE_BOXED);
223
224   g_value_unset (&value);
225   g_value_init (&value, G_TYPE_VARIANT);
226   error = collect (&value, g_variant_new_uint32 (42));
227   g_assert (error == NULL);
228   g_assert (g_variant_is_of_type (g_value_get_variant (&value), G_VARIANT_TYPE ("u")));
229   g_assert_cmpuint (g_variant_get_uint32 (g_value_get_variant (&value)), ==, 42);
230
231   g_value_unset (&value);
232 }
233
234 static void
235 test_copying (void)
236 {
237   GValue value = G_VALUE_INIT;
238   gchar *error;
239
240   {
241     gchar c = 0;
242
243     g_value_init (&value, G_TYPE_CHAR);
244     g_value_set_char (&value, 'c');
245     error = lcopy (&value, &c);
246     g_assert (error == NULL);
247     g_assert (c == 'c');
248   }  
249
250   {
251     guchar c = 0;
252
253     g_value_unset (&value);
254     g_value_init (&value, G_TYPE_UCHAR);
255     g_value_set_uchar (&value, 129);
256     error = lcopy (&value, &c);
257     g_assert (error == NULL);
258     g_assert (c == 129);
259   }  
260
261   {
262     gint c = 0;
263
264     g_value_unset (&value);
265     g_value_init (&value, G_TYPE_INT);
266     g_value_set_int (&value, G_MAXINT);
267     error = lcopy (&value, &c);
268     g_assert (error == NULL);
269     g_assert (c == G_MAXINT);
270   }  
271
272   {
273     guint c = 0;
274
275     g_value_unset (&value);
276     g_value_init (&value, G_TYPE_UINT);
277     g_value_set_uint (&value, G_MAXUINT);
278     error = lcopy (&value, &c);
279     g_assert (error == NULL);
280     g_assert (c == G_MAXUINT);
281   }  
282
283   {
284     glong c = 0;
285
286     g_value_unset (&value);
287     g_value_init (&value, G_TYPE_LONG);
288     g_value_set_long (&value, G_MAXLONG);
289     error = lcopy (&value, &c);
290     g_assert (error == NULL);
291     g_assert (c == G_MAXLONG);
292   }  
293
294   {
295     gulong c = 0;
296
297     g_value_unset (&value);
298     g_value_init (&value, G_TYPE_ULONG);
299     g_value_set_ulong (&value, G_MAXULONG);
300     error = lcopy (&value, &c);
301     g_assert (error == NULL);
302     g_assert (c == G_MAXULONG);
303   }  
304
305   {
306     gint64 c = 0;
307
308     g_value_unset (&value);
309     g_value_init (&value, G_TYPE_INT64);
310     g_value_set_int64 (&value, G_MAXINT64);
311     error = lcopy (&value, &c);
312     g_assert (error == NULL);
313     g_assert (c == G_MAXINT64);
314   }  
315
316   {
317     guint64 c = 0;
318
319     g_value_unset (&value);
320     g_value_init (&value, G_TYPE_UINT64);
321     g_value_set_uint64 (&value, G_MAXUINT64);
322     error = lcopy (&value, &c);
323     g_assert (error == NULL);
324     g_assert (c == G_MAXUINT64);
325   }  
326
327   {
328     gfloat c = 0;
329
330     g_value_unset (&value);
331     g_value_init (&value, G_TYPE_FLOAT);
332     g_value_set_float (&value, G_MAXFLOAT);
333     error = lcopy (&value, &c);
334     g_assert (error == NULL);
335     g_assert (c == G_MAXFLOAT);
336   }  
337
338   {
339     gdouble c = 0;
340
341     g_value_unset (&value);
342     g_value_init (&value, G_TYPE_DOUBLE);
343     g_value_set_double (&value, G_MAXDOUBLE);
344     error = lcopy (&value, &c);
345     g_assert (error == NULL);
346     g_assert (c == G_MAXDOUBLE);
347   }  
348
349   {
350     gchar *c = NULL;
351
352     g_value_unset (&value);
353     g_value_init (&value, G_TYPE_STRING);
354     g_value_set_string (&value, "string ?");
355     error = lcopy (&value, &c);
356     g_assert (error == NULL);
357     g_assert (strcmp (c, "string ?") == 0);
358   }  
359
360   {
361     GType c = G_TYPE_NONE;
362
363     g_value_unset (&value);
364     g_value_init (&value, G_TYPE_GTYPE);
365     g_value_set_gtype (&value, G_TYPE_BOXED);
366     error = lcopy (&value, &c);
367     g_assert (error == NULL);
368     g_assert (c == G_TYPE_BOXED);
369   }  
370
371   {
372     GVariant *c = NULL;
373
374     g_value_unset (&value);
375     g_value_init (&value, G_TYPE_VARIANT);
376     g_value_set_variant (&value, g_variant_new_uint32 (42));
377     error = lcopy (&value, &c);
378     g_assert (error == NULL);
379     g_assert (c != NULL);
380     g_assert (g_variant_is_of_type (c, G_VARIANT_TYPE ("u")));
381     g_assert_cmpuint (g_variant_get_uint32 (c), ==, 42);
382     g_variant_unref (c);
383   }
384 }
385
386
387 int
388 main (int argc, char *argv[])
389 {
390   g_test_init (&argc, &argv, NULL);
391   g_type_init ();
392
393   g_test_add_func ("/gvalue/enum-transformation", test_enum_transformation);
394   g_test_add_func ("/gvalue/gtype", test_gtype_value);
395   g_test_add_func ("/gvalue/collection", test_collection);
396   g_test_add_func ("/gvalue/copying", test_copying);
397
398   return g_test_run ();
399 }