]> git.sesse.net Git - vlc/blob - test/src/misc/variables.c
test: destroy the variables.
[vlc] / test / src / misc / variables.c
1 /*****************************************************************************
2  * variables.c: test for variables
3  *****************************************************************************
4  * Copyright (C) 2009 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Rémi Duraffort <ivoire@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #include <limits.h>
25
26 #include "../../libvlc/test.h"
27 #include <../src/control/libvlc_internal.h>
28
29 const char *psz_var_name[] = { "a", "abcdef", "abcdefg", "abc123", "abc-123", "é€!!" };
30 const int i_var_count = 6;
31 vlc_value_t var_value[6];
32
33
34 static void test_integer( libvlc_int_t *p_libvlc )
35 {
36     int i;
37     for( i = 0; i < i_var_count; i++ )
38         var_Create( p_libvlc, psz_var_name[i], VLC_VAR_INTEGER );
39
40     for( i = 0; i < i_var_count; i++ )
41     {
42         var_value[i].i_int = rand();
43         var_SetInteger( p_libvlc, psz_var_name[i], var_value[i].i_int );
44     }
45
46     for( i = 0; i < i_var_count; i++ )
47     {
48         assert( var_GetInteger( p_libvlc, psz_var_name[i] ) == var_value[i].i_int );
49         var_IncInteger( p_libvlc, psz_var_name[i] );
50         assert( var_GetInteger( p_libvlc, psz_var_name[i] ) == var_value[i].i_int + 1 );
51         var_DecInteger( p_libvlc, psz_var_name[i] );
52         assert( var_GetInteger( p_libvlc, psz_var_name[i] ) == var_value[i].i_int );
53     }
54
55     for( i = 0; i < i_var_count; i++ )
56         var_Destroy( p_libvlc, psz_var_name[i] );
57 }
58
59 static void test_booleans( libvlc_int_t *p_libvlc )
60 {
61     int i;
62     for( i = 0; i < i_var_count; i++ )
63          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_BOOL );
64
65     for( i = 0; i < i_var_count; i++ )
66     {
67         var_value[i].b_bool = (rand() > RAND_MAX/2);
68         var_SetBool( p_libvlc, psz_var_name[i], var_value[i].b_bool );
69     }
70
71     for( i = 0; i < i_var_count; i++ )
72         assert( var_GetBool( p_libvlc, psz_var_name[i] ) == var_value[i].b_bool );
73
74     for( i = 0; i < i_var_count; i++ )
75         var_Destroy( p_libvlc, psz_var_name[i] );
76 }
77
78 static void test_times( libvlc_int_t *p_libvlc )
79 {
80     int i;
81     for( i = 0; i < i_var_count; i++ )
82          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_TIME );
83
84     for( i = 0; i < i_var_count; i++ )
85     {
86         var_value[i].i_time = rand();
87         var_SetTime( p_libvlc, psz_var_name[i], var_value[i].i_time );
88     }
89
90     for( i = 0; i < i_var_count; i++ )
91         assert( var_GetTime( p_libvlc, psz_var_name[i] ) == var_value[i].i_time );
92
93     for( i = 0; i < i_var_count; i++ )
94         var_Destroy( p_libvlc, psz_var_name[i] );
95 }
96
97 static void test_floats( libvlc_int_t *p_libvlc )
98 {
99     int i;
100     for( i = 0; i < i_var_count; i++ )
101          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_FLOAT );
102
103     for( i = 0; i < i_var_count; i++ )
104     {
105         var_value[i].f_float = rand();
106         var_SetFloat( p_libvlc, psz_var_name[i], var_value[i].f_float );
107     }
108
109     for( i = 0; i < i_var_count; i++ )
110         assert( var_GetFloat( p_libvlc, psz_var_name[i] ) == var_value[i].f_float );
111
112     for( i = 0; i < i_var_count; i++ )
113         var_Destroy( p_libvlc, psz_var_name[i] );
114 }
115
116 static void test_strings( libvlc_int_t *p_libvlc )
117 {
118     int i;
119     char *psz_tmp;
120     for( i = 0; i < i_var_count; i++ )
121          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_STRING );
122
123     for( i = 0; i < i_var_count; i++ )
124         var_SetString( p_libvlc, psz_var_name[i], psz_var_name[i] );
125
126     for( i = 0; i < i_var_count; i++ )
127     {
128         psz_tmp = var_GetString( p_libvlc, psz_var_name[i] );
129         assert( !strcmp( psz_tmp, psz_var_name[i] ) );
130         free( psz_tmp );
131     }
132
133     for( i = 0; i < i_var_count; i++ )
134         var_Destroy( p_libvlc, psz_var_name[i] );
135
136
137     /* Some more test for strings */
138     var_Create( p_libvlc, "bla", VLC_VAR_STRING );
139     assert( var_GetNonEmptyString( p_libvlc, "bla" ) == NULL );
140     var_SetString( p_libvlc, "bla", "" );
141     assert( var_GetNonEmptyString( p_libvlc, "bla" ) == NULL );
142     var_SetString( p_libvlc, "bla", "test" );
143     psz_tmp = var_GetNonEmptyString( p_libvlc, "bla" );
144     assert( !strcmp( psz_tmp, "test" ) );
145     free( psz_tmp );
146     var_Destroy( p_libvlc, "bla" );
147 }
148
149 static void test_address( libvlc_int_t *p_libvlc )
150 {
151     int i;
152     for( i = 0; i < i_var_count; i++ )
153          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_ADDRESS );
154
155     for( i = 0; i < i_var_count; i++ )
156     {
157         var_value[i].p_address = rand();
158         var_SetAddress( p_libvlc, psz_var_name[i], var_value[i].p_address );
159     }
160
161     for( i = 0; i < i_var_count; i++ )
162     {
163         vlc_value_t val;
164         var_Get( p_libvlc, psz_var_name[i], &val );
165         assert( val.p_address == var_value[i].p_address );
166     }
167
168     for( i = 0; i < i_var_count; i++ )
169         var_Destroy( p_libvlc, psz_var_name[i] );
170 }
171
172 static int callback( vlc_object_t* p_this, char const *psz_var,
173                      vlc_value_t oldval, vlc_value_t newval, void *p_data)
174 {
175     (void)p_this;    (void)oldval;
176     int i;
177
178     // Check the parameters
179     assert( p_data == psz_var_name );
180
181     // Find the variable
182     for( i = 0; i < i_var_count; i++ )
183     {
184         if( !strcmp( psz_var_name[i], psz_var ) )
185             break;
186     }
187     // Check the variable is known
188     assert( i < i_var_count );
189
190     var_value[i].i_int = newval.i_int;
191     return VLC_SUCCESS;
192 }
193
194 static void test_callbacks( libvlc_int_t *p_libvlc )
195 {
196     /* add the callbacks */
197     int i;
198     for( i = 0; i < i_var_count; i++ )
199     {
200         var_Create( p_libvlc, psz_var_name[i], VLC_VAR_INTEGER );
201         var_AddCallback( p_libvlc, psz_var_name[i], callback, psz_var_name );
202     }
203
204     /* Set the variables and trigger the callbacks */
205     for( i = 0; i < i_var_count; i++ )
206     {
207         int i_temp = rand();
208         var_SetInteger( p_libvlc, psz_var_name[i], i_temp );
209         assert( i_temp == var_value[i].i_int );
210         var_SetInteger( p_libvlc, psz_var_name[i], 0 );
211         assert( var_value[i].i_int == 0 );
212         var_value[i].i_int = 1;
213     }
214
215     /* Only trigger the callback: the value will be 0 again */
216     for( i = 0; i < i_var_count; i++ )
217     {
218         var_TriggerCallback( p_libvlc, psz_var_name[i] );
219         assert( var_value[i].i_int == 0 );
220     }
221
222     for( i = 0; i < i_var_count; i++ )
223         var_Destroy( p_libvlc, psz_var_name[i] );
224 }
225
226 static void test_limits( libvlc_int_t *p_libvlc )
227 {
228     vlc_value_t val;
229     val.i_int = 0;
230     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
231
232     var_Change( p_libvlc, "bla", VLC_VAR_GETMIN, &val, NULL );
233     assert( val.i_int == 0 );
234
235     val.i_int = -1234;
236     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
237     val.i_int = 12345;
238     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
239
240     var_Change( p_libvlc, "bla", VLC_VAR_GETMIN, &val, NULL );
241     assert( val.i_int == -1234 );
242     var_Change( p_libvlc, "bla", VLC_VAR_GETMAX, &val, NULL );
243     assert( val.i_int == 12345 );
244
245     var_SetInteger( p_libvlc, "bla", -123456 );
246     assert( var_GetInteger( p_libvlc, "bla" ) == -1234 );
247     var_SetInteger( p_libvlc, "bla", 1234 );
248     assert( var_GetInteger( p_libvlc, "bla" ) == 1234 );
249     var_SetInteger( p_libvlc, "bla", 12346 );
250     assert( var_GetInteger( p_libvlc, "bla" ) == 12345 );
251
252     val.i_int = 42;
253     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
254     var_SetInteger( p_libvlc, "bla", 20 );
255     val.i_int = 0;
256     var_Change( p_libvlc, "bla", VLC_VAR_GETSTEP, &val, NULL );
257     assert( val.i_int == 42 );
258
259     var_SetInteger( p_libvlc, "bla", 20 );
260     assert( var_GetInteger( p_libvlc, "bla" ) == 0 );
261
262     var_SetInteger( p_libvlc, "bla", 21 );
263     assert( var_GetInteger( p_libvlc, "bla" ) == 42 );
264
265     var_Destroy( p_libvlc, "bla" );
266 }
267
268 static void test_choices( libvlc_int_t *p_libvlc )
269 {
270     vlc_value_t val, val2;
271     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE |
272                                  VLC_VAR_ISCOMMAND );
273     val.i_int = 1;
274     val2.psz_string = (char*)"one";
275     var_Change( p_libvlc, "bla", VLC_VAR_ADDCHOICE, &val, &val2 );
276
277     val.i_int = 2;
278     val2.psz_string = (char*)"two";
279     var_Change( p_libvlc, "bla", VLC_VAR_ADDCHOICE, &val, &val2 );
280
281     assert( var_CountChoices( p_libvlc, "bla" ) == 2 );
282
283     var_Change( p_libvlc, "bla", VLC_VAR_DELCHOICE, &val, &val2 );
284     assert( var_CountChoices( p_libvlc, "bla" ) == 1 );
285
286     var_Change( p_libvlc, "bla", VLC_VAR_GETCHOICES, &val, &val2 );
287     assert( val.p_list->i_count == 1 && val.p_list->p_values[0].i_int == 1 &&
288             val2.p_list->i_count == 1 &&
289             !strcmp( val2.p_list->p_values[0].psz_string, "one" ) );
290     var_FreeList( &val, &val2 );
291
292     var_Change( p_libvlc, "bla", VLC_VAR_CLEARCHOICES, NULL, NULL );
293     assert( var_CountChoices( p_libvlc, "bla" ) == 0 );
294
295     var_Destroy( p_libvlc, "bla" );
296 }
297
298 static void test_change( libvlc_int_t *p_libvlc )
299 {
300     /* Add min, max and step
301        Yes we can have min > max but we don't really care */
302     vlc_value_t val;
303     int i_min, i_max, i_step;
304
305     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
306     val.i_int = i_min = rand();
307     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
308     val.i_int = i_max = rand();
309     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
310     val.i_int = i_step = rand();
311     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
312
313     /* Do something */
314     var_SetInteger( p_libvlc, "bla", rand() );
315     val.i_int = var_GetInteger( p_libvlc, "bla" ); /* dummy read */
316
317     /* Test everything is right */
318     var_Change( p_libvlc, "bla", VLC_VAR_GETMIN, &val, NULL );
319     assert( val.i_int = i_min );
320     var_Change( p_libvlc, "bla", VLC_VAR_GETMAX, &val, NULL );
321     assert( val.i_int = i_max );
322     var_Change( p_libvlc, "bla", VLC_VAR_GETSTEP, &val, NULL );
323     assert( val.i_int = i_step );
324
325     var_Destroy( p_libvlc, "bla" );
326 }
327
328 static void test_creation_and_type( libvlc_int_t *p_libvlc )
329 {
330     int i_type;
331     vlc_value_t val;
332     val.i_int = 4212;
333
334     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
335     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
336
337     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ) == VLC_SUCCESS );
338     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
339
340     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
341     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND) );
342
343     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
344     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN) );
345
346     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
347     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN | VLC_VAR_HASMAX) );
348
349     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
350     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN | VLC_VAR_HASMAX | VLC_VAR_HASSTEP) );
351
352     var_Destroy( p_libvlc, "bla" );
353     var_Destroy( p_libvlc, "bla" );
354     var_Destroy( p_libvlc, "bla" );
355     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
356
357     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
358     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
359
360     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
361     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND) );
362
363     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASCHOICE ) == VLC_SUCCESS );
364     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASCHOICE) );
365
366     var_Destroy( p_libvlc, "bla" );
367     var_Destroy( p_libvlc, "bla" );
368     var_Destroy( p_libvlc, "bla" );
369     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
370
371     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
372     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
373     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
374     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN) );
375     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE ) == VLC_SUCCESS );
376     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN | VLC_VAR_HASCHOICE) );
377
378     var_Destroy( p_libvlc, "bla" );
379     var_Destroy( p_libvlc, "bla" );
380     var_Destroy( p_libvlc, "bla" );
381     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
382
383     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
384     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
385     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
386     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
387     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMAX | VLC_VAR_HASSTEP) );
388     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE ) == VLC_SUCCESS );
389     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMAX | VLC_VAR_HASSTEP | VLC_VAR_HASCHOICE) );
390
391     var_Destroy( p_libvlc, "bla" );
392     var_Destroy( p_libvlc, "bla" );
393     var_Destroy( p_libvlc, "bla" );
394     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
395 }
396
397 static void test_variables( libvlc_instance_t *p_vlc )
398 {
399     libvlc_int_t *p_libvlc = p_vlc->p_libvlc_int;
400     srand( time( NULL ) );
401
402     log( "Testing for integers\n" );
403     test_integer( p_libvlc );
404
405     log( "Testing for booleans\n" );
406     test_booleans( p_libvlc );
407
408     log( "Testing for times\n" );
409     test_times( p_libvlc );
410
411     log( "Testing for floats\n" );
412     test_floats( p_libvlc );
413
414     log( "Testing for strings\n" );
415     test_strings( p_libvlc );
416
417     log( "Testing for addresses\n" );
418     test_address( p_libvlc );
419
420     log( "Testing the callbacks\n" );
421     test_callbacks( p_libvlc );
422
423     log( "Testing the limits\n" );
424     test_limits( p_libvlc );
425
426     log( "Testing choices\n" );
427     test_choices( p_libvlc );
428
429     log( "Testing var_Change()\n" );
430     test_change( p_libvlc );
431
432     log( "Testing type at creation\n" );
433     test_creation_and_type( p_libvlc );
434 }
435
436
437 int main( void )
438 {
439     libvlc_instance_t *p_vlc;
440
441     test_init();
442
443     log( "Testing the core variables\n" );
444     libvlc_exception_init( &ex );
445     p_vlc = libvlc_new( test_defaults_nargs, test_defaults_args, &ex );
446     catch();
447
448     test_variables( p_vlc );
449
450     libvlc_release( p_vlc );
451
452     return 0;
453 }
454