1 /*****************************************************************************
2 * variables.c: test for variables
3 *****************************************************************************
4 * Copyright (C) 2009 the VideoLAN team
7 * Authors: Rémi Duraffort <ivoire@videolan.org>
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.
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.
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 *****************************************************************************/
26 #include "../../libvlc/test.h"
27 #include <../src/control/libvlc_internal.h>
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];
34 static void test_integer( libvlc_int_t *p_libvlc )
37 for( i = 0; i < i_var_count; i++ )
38 var_Create( p_libvlc, psz_var_name[i], VLC_VAR_INTEGER );
40 for( i = 0; i < i_var_count; i++ )
42 var_value[i].i_int = rand();
43 var_SetInteger( p_libvlc, psz_var_name[i], var_value[i].i_int );
46 for( i = 0; i < i_var_count; i++ )
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 );
55 for( i = 0; i < i_var_count; i++ )
56 var_Destroy( p_libvlc, psz_var_name[i] );
59 static void test_booleans( libvlc_int_t *p_libvlc )
62 for( i = 0; i < i_var_count; i++ )
63 var_Create( p_libvlc, psz_var_name[i], VLC_VAR_BOOL );
65 for( i = 0; i < i_var_count; i++ )
67 var_value[i].b_bool = (rand() > RAND_MAX/2);
68 var_SetBool( p_libvlc, psz_var_name[i], var_value[i].b_bool );
71 for( i = 0; i < i_var_count; i++ )
72 assert( var_GetBool( p_libvlc, psz_var_name[i] ) == var_value[i].b_bool );
74 for( i = 0; i < i_var_count; i++ )
75 var_Destroy( p_libvlc, psz_var_name[i] );
78 static void test_times( libvlc_int_t *p_libvlc )
81 for( i = 0; i < i_var_count; i++ )
82 var_Create( p_libvlc, psz_var_name[i], VLC_VAR_TIME );
84 for( i = 0; i < i_var_count; i++ )
86 var_value[i].i_time = rand();
87 var_SetTime( p_libvlc, psz_var_name[i], var_value[i].i_time );
90 for( i = 0; i < i_var_count; i++ )
91 assert( var_GetTime( p_libvlc, psz_var_name[i] ) == var_value[i].i_time );
93 for( i = 0; i < i_var_count; i++ )
94 var_Destroy( p_libvlc, psz_var_name[i] );
97 static void test_floats( libvlc_int_t *p_libvlc )
100 for( i = 0; i < i_var_count; i++ )
101 var_Create( p_libvlc, psz_var_name[i], VLC_VAR_FLOAT );
103 for( i = 0; i < i_var_count; i++ )
105 var_value[i].f_float = rand();
106 var_SetFloat( p_libvlc, psz_var_name[i], var_value[i].f_float );
109 for( i = 0; i < i_var_count; i++ )
110 assert( var_GetFloat( p_libvlc, psz_var_name[i] ) == var_value[i].f_float );
112 for( i = 0; i < i_var_count; i++ )
113 var_Destroy( p_libvlc, psz_var_name[i] );
116 static void test_strings( libvlc_int_t *p_libvlc )
120 for( i = 0; i < i_var_count; i++ )
121 var_Create( p_libvlc, psz_var_name[i], VLC_VAR_STRING );
123 for( i = 0; i < i_var_count; i++ )
124 var_SetString( p_libvlc, psz_var_name[i], psz_var_name[i] );
126 for( i = 0; i < i_var_count; i++ )
128 psz_tmp = var_GetString( p_libvlc, psz_var_name[i] );
129 assert( !strcmp( psz_tmp, psz_var_name[i] ) );
133 for( i = 0; i < i_var_count; i++ )
134 var_Destroy( p_libvlc, psz_var_name[i] );
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" ) );
146 var_Destroy( p_libvlc, "bla" );
149 static void test_address( libvlc_int_t *p_libvlc )
152 for( i = 0; i < i_var_count; i++ )
153 var_Create( p_libvlc, psz_var_name[i], VLC_VAR_ADDRESS );
155 for( i = 0; i < i_var_count; i++ )
157 var_value[i].p_address = rand();
158 var_SetAddress( p_libvlc, psz_var_name[i], var_value[i].p_address );
161 for( i = 0; i < i_var_count; i++ )
164 var_Get( p_libvlc, psz_var_name[i], &val );
165 assert( val.p_address == var_value[i].p_address );
168 for( i = 0; i < i_var_count; i++ )
169 var_Destroy( p_libvlc, psz_var_name[i] );
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)
175 (void)p_this; (void)oldval;
178 // Check the parameters
179 assert( p_data == psz_var_name );
182 for( i = 0; i < i_var_count; i++ )
184 if( !strcmp( psz_var_name[i], psz_var ) )
187 // Check the variable is known
188 assert( i < i_var_count );
190 var_value[i].i_int = newval.i_int;
194 static void test_callbacks( libvlc_int_t *p_libvlc )
196 /* add the callbacks */
198 for( i = 0; i < i_var_count; i++ )
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 );
204 /* Set the variables and trigger the callbacks */
205 for( i = 0; i < i_var_count; i++ )
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;
215 /* Only trigger the callback: the value will be 0 again */
216 for( i = 0; i < i_var_count; i++ )
218 var_TriggerCallback( p_libvlc, psz_var_name[i] );
219 assert( var_value[i].i_int == 0 );
222 for( i = 0; i < i_var_count; i++ )
223 var_Destroy( p_libvlc, psz_var_name[i] );
226 static void test_limits( libvlc_int_t *p_libvlc )
230 var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
232 var_Change( p_libvlc, "bla", VLC_VAR_GETMIN, &val, NULL );
233 assert( val.i_int == 0 );
236 var_Change( p_libvlc, "bla", VLC_VAR_SETMIN, &val, NULL );
238 var_Change( p_libvlc, "bla", VLC_VAR_SETMAX, &val, NULL );
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 );
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 );
253 var_Change( p_libvlc, "bla", VLC_VAR_SETSTEP, &val, NULL );
254 var_SetInteger( p_libvlc, "bla", 20 );
256 var_Change( p_libvlc, "bla", VLC_VAR_GETSTEP, &val, NULL );
257 assert( val.i_int == 42 );
259 var_SetInteger( p_libvlc, "bla", 20 );
260 assert( var_GetInteger( p_libvlc, "bla" ) == 0 );
262 var_SetInteger( p_libvlc, "bla", 21 );
263 assert( var_GetInteger( p_libvlc, "bla" ) == 42 );
265 var_Destroy( p_libvlc, "bla" );
268 static void test_choices( libvlc_int_t *p_libvlc )
270 vlc_value_t val, val2;
271 var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE |
274 val2.psz_string = (char*)"one";
275 var_Change( p_libvlc, "bla", VLC_VAR_ADDCHOICE, &val, &val2 );
278 val2.psz_string = (char*)"two";
279 var_Change( p_libvlc, "bla", VLC_VAR_ADDCHOICE, &val, &val2 );
281 assert( var_CountChoices( p_libvlc, "bla" ) == 2 );
283 var_Change( p_libvlc, "bla", VLC_VAR_DELCHOICE, &val, &val2 );
284 assert( var_CountChoices( p_libvlc, "bla" ) == 1 );
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 );
292 var_Change( p_libvlc, "bla", VLC_VAR_CLEARCHOICES, NULL, NULL );
293 assert( var_CountChoices( p_libvlc, "bla" ) == 0 );
295 var_Destroy( p_libvlc, "bla" );
298 static void test_change( libvlc_int_t *p_libvlc )
300 /* Add min, max and step
301 Yes we can have min > max but we don't really care */
303 int i_min, i_max, i_step;
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 );
314 var_SetInteger( p_libvlc, "bla", rand() );
315 val.i_int = var_GetInteger( p_libvlc, "bla" ); /* dummy read */
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 );
325 var_Destroy( p_libvlc, "bla" );
328 static void test_creation_and_type( libvlc_int_t *p_libvlc )
334 var_Create( p_libvlc, "bla", VLC_VAR_INTEGER );
335 assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
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) );
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) );
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) );
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) );
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) );
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 );
357 var_Create( p_libvlc, "bla", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
358 assert( var_Type( p_libvlc, "bla" ) == (VLC_VAR_INTEGER) );
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) );
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) );
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 );
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) );
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 );
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) );
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 );
397 static void test_variables( libvlc_instance_t *p_vlc )
399 libvlc_int_t *p_libvlc = p_vlc->p_libvlc_int;
400 srand( time( NULL ) );
402 log( "Testing for integers\n" );
403 test_integer( p_libvlc );
405 log( "Testing for booleans\n" );
406 test_booleans( p_libvlc );
408 log( "Testing for times\n" );
409 test_times( p_libvlc );
411 log( "Testing for floats\n" );
412 test_floats( p_libvlc );
414 log( "Testing for strings\n" );
415 test_strings( p_libvlc );
417 log( "Testing for addresses\n" );
418 test_address( p_libvlc );
420 log( "Testing the callbacks\n" );
421 test_callbacks( p_libvlc );
423 log( "Testing the limits\n" );
424 test_limits( p_libvlc );
426 log( "Testing choices\n" );
427 test_choices( p_libvlc );
429 log( "Testing var_Change()\n" );
430 test_change( p_libvlc );
432 log( "Testing type at creation\n" );
433 test_creation_and_type( p_libvlc );
439 libvlc_instance_t *p_vlc;
443 log( "Testing the core variables\n" );
444 libvlc_exception_init( &ex );
445 p_vlc = libvlc_new( test_defaults_nargs, test_defaults_args, &ex );
448 test_variables( p_vlc );
450 libvlc_release( p_vlc );