The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use Test::More ;

use Linux::DVB::DVBT ;
use Linux::DVB::DVBT::Config ;

##$Linux::DVB::DVBT::Config::DEBUG = 15 ;

#[4107-4171]
#video = 600
#lcn = 1
#tsid = 4107
#name = BBC ONE
#ca = 0
#net = BBC
#audio = 601
#teletext = 0
#subtitle = 605
#type = 1
#pmt = 4171
#audio_details = eng:601 eng:602 fra:9999 deu:9900
#subtitle_details = eng:705 eng:706 fra:707 deu:708

my %demux = (
	'600'	=> {
        audio => 601,
        audio_details => 'eng:601 eng:602 fra:9999 deu:9900',
        ca => 0,
        lcn => 1,
        name => 'BBC ONE',
        net => 'BBC',
        pmt => 4171,
        pnr => 4171,
        subtitle => 605,
        subtitle_details => 'eng:605 eng:706 fra:707 deu:708',
        teletext => 0,
        tsid => 4107,
        type => 1,
        video => 600,
	},

) ;
my @tests = (
	{
		'out'	=> "avs",
		'lang'	=> "",
		'sub_lang'	=> "",
		'audio_pids'	=> 
			[ 601,  ],
		'out_pids'	=> 
			[
				{
					'pid' => 601,
					'pidtype' => 'audio',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 600,
					'pidtype' => 'video',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 605,
					'pidtype' => 'subtitle',
					'demux_params' => $demux{600},
				},
			],
	},
	{
		'out'	=> "av",
		'lang'	=> "+eng",
		'sub_lang'	=> "",
		'audio_pids'	=> 
			[ 601, 602,  ],
		'out_pids'	=> 
			[
				{
					'pid' => 601,
					'pidtype' => 'audio',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 602,
					'pidtype' => 'audio',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 600,
					'pidtype' => 'video',
					'demux_params' => $demux{600},
				},
			],
	},
	{
		'out'	=> "a",
		'lang'	=> "eng",
		'sub_lang'	=> "",
		'audio_pids'	=> 
			[ 602,  ],
		'out_pids'	=> 
			[
				{
					'pid' => 602,
					'pidtype' => 'audio',
					'demux_params' => $demux{600},
				},
			],
	},
	{
		'out'	=> "",
		'lang'	=> "fra",
		'sub_lang'	=> "",
		'audio_pids'	=> 
			[ 9999,  ],
		'out_pids'	=> 
			[
				{
					'pid' => 9999,
					'pidtype' => 'audio',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 600,
					'pidtype' => 'video',
					'demux_params' => $demux{600},
				},
			],
	},
	{
		'out'	=> "a",
		'lang'	=> "eng eng",
		'sub_lang'	=> "",
		'error'	=> 1,
		'audio_pids'	=> 
			[ 602,  ],
		'out_pids'	=> 
			[
			],
	},
	{
		'out'	=> "",
		'lang'	=> "ita",
		'sub_lang'	=> "",
		'error'	=> 1,
		'audio_pids'	=> 
			[  ],
		'out_pids'	=> 
			[
			],
	},
	{
		'out'	=> "",
		'lang'	=> "fra eng",
		'sub_lang'	=> "",
		'error'	=> 1,
		'audio_pids'	=> 
			[ 9999,  ],
		'out_pids'	=> 
			[
			],
	},
	{
		'out'	=> "",
		'lang'	=> "fra eng deu",
		'sub_lang'	=> "",
		'error'	=> 1,
		'audio_pids'	=> 
			[ 9999, ],
		'out_pids'	=> 
			[
			],
	},

	{
		'out'	=> "avs",
		'lang'	=> "",
		'sub_lang'	=> "fra deu",
		'audio_pids'	=> 
			[ 601,  ],
		'out_pids'	=> 
			[
				{
					'pid' => 601,
					'pidtype' => 'audio',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 600,
					'pidtype' => 'video',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 707,
					'pidtype' => 'subtitle',
					'demux_params' => $demux{600},
				},
				{
					'pid' => 708,
					'pidtype' => 'subtitle',
					'demux_params' => $demux{600},
				},
			],
	},
);

plan tests => scalar(@tests) * 2 * 2 ;

	## Create object
	my $dvb = Linux::DVB::DVBT->new(
		'dvb' => 1,		# special case to allow for testing
		
		'adapter_num'	=> 1,
		'frontend_num'	=> 0,
		
		'frontend_name'	=> '/dev/dvb/adapter1/frontend0',
		'demux_name'	=> '/dev/dvb/adapter1/demux0',
		'dvr_name'	=> '/dev/dvb/adapter1/dvr0',
		
	) ;
	
	$dvb->config_path('./t/config-ox') ;
	my $tuning_href = $dvb->get_tuning_info() ;
	
	my $out  ;
	my $lang ;
	my $channel_name = "bbc1" ;

	# find channel
	my ($frontend_params_href, $demux_params_href) = Linux::DVB::DVBT::Config::find_channel($channel_name, $tuning_href) ;
	if (! $frontend_params_href)
	{
		die "unable to find $channel_name" ;
	}

	foreach my $href (@tests)
	{
		test_audio($demux_params_href, $href->{'lang'}, $href->{'audio_pids'}, $href->{'error'}||0) ;
		test_out($demux_params_href, $href->{'out'}, $href->{'lang'}, $href->{'sub_lang'}||"", $href->{'out_pids'}, $href->{'error'}||0) ;
	}
	exit 0 ;

#------------------------------------------------------------------------------------------------
sub test_audio
{
	my ($demux_params_href, $lang, $expected_aref, $expect_error) = @_ ;

	my @pids ;
	my $error ; 

	$error = Linux::DVB::DVBT::Config::audio_pids($demux_params_href, $lang, \@pids) ;
	is_deeply(\@pids, $expected_aref, "Audio pids lang=\"$lang\" ") ;
	is( $error?1:0, $expect_error, "Audio error lang=\"$lang\" ") ;

}
	
#------------------------------------------------------------------------------------------------
sub test_out
{
	my ($demux_params_href, $out, $lang, $sub_lang, $expected_aref, $expect_error) = @_ ;

	my @pids ;
	my $error ; 
	
	$error = Linux::DVB::DVBT::Config::out_pids($demux_params_href, $out, $lang, $sub_lang, \@pids) ;
	is_deeply(\@pids, $expected_aref, "Output spec pids lang=\"$lang\" out=\"$out\"") ;
	is( $error?1:0, $expect_error, "Output spec error lang=\"$lang\" out=\"$out\" ") ;
}
	
__END__
lang="" pids=
[ # ARRAY(0x849d394)
  601  # [0x259]
],
lang="" out="avs" pids=
[ # ARRAY(0x846e5fc)
  { # HASH(0x84f4e8c)
    demux_params => 
      { # HASH(0x84f4aec)
        audio => 601,
        audio_details => eng:601 eng:602 fra:9999 deu:9900,
        ca => 0,
        lcn => 1,
        name => BBC ONE,
        net => BBC,
        pmt => 4171,
        pnr => 4171,
        subtitle => 605,
        teletext => 0,
        tsid => 4107,
        type => 1,
        video => 600,
      },
    pid => 601,
    pidtype => audio,
  },
  { # HASH(0x84f4adc)
    demux_params => 
    # HASH(0x84f4aec) (Seen earlier)
    pid => 600,
    pidtype => video,
  },
  { # HASH(0x85502e4)
    demux_params => 
    # HASH(0x84f4aec) (Seen earlier)
    pid => 605,
    pidtype => subtitle,
  },
],
lang="+eng" pids=
[ # ARRAY(0x849d394)
  601  # [0x259]
  602  # [0x25a]
],
lang="+eng" out="av" pids=
[ # ARRAY(0x846e5fc)
  { # HASH(0x8555a54)
    demux_params => 
      { # HASH(0x84f4aec)
        audio => 601,
        audio_details => eng:601 eng:602 fra:9999 deu:9900,
        ca => 0,
        lcn => 1,
        name => BBC ONE,
        net => BBC,
        pmt => 4171,
        pnr => 4171,
        subtitle => 605,
        teletext => 0,
        tsid => 4107,
        type => 1,
        video => 600,
      },
    pid => 601,
    pidtype => audio,
  },
  { # HASH(0x85502e4)
    demux_params => 
    # HASH(0x84f4aec) (Seen earlier)
    pid => 602,
    pidtype => audio,
  },
  { # HASH(0x84f4adc)
    demux_params => 
    # HASH(0x84f4aec) (Seen earlier)
    pid => 600,
    pidtype => video,
  },
],
lang="eng" pids=
[ # ARRAY(0x849d394)
  602  # [0x25a]
],
lang="eng" out="a" pids=
[ # ARRAY(0x846e5fc)
  { # HASH(0x8550a44)
    demux_params => 
      { # HASH(0x84f4aec)
        audio => 601,
        audio_details => eng:601 eng:602 fra:9999 deu:9900,
        ca => 0,
        lcn => 1,
        name => BBC ONE,
        net => BBC,
        pmt => 4171,
        pnr => 4171,
        subtitle => 605,
        teletext => 0,
        tsid => 4107,
        type => 1,
        video => 600,
      },
    pid => 602,
    pidtype => audio,
  },
],
lang="fra" pids=
[ # ARRAY(0x849d394)
  9999  # [0x270f]
],
lang="fra" out="" pids=
[ # ARRAY(0x846e5fc)
  { # HASH(0x855af74)
    demux_params => 
      { # HASH(0x84f4aec)
        audio => 601,
        audio_details => eng:601 eng:602 fra:9999 deu:9900,
        ca => 0,
        lcn => 1,
        name => BBC ONE,
        net => BBC,
        pmt => 4171,
        pnr => 4171,
        subtitle => 605,
        teletext => 0,
        tsid => 4107,
        type => 1,
        video => 600,
      },
    pid => 9999,
    pidtype => audio,
  },
  { # HASH(0x855aac4)
    demux_params => 
    # HASH(0x84f4aec) (Seen earlier)
    pid => 600,
    pidtype => video,
  },
],
lang="eng eng" pids=
[ # ARRAY(0x849d394)
  602  # [0x25a]
],
lang="eng eng" out="a" pids=
[ # ARRAY(0x846e5fc)
],
lang="ita" pids=
[ # ARRAY(0x849d394)
],
lang="ita" out="" pids=
[ # ARRAY(0x846e5fc)
],
lang="fra eng" pids=
[ # ARRAY(0x849d394)
  9999  # [0x270f]
],
lang="fra eng" out="" pids=
[ # ARRAY(0x846e5fc)
],
lang="fra eng deu" pids=
[ # ARRAY(0x849d394)
  9999  # [0x270f]
],
lang="fra eng deu" out="" pids=
[ # ARRAY(0x846e5fc)
],
Test Audio: lang=""
Test Out: lang="" out="avs"
Test Audio: lang="+eng"
Test Out: lang="+eng" out="av"
Test Audio: lang="eng"
Test Out: lang="eng" out="a"
Test Audio: lang="fra"
Test Out: lang="fra" out=""
Test Audio: lang="eng eng"
Error: Error: could not find the languages: eng associated with program "4171"
Test Out: lang="eng eng" out="a"
Error: Error: could not find the languages: eng associated with program "4171"
Test Audio: lang="ita"
Error: Error: could not find the languages: ita associated with program "4171"
Test Out: lang="ita" out=""
Error: Error: could not find the languages: ita associated with program "4171"
Test Audio: lang="fra eng"
Error: Error: could not find the languages: eng associated with program "4171"
Test Out: lang="fra eng" out=""
Error: Error: could not find the languages: eng associated with program "4171"
Test Audio: lang="fra eng deu"
Error: Error: could not find the languages: eng, deu associated with program "4171"
Test Out: lang="fra eng deu" out=""
Error: Error: could not find the languages: eng, deu associated with program "4171"