]> git.sesse.net Git - vlc/blob - test/src/misc/variables.c
0eff75544f2d9f6955d3eeb25e2ac6f1093dee32
[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_ToggleBool( p_libvlc, psz_var_name[i] );
76
77     for( i = 0; i < i_var_count; i++ )
78         assert( var_GetBool( p_libvlc, psz_var_name[i] ) != var_value[i].b_bool );
79
80     for( i = 0; i < i_var_count; i++ )
81         var_Destroy( p_libvlc, psz_var_name[i] );
82 }
83
84 static void test_times( libvlc_int_t *p_libvlc )
85 {
86     int i;
87     for( i = 0; i < i_var_count; i++ )
88          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_TIME );
89
90     for( i = 0; i < i_var_count; i++ )
91     {
92         var_value[i].i_time = rand();
93         var_SetTime( p_libvlc, psz_var_name[i], var_value[i].i_time );
94     }
95
96     for( i = 0; i < i_var_count; i++ )
97         assert( var_GetTime( p_libvlc, psz_var_name[i] ) == var_value[i].i_time );
98
99     for( i = 0; i < i_var_count; i++ )
100         var_Destroy( p_libvlc, psz_var_name[i] );
101 }
102
103 static void test_floats( libvlc_int_t *p_libvlc )
104 {
105     int i;
106     for( i = 0; i < i_var_count; i++ )
107          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_FLOAT );
108
109     for( i = 0; i < i_var_count; i++ )
110     {
111         var_value[i].f_float = rand();
112         var_SetFloat( p_libvlc, psz_var_name[i], var_value[i].f_float );
113     }
114
115     for( i = 0; i < i_var_count; i++ )
116         assert( var_GetFloat( p_libvlc, psz_var_name[i] ) == var_value[i].f_float );
117
118     for( i = 0; i < i_var_count; i++ )
119         var_Destroy( p_libvlc, psz_var_name[i] );
120 }
121
122 static void test_strings( libvlc_int_t *p_libvlc )
123 {
124     int i;
125     char *psz_tmp;
126     for( i = 0; i < i_var_count; i++ )
127          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_STRING );
128
129     for( i = 0; i < i_var_count; i++ )
130         var_SetString( p_libvlc, psz_var_name[i], psz_var_name[i] );
131
132     for( i = 0; i < i_var_count; i++ )
133     {
134         psz_tmp = var_GetString( p_libvlc, psz_var_name[i] );
135         assert( !strcmp( psz_tmp, psz_var_name[i] ) );
136         free( psz_tmp );
137     }
138
139     for( i = 0; i < i_var_count; i++ )
140         var_Destroy( p_libvlc, psz_var_name[i] );
141
142
143     /* Some more test for strings */
144     var_Create( p_libvlc, "bla", VLC_VAR_STRING );
145     assert( var_GetNonEmptyString( p_libvlc, "bla" ) == NULL );
146     var_SetString( p_libvlc, "bla", "" );
147     assert( var_GetNonEmptyString( p_libvlc, "bla" ) == NULL );
148     var_SetString( p_libvlc, "bla", "test" );
149     psz_tmp = var_GetNonEmptyString( p_libvlc, "bla" );
150     assert( !strcmp( psz_tmp, "test" ) );
151     free( psz_tmp );
152     var_Destroy( p_libvlc, "bla" );
153 }
154
155 static void test_address( libvlc_int_t *p_libvlc )
156 {
157     int i;
158     for( i = 0; i < i_var_count; i++ )
159          var_Create( p_libvlc, psz_var_name[i], VLC_VAR_ADDRESS );
160
161     for( i = 0; i < i_var_count; i++ )
162     {
163         var_value[i].p_address = rand();
164         var_SetAddress( p_libvlc, psz_var_name[i], var_value[i].p_address );
165     }
166
167     for( i = 0; i < i_var_count; i++ )
168     {
169         vlc_value_t val;
170         var_Get( p_libvlc, psz_var_name[i], &val );
171         assert( val.p_address == var_value[i].p_address );
172     }
173
174     for( i = 0; i < i_var_count; i++ )
175         var_Destroy( p_libvlc, psz_var_name[i] );
176 }
177
178 static int callback( vlc_object_t* p_this, char const *psz_var,
179                      vlc_value_t oldval, vlc_value_t newval, void *p_data)
180 {
181     (void)p_this;    (void)oldval;
182     int i;
183
184     // Check the parameters
185     assert( p_data == psz_var_name );
186
187     // Find the variable
188     for( i = 0; i < i_var_count; i++ )
189     {
190         if( !strcmp( psz_var_name[i], psz_var ) )
191             break;
192     }
193     // Check the variable is known
194     assert( i < i_var_count );
195
196     var_value[i].i_int = newval.i_int;
197     return VLC_SUCCESS;
198 }
199
200 static void test_callbacks( libvlc_int_t *p_libvlc )
201 {
202     /* add the callbacks */
203     int i;
204     for( i = 0; i < i_var_count; i++ )
205     {
206         var_Create( p_libvlc, psz_var_name[i], VLC_VAR_INTEGER );
207         var_AddCallback( p_libvlc, psz_var_name[i], callback, psz_var_name );
208     }
209
210     /* Set the variables and trigger the callbacks */
211     for( i = 0; i < i_var_count; i++ )
212     {
213         int i_temp = rand();
214         var_SetInteger( p_libvlc, psz_var_name[i], i_temp );
215         assert( i_temp == var_value[i].i_int );
216         var_SetInteger( p_libvlc, psz_var_name[i], 0 );
217         assert( var_value[i].i_int == 0 );
218         var_value[i].i_int = 1;
219     }
220
221     /* Only trigger the callback: the value will be 0 again */
222     for( i = 0; i < i_var_count; i++ )
223     {
224         var_TriggerCallback( p_libvlc, psz_var_name[i] );
225         assert( var_value[i].i_int == 0 );
226     }
227
228     for( i = 0; i < i_var_count; i++ )
229         var_Destroy( p_libvlc, psz_var_name[i] );
230 }
231
232 static void test_limits( libvlc_int_t *p_libvlc )
233 {
234     vlc_value_t val;
235     val.i_int = 0;
236     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
237
238     var_Change( p_libvlc, "bla", VLC_VAR_GETMIN, &val, NULL );
239     assert( val.i_int == 0 );
240
241     val.i_int = -1234;
242     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
243     val.i_int = 12345;
244     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
245
246     var_Change( p_libvlc, "bla", VLC_VAR_GETMIN, &val, NULL );
247     assert( val.i_int == -1234 );
248     var_Change( p_libvlc, "bla", VLC_VAR_GETMAX, &val, NULL );
249     assert( val.i_int == 12345 );
250
251     var_SetInteger( p_libvlc, "bla", -123456 );
252     assert( var_GetInteger( p_libvlc, "bla" ) == -1234 );
253     var_SetInteger( p_libvlc, "bla", 1234 );
254     assert( var_GetInteger( p_libvlc, "bla" ) == 1234 );
255     var_SetInteger( p_libvlc, "bla", 12346 );
256     assert( var_GetInteger( p_libvlc, "bla" ) == 12345 );
257
258     val.i_int = 42;
259     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
260     var_SetInteger( p_libvlc, "bla", 20 );
261     val.i_int = 0;
262     var_Change( p_libvlc, "bla", VLC_VAR_GETSTEP, &val, NULL );
263     assert( val.i_int == 42 );
264
265     var_SetInteger( p_libvlc, "bla", 20 );
266     assert( var_GetInteger( p_libvlc, "bla" ) == 0 );
267
268     var_SetInteger( p_libvlc, "bla", 21 );
269     assert( var_GetInteger( p_libvlc, "bla" ) == 42 );
270
271     var_Destroy( p_libvlc, "bla" );
272 }
273
274 static void test_choices( libvlc_int_t *p_libvlc )
275 {
276     vlc_value_t val, val2;
277     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE |
278                                  VLC_VAR_ISCOMMAND );
279     val.i_int = 1;
280     val2.psz_string = (char*)"one";
281     var_Change( p_libvlc, "bla", VLC_VAR_ADDCHOICE, &val, &val2 );
282
283     val.i_int = 2;
284     val2.psz_string = (char*)"two";
285     var_Change( p_libvlc, "bla", VLC_VAR_ADDCHOICE, &val, &val2 );
286
287     assert( var_CountChoices( p_libvlc, "bla" ) == 2 );
288
289     var_Change( p_libvlc, "bla", VLC_VAR_DELCHOICE, &val, &val2 );
290     assert( var_CountChoices( p_libvlc, "bla" ) == 1 );
291
292     var_Change( p_libvlc, "bla", VLC_VAR_GETCHOICES, &val, &val2 );
293     assert( val.p_list->i_count == 1 && val.p_list->p_values[0].i_int == 1 &&
294             val2.p_list->i_count == 1 &&
295             !strcmp( val2.p_list->p_values[0].psz_string, "one" ) );
296     var_FreeList( &val, &val2 );
297
298     var_Change( p_libvlc, "bla", VLC_VAR_CLEARCHOICES, NULL, NULL );
299     assert( var_CountChoices( p_libvlc, "bla" ) == 0 );
300
301     var_Destroy( p_libvlc, "bla" );
302 }
303
304 static void test_change( libvlc_int_t *p_libvlc )
305 {
306     /* Add min, max and step
307        Yes we can have min > max but we don't really care */
308     vlc_value_t val;
309     int i_min, i_max, i_step;
310
311     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
312     val.i_int = i_min = rand();
313     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
314     val.i_int = i_max = rand();
315     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
316     val.i_int = i_step = rand();
317     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
318
319     /* Do something */
320     var_SetInteger( p_libvlc, "bla", rand() );
321     val.i_int = var_GetInteger( p_libvlc, "bla" ); /* dummy read */
322
323     /* Test everything is right */
324     var_Change( p_libvlc, "bla", VLC_VAR_GETMIN, &val, NULL );
325     assert( val.i_int = i_min );
326     var_Change( p_libvlc, "bla", VLC_VAR_GETMAX, &val, NULL );
327     assert( val.i_int = i_max );
328     var_Change( p_libvlc, "bla", VLC_VAR_GETSTEP, &val, NULL );
329     assert( val.i_int = i_step );
330
331     var_Destroy( p_libvlc, "bla" );
332 }
333
334 static void test_creation_and_type( libvlc_int_t *p_libvlc )
335 {
336     vlc_value_t val;
337     val.i_int = 4212;
338
339     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
340     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
341
342     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ) == VLC_SUCCESS );
343     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
344
345     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
346     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND) );
347
348     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
349     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN) );
350
351     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
352     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN | VLC_VAR_HASMAX) );
353
354     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
355     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN | VLC_VAR_HASMAX | VLC_VAR_HASSTEP) );
356
357     var_Destroy( p_libvlc, "bla" );
358     var_Destroy( p_libvlc, "bla" );
359     var_Destroy( p_libvlc, "bla" );
360     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
361
362     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
363     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
364
365     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
366     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND) );
367
368     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASCHOICE ) == VLC_SUCCESS );
369     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASCHOICE) );
370
371     var_Destroy( p_libvlc, "bla" );
372     var_Destroy( p_libvlc, "bla" );
373     var_Destroy( p_libvlc, "bla" );
374     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
375
376     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
377     var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
378     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
379     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN) );
380     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE ) == VLC_SUCCESS );
381     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMIN | VLC_VAR_HASCHOICE) );
382
383     var_Destroy( p_libvlc, "bla" );
384     var_Destroy( p_libvlc, "bla" );
385     var_Destroy( p_libvlc, "bla" );
386     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
387
388     var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
389     var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
390     var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
391     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ) == VLC_SUCCESS );
392     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMAX | VLC_VAR_HASSTEP) );
393     assert( var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE ) == VLC_SUCCESS );
394     assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND | VLC_VAR_HASMAX | VLC_VAR_HASSTEP | VLC_VAR_HASCHOICE) );
395
396     var_Destroy( p_libvlc, "bla" );
397     var_Destroy( p_libvlc, "bla" );
398     var_Destroy( p_libvlc, "bla" );
399     assert( var_Get( p_libvlc, "bla", &val ) == VLC_ENOVAR );
400 }
401
402 static void test_variables( libvlc_instance_t *p_vlc )
403 {
404     libvlc_int_t *p_libvlc = p_vlc->p_libvlc_int;
405     srand( time( NULL ) );
406
407     log( "Testing for integers\n" );
408     test_integer( p_libvlc );
409
410     log( "Testing for booleans\n" );
411     test_booleans( p_libvlc );
412
413     log( "Testing for times\n" );
414     test_times( p_libvlc );
415
416     log( "Testing for floats\n" );
417     test_floats( p_libvlc );
418
419     log( "Testing for strings\n" );
420     test_strings( p_libvlc );
421
422     log( "Testing for addresses\n" );
423     test_address( p_libvlc );
424
425     log( "Testing the callbacks\n" );
426     test_callbacks( p_libvlc );
427
428     log( "Testing the limits\n" );
429     test_limits( p_libvlc );
430
431     log( "Testing choices\n" );
432     test_choices( p_libvlc );
433
434     log( "Testing var_Change()\n" );
435     test_change( p_libvlc );
436
437     log( "Testing type at creation\n" );
438     test_creation_and_type( p_libvlc );
439 }
440
441
442 int main( void )
443 {
444     libvlc_instance_t *p_vlc;
445
446     test_init();
447
448     log( "Testing the core variables\n" );
449     libvlc_exception_init( &ex );
450     p_vlc = libvlc_new( test_defaults_nargs, test_defaults_args, &ex );
451     catch();
452
453     test_variables( p_vlc );
454
455     libvlc_release( p_vlc );
456
457     return 0;
458 }
459