diff --git a/test/Makefile.am b/test/Makefile.am index 43605733ba041c37e10e405c95417c7f68094658..d431c5ded652912491a0db5145718a763337bf12 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -24,6 +24,7 @@ check_PROGRAMS = \ test_src_input_stream \ test_src_interface_dialog \ test_src_misc_bits \ + test_src_misc_epg \ test_modules_packetizer_hxxx \ test_modules_keystore \ test_modules_tls \ @@ -93,6 +94,8 @@ test_src_input_stream_net_CFLAGS = $(AM_CFLAGS) -DTEST_NET test_src_input_stream_net_LDADD = $(LIBVLCCORE) $(LIBVLC) test_src_misc_bits_SOURCES = src/misc/bits.c test_src_misc_bits_LDADD = $(LIBVLC) +test_src_misc_epg_SOURCES = src/misc/epg.c +test_src_misc_epg_LDADD = $(LIBVLC) test_src_interface_dialog_SOURCES = src/interface/dialog.c test_src_interface_dialog_LDADD = $(LIBVLCCORE) $(LIBVLC) test_modules_packetizer_hxxx_SOURCES = modules/packetizer/hxxx.c diff --git a/test/src/misc/epg.c b/test/src/misc/epg.c new file mode 100644 index 0000000000000000000000000000000000000000..8f5a571f2db7f5c15b7b0f1bb154f5622b809832 --- /dev/null +++ b/test/src/misc/epg.c @@ -0,0 +1,189 @@ +/***************************************************************************** + * 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( int i=0; ii_event; i++ ) + printf("%s ", p_epg->pp_event[i]->psz_name ); + printf("\n"); +} + +static void assert_events( const vlc_epg_t *p_epg, const char *psz_names, int i_names ) +{ + assert( p_epg->i_event == i_names ); + for( int i=0; ii_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) \ + vlc_epg_AddEvent( epg, start, duration, a, NULL, NULL, 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( NULL ); + 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( NULL ); + 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( NULL ); + 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( NULL ); + 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 ); + + + /* Test epg merging */ + printf("--test %d\n", i++); + p_epg = vlc_epg_New( NULL ); + assert(p_epg); + EPG_ADD( p_epg, 142, 20, "F" ); + EPG_ADD( p_epg, 122, 20, "E" ); + EPG_ADD( p_epg, 42, 20, "A" ); + EPG_ADD( p_epg, 62, 20, "B" ); + print_order( p_epg ); + + vlc_epg_t *p_epg2 = vlc_epg_New( NULL ); + assert(p_epg2); + EPG_ADD( p_epg2, 102, 20, "D" ); + EPG_ADD( p_epg2, 82, 20, "C" ); + print_order( p_epg2 ); + + vlc_epg_Merge( p_epg, p_epg2 ); + printf("merged " ); + print_order( p_epg ); + + assert_events( p_epg, "ABCDEF", 6 ); + assert_events( p_epg2, "CD", 2 ); /* should be untouched */ + vlc_epg_Delete( p_epg ); + vlc_epg_Delete( p_epg2 ); + + + /* Test event overlapping */ + printf("--test %d\n", i++); + p_epg = vlc_epg_New( NULL ); + 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 ); + vlc_epg_SetCurrent( p_epg, 62 ); + + p_epg2 = vlc_epg_New( NULL ); + assert(p_epg2); + EPG_ADD( p_epg2, 41, 30, "E" ); + print_order( p_epg2 ); + + vlc_epg_Merge( p_epg, p_epg2 ); + printf("merged " ); + print_order( p_epg ); + assert_events( p_epg, "ECD", 3 ); + + assert_current( p_epg, NULL ); + + EPG_ADD( p_epg2, 70, 42, "F" ); + print_order( p_epg2 ); + vlc_epg_Merge( p_epg, p_epg2 ); + printf("merged " ); + print_order( p_epg ); + assert_events( p_epg, "F", 1 ); + + vlc_epg_Delete( p_epg ); + vlc_epg_Delete( p_epg2 ); + + return 0; +}