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_ToggleBool( p_libvlc
, psz_var_name
[i
] );
77 for( i
= 0; i
< i_var_count
; i
++ )
78 assert( var_GetBool( p_libvlc
, psz_var_name
[i
] ) != var_value
[i
].b_bool
);
80 for( i
= 0; i
< i_var_count
; i
++ )
81 var_Destroy( p_libvlc
, psz_var_name
[i
] );
84 static void test_times( libvlc_int_t
*p_libvlc
)
87 for( i
= 0; i
< i_var_count
; i
++ )
88 var_Create( p_libvlc
, psz_var_name
[i
], VLC_VAR_TIME
);
90 for( i
= 0; i
< i_var_count
; i
++ )
92 var_value
[i
].i_time
= rand();
93 var_SetTime( p_libvlc
, psz_var_name
[i
], var_value
[i
].i_time
);
96 for( i
= 0; i
< i_var_count
; i
++ )
97 assert( var_GetTime( p_libvlc
, psz_var_name
[i
] ) == var_value
[i
].i_time
);
99 for( i
= 0; i
< i_var_count
; i
++ )
100 var_Destroy( p_libvlc
, psz_var_name
[i
] );
103 static void test_floats( libvlc_int_t
*p_libvlc
)
106 for( i
= 0; i
< i_var_count
; i
++ )
107 var_Create( p_libvlc
, psz_var_name
[i
], VLC_VAR_FLOAT
);
109 for( i
= 0; i
< i_var_count
; i
++ )
111 var_value
[i
].f_float
= rand();
112 var_SetFloat( p_libvlc
, psz_var_name
[i
], var_value
[i
].f_float
);
115 for( i
= 0; i
< i_var_count
; i
++ )
116 assert( var_GetFloat( p_libvlc
, psz_var_name
[i
] ) == var_value
[i
].f_float
);
118 for( i
= 0; i
< i_var_count
; i
++ )
119 var_Destroy( p_libvlc
, psz_var_name
[i
] );
122 static void test_strings( libvlc_int_t
*p_libvlc
)
126 for( i
= 0; i
< i_var_count
; i
++ )
127 var_Create( p_libvlc
, psz_var_name
[i
], VLC_VAR_STRING
);
129 for( i
= 0; i
< i_var_count
; i
++ )
130 var_SetString( p_libvlc
, psz_var_name
[i
], psz_var_name
[i
] );
132 for( i
= 0; i
< i_var_count
; i
++ )
134 psz_tmp
= var_GetString( p_libvlc
, psz_var_name
[i
] );
135 assert( !strcmp( psz_tmp
, psz_var_name
[i
] ) );
139 for( i
= 0; i
< i_var_count
; i
++ )
140 var_Destroy( p_libvlc
, psz_var_name
[i
] );
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" ) );
152 var_Destroy( p_libvlc
, "bla" );
155 static void test_address( libvlc_int_t
*p_libvlc
)
157 char dummy
[i_var_count
];
160 for( i
= 0; i
< i_var_count
; i
++ )
161 var_Create( p_libvlc
, psz_var_name
[i
], VLC_VAR_ADDRESS
);
163 for( i
= 0; i
< i_var_count
; i
++ )
165 var_value
[i
].p_address
= dummy
+ i
;
166 var_SetAddress( p_libvlc
, psz_var_name
[i
], var_value
[i
].p_address
);
169 for( i
= 0; i
< i_var_count
; i
++ )
172 var_Get( p_libvlc
, psz_var_name
[i
], &val
);
173 assert( val
.p_address
== var_value
[i
].p_address
);
176 for( i
= 0; i
< i_var_count
; i
++ )
177 var_Destroy( p_libvlc
, psz_var_name
[i
] );
180 static int callback( vlc_object_t
* p_this
, char const *psz_var
,
181 vlc_value_t oldval
, vlc_value_t newval
, void *p_data
)
183 (void)p_this
; (void)oldval
;
186 // Check the parameters
187 assert( p_data
== psz_var_name
);
190 for( i
= 0; i
< i_var_count
; i
++ )
192 if( !strcmp( psz_var_name
[i
], psz_var
) )
195 // Check the variable is known
196 assert( i
< i_var_count
);
198 var_value
[i
].i_int
= newval
.i_int
;
202 static void test_callbacks( libvlc_int_t
*p_libvlc
)
204 /* add the callbacks */
206 for( i
= 0; i
< i_var_count
; i
++ )
208 var_Create( p_libvlc
, psz_var_name
[i
], VLC_VAR_INTEGER
);
209 var_AddCallback( p_libvlc
, psz_var_name
[i
], callback
, psz_var_name
);
212 /* Set the variables and trigger the callbacks */
213 for( i
= 0; i
< i_var_count
; i
++ )
216 var_SetInteger( p_libvlc
, psz_var_name
[i
], i_temp
);
217 assert( i_temp
== var_value
[i
].i_int
);
218 var_SetInteger( p_libvlc
, psz_var_name
[i
], 0 );
219 assert( var_value
[i
].i_int
== 0 );
220 var_value
[i
].i_int
= 1;
223 /* Only trigger the callback: the value will be 0 again */
224 for( i
= 0; i
< i_var_count
; i
++ )
226 var_TriggerCallback( p_libvlc
, psz_var_name
[i
] );
227 assert( var_value
[i
].i_int
== 0 );
230 for( i
= 0; i
< i_var_count
; i
++ )
231 var_Destroy( p_libvlc
, psz_var_name
[i
] );
234 static void test_limits( libvlc_int_t
*p_libvlc
)
238 var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
);
240 var_Change( p_libvlc
, "bla", VLC_VAR_GETMIN
, &val
, NULL
);
241 assert( val
.i_int
== 0 );
244 var_Change( p_libvlc
, "bla", VLC_VAR_SETMIN
, &val
, NULL
);
246 var_Change( p_libvlc
, "bla", VLC_VAR_SETMAX
, &val
, NULL
);
248 var_Change( p_libvlc
, "bla", VLC_VAR_GETMIN
, &val
, NULL
);
249 assert( val
.i_int
== -1234 );
250 var_Change( p_libvlc
, "bla", VLC_VAR_GETMAX
, &val
, NULL
);
251 assert( val
.i_int
== 12345 );
253 var_SetInteger( p_libvlc
, "bla", -123456 );
254 assert( var_GetInteger( p_libvlc
, "bla" ) == -1234 );
255 var_SetInteger( p_libvlc
, "bla", 1234 );
256 assert( var_GetInteger( p_libvlc
, "bla" ) == 1234 );
257 var_SetInteger( p_libvlc
, "bla", 12346 );
258 assert( var_GetInteger( p_libvlc
, "bla" ) == 12345 );
261 var_Change( p_libvlc
, "bla", VLC_VAR_SETSTEP
, &val
, NULL
);
262 var_SetInteger( p_libvlc
, "bla", 20 );
264 var_Change( p_libvlc
, "bla", VLC_VAR_GETSTEP
, &val
, NULL
);
265 assert( val
.i_int
== 42 );
267 var_SetInteger( p_libvlc
, "bla", 20 );
268 assert( var_GetInteger( p_libvlc
, "bla" ) == 0 );
270 var_SetInteger( p_libvlc
, "bla", 21 );
271 assert( var_GetInteger( p_libvlc
, "bla" ) == 42 );
273 var_Destroy( p_libvlc
, "bla" );
276 static void test_choices( libvlc_int_t
*p_libvlc
)
278 vlc_value_t val
, val2
;
279 var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_HASCHOICE
|
282 val2
.psz_string
= (char*)"one";
283 var_Change( p_libvlc
, "bla", VLC_VAR_ADDCHOICE
, &val
, &val2
);
286 val2
.psz_string
= (char*)"two";
287 var_Change( p_libvlc
, "bla", VLC_VAR_ADDCHOICE
, &val
, &val2
);
289 assert( var_CountChoices( p_libvlc
, "bla" ) == 2 );
291 var_Change( p_libvlc
, "bla", VLC_VAR_DELCHOICE
, &val
, &val2
);
292 assert( var_CountChoices( p_libvlc
, "bla" ) == 1 );
294 var_Change( p_libvlc
, "bla", VLC_VAR_GETCHOICES
, &val
, &val2
);
295 assert( val
.p_list
->i_count
== 1 && val
.p_list
->p_values
[0].i_int
== 1 &&
296 val2
.p_list
->i_count
== 1 &&
297 !strcmp( val2
.p_list
->p_values
[0].psz_string
, "one" ) );
298 var_FreeList( &val
, &val2
);
300 var_Change( p_libvlc
, "bla", VLC_VAR_CLEARCHOICES
, NULL
, NULL
);
301 assert( var_CountChoices( p_libvlc
, "bla" ) == 0 );
303 var_Destroy( p_libvlc
, "bla" );
306 static void test_change( libvlc_int_t
*p_libvlc
)
308 /* Add min, max and step
309 Yes we can have min > max but we don't really care */
311 int i_min
, i_max
, i_step
;
313 var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
);
314 val
.i_int
= i_min
= rand();
315 var_Change( p_libvlc
, "bla", VLC_VAR_SETMIN
, &val
, NULL
);
316 val
.i_int
= i_max
= rand();
317 var_Change( p_libvlc
, "bla", VLC_VAR_SETMAX
, &val
, NULL
);
318 val
.i_int
= i_step
= rand();
319 var_Change( p_libvlc
, "bla", VLC_VAR_SETSTEP
, &val
, NULL
);
322 var_SetInteger( p_libvlc
, "bla", rand() );
323 val
.i_int
= var_GetInteger( p_libvlc
, "bla" ); /* dummy read */
325 /* Test everything is right */
326 var_Change( p_libvlc
, "bla", VLC_VAR_GETMIN
, &val
, NULL
);
327 assert( val
.i_int
= i_min
);
328 var_Change( p_libvlc
, "bla", VLC_VAR_GETMAX
, &val
, NULL
);
329 assert( val
.i_int
= i_max
);
330 var_Change( p_libvlc
, "bla", VLC_VAR_GETSTEP
, &val
, NULL
);
331 assert( val
.i_int
= i_step
);
333 var_Destroy( p_libvlc
, "bla" );
336 static void test_creation_and_type( libvlc_int_t
*p_libvlc
)
341 var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
);
342 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
) );
344 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
) == VLC_SUCCESS
);
345 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
) );
347 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
) == VLC_SUCCESS
);
348 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
) );
350 var_Change( p_libvlc
, "bla", VLC_VAR_SETMIN
, &val
, NULL
);
351 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASMIN
) );
353 var_Change( p_libvlc
, "bla", VLC_VAR_SETMAX
, &val
, NULL
);
354 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASMIN
| VLC_VAR_HASMAX
) );
356 var_Change( p_libvlc
, "bla", VLC_VAR_SETSTEP
, &val
, NULL
);
357 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASMIN
| VLC_VAR_HASMAX
| VLC_VAR_HASSTEP
) );
359 var_Destroy( p_libvlc
, "bla" );
360 var_Destroy( p_libvlc
, "bla" );
361 var_Destroy( p_libvlc
, "bla" );
362 assert( var_Get( p_libvlc
, "bla", &val
) == VLC_ENOVAR
);
364 var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
365 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
) );
367 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
) == VLC_SUCCESS
);
368 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
) );
370 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASCHOICE
) == VLC_SUCCESS
);
371 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASCHOICE
) );
373 var_Destroy( p_libvlc
, "bla" );
374 var_Destroy( p_libvlc
, "bla" );
375 var_Destroy( p_libvlc
, "bla" );
376 assert( var_Get( p_libvlc
, "bla", &val
) == VLC_ENOVAR
);
378 var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
);
379 var_Change( p_libvlc
, "bla", VLC_VAR_SETMIN
, &val
, NULL
);
380 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
) == VLC_SUCCESS
);
381 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASMIN
) );
382 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_HASCHOICE
) == VLC_SUCCESS
);
383 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASMIN
| VLC_VAR_HASCHOICE
) );
385 var_Destroy( p_libvlc
, "bla" );
386 var_Destroy( p_libvlc
, "bla" );
387 var_Destroy( p_libvlc
, "bla" );
388 assert( var_Get( p_libvlc
, "bla", &val
) == VLC_ENOVAR
);
390 var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
);
391 var_Change( p_libvlc
, "bla", VLC_VAR_SETMAX
, &val
, NULL
);
392 var_Change( p_libvlc
, "bla", VLC_VAR_SETSTEP
, &val
, NULL
);
393 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
) == VLC_SUCCESS
);
394 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASMAX
| VLC_VAR_HASSTEP
) );
395 assert( var_Create( p_libvlc
, "bla", VLC_VAR_INTEGER
| VLC_VAR_HASCHOICE
) == VLC_SUCCESS
);
396 assert( var_Type( p_libvlc
, "bla" ) == (VLC_VAR_INTEGER
| VLC_VAR_ISCOMMAND
| VLC_VAR_HASMAX
| VLC_VAR_HASSTEP
| VLC_VAR_HASCHOICE
) );
398 var_Destroy( p_libvlc
, "bla" );
399 var_Destroy( p_libvlc
, "bla" );
400 var_Destroy( p_libvlc
, "bla" );
401 assert( var_Get( p_libvlc
, "bla", &val
) == VLC_ENOVAR
);
404 static void test_variables( libvlc_instance_t
*p_vlc
)
406 libvlc_int_t
*p_libvlc
= p_vlc
->p_libvlc_int
;
407 srand( time( NULL
) );
409 log( "Testing for integers\n" );
410 test_integer( p_libvlc
);
412 log( "Testing for booleans\n" );
413 test_booleans( p_libvlc
);
415 log( "Testing for times\n" );
416 test_times( p_libvlc
);
418 log( "Testing for floats\n" );
419 test_floats( p_libvlc
);
421 log( "Testing for strings\n" );
422 test_strings( p_libvlc
);
424 log( "Testing for addresses\n" );
425 test_address( p_libvlc
);
427 log( "Testing the callbacks\n" );
428 test_callbacks( p_libvlc
);
430 log( "Testing the limits\n" );
431 test_limits( p_libvlc
);
433 log( "Testing choices\n" );
434 test_choices( p_libvlc
);
436 log( "Testing var_Change()\n" );
437 test_change( p_libvlc
);
439 log( "Testing type at creation\n" );
440 test_creation_and_type( p_libvlc
);
446 libvlc_instance_t
*p_vlc
;
450 log( "Testing the core variables\n" );
451 p_vlc
= libvlc_new( test_defaults_nargs
, test_defaults_args
);
452 assert( p_vlc
!= NULL
);
454 test_variables( p_vlc
);
456 libvlc_release( p_vlc
);