/***************************************************************************** * epg.c test EPG ***************************************************************************** * Copyright (C) 2016 - VideoLAN Authors * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . *****************************************************************************/ #include "../../libvlc/test.h" #ifdef NDEBUG #undef NDEBUG #endif #include #include #include static void assert_current( const vlc_epg_t *p_epg, const char *psz_name ) { if( (void*)psz_name == (void*)p_epg->p_current ) { assert( psz_name == NULL ); } else { assert( p_epg->p_current ); assert( p_epg->p_current->psz_name ); assert( psz_name[0] == p_epg->p_current->psz_name[0] ); } } static void print_order( const vlc_epg_t *p_epg ) { printf("order: "); for( size_t i = 0; i < p_epg->i_event; i++ ) printf("%s ", p_epg->pp_event[i]->psz_name ); if( p_epg->p_current ) printf(" current %s", p_epg->p_current->psz_name ); printf("\n"); } static void assert_events( const vlc_epg_t *p_epg, const char *psz_names, size_t i_names ) { assert( p_epg->i_event == i_names ); for( size_t i = 0; i < p_epg->i_event; i++ ) { assert( p_epg->pp_event[i]->psz_name && p_epg->pp_event[i]->psz_name[0] == psz_names[i] ); } } #define EPG_ADD(epg, start, duration, a) \ do {\ vlc_epg_event_t *p_evt = vlc_epg_event_New( start, start, duration );\ if( p_evt )\ {\ p_evt->psz_name = strdup( a );\ if( !p_evt->psz_name || !vlc_epg_AddEvent( epg, p_evt ) )\ vlc_epg_event_Delete( p_evt );\ }\ } while( 0 ) int main( void ) { test_init(); int i=1; /* Simple insert/current test */ printf("--test %d\n", i++); vlc_epg_t *p_epg = vlc_epg_New( 0, 0 ); assert(p_epg); EPG_ADD( p_epg, 42, 20, "A" ); EPG_ADD( p_epg, 62, 20, "B" ); EPG_ADD( p_epg, 82, 20, "C" ); EPG_ADD( p_epg, 102, 20, "D" ); print_order( p_epg ); assert_events( p_epg, "ABCD", 4 ); assert_current( p_epg, NULL ); vlc_epg_SetCurrent( p_epg, 82 ); assert_current( p_epg, "C" ); vlc_epg_Delete( p_epg ); /* Test reordering / head/tail inserts */ printf("--test %d\n", i++); p_epg = vlc_epg_New( 0, 0 ); assert(p_epg); EPG_ADD( p_epg, 82, 20, "C" ); EPG_ADD( p_epg, 62, 20, "B" ); EPG_ADD( p_epg, 102, 20, "D" ); EPG_ADD( p_epg, 42, 20, "A" ); print_order( p_epg ); assert_events( p_epg, "ABCD", 4 ); vlc_epg_Delete( p_epg ); /* Test reordering/bisect lookup on insert */ printf("--test %d\n", i++); p_epg = vlc_epg_New( 0, 0 ); assert(p_epg); EPG_ADD( p_epg, 142, 20, "F" ); EPG_ADD( p_epg, 122, 20, "E" ); EPG_ADD( p_epg, 102, 20, "D" ); EPG_ADD( p_epg, 82, 20, "C" ); EPG_ADD( p_epg, 42, 20, "A" ); EPG_ADD( p_epg, 62, 20, "B" ); print_order( p_epg ); assert_events( p_epg, "ABCDEF", 6 ); vlc_epg_Delete( p_epg ); /* Test deduplication and current pointer rebasing on insert */ printf("--test %d\n", i++); p_epg = vlc_epg_New( 0, 0 ); assert(p_epg); EPG_ADD( p_epg, 62, 20, "E" ); EPG_ADD( p_epg, 62, 20, "F" ); EPG_ADD( p_epg, 42, 20, "A" ); vlc_epg_SetCurrent( p_epg, 62 ); EPG_ADD( p_epg, 82, 20, "C" ); EPG_ADD( p_epg, 62, 20, "B" ); EPG_ADD( p_epg, 102, 20, "D" ); print_order( p_epg ); assert_events( p_epg, "ABCD", 4 ); assert_current( p_epg, "B" ); vlc_epg_Delete( p_epg ); return 0; }