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

#	test suite

use Test::Simple tests => 8;

#	test for presence of player

#my $count = 0;
#for (split /:/, $ENV{PATH}) {
#	$count++ if -x $_ . '/xmms';
#	}

#ok($count, "finding player");
ok(1, "finding player");

#	Find the test song!

my $f = './test.mp3';
$f = '../' . $f unless -f $f;
$f = '../' . $f unless -f $f;

ok(-f $f, "finding test track");
ok(-r $f, "read permissions");

use POE;
use POE::Component::Player::Xmms;
ok(1, 'use PoCo::Player::Xmms');


@events = qw/_start alive status info done died error stopped paused resumed ended quit/;
$s = POE::Session->create(
	package_states => ["main" => \@events],
#	inline_states => {_start => sub { $_[KERNEL]->alias_set("main"); }}
	);

ok(defined($s), "session created");

$poe_kernel->run();

ok(1, "done");

# --- event handlers ----------------------------------------------------------

$level = 0;

sub _start {
	my ($kernel, $heap) = @_[KERNEL, HEAP];
	
	$kernel->alias_set("main");
	
	my $p = POE::Component::Player::Xmms->spawn({ debug => $ENV{DEBUG} });

	ok(defined $p && $p->isa('POE::Component::Player::Xmms')
		, "component instantiated"
	);

	$kernel->post(xmms => 'playlist_clear');
	$kernel->post(xmms => 'playlist' => ['test.mp3']);

	$kernel->post(xmms => 'play');
	$kernel->post(xmms => 'eq_win_toggle' => 1);

	$kernel->delay_set('quit' => 6);

	ok(1,"play issued");
}

sub quit {
	$_[KERNEL]->post(xmms => 'quit');
}

sub alive {
	return if $level;
	ok(1, "alive notification");
}

$status = 0;
sub status {
	my ($fp, $fl, $sp, $sl) = @_[ARG0 .. $#_];

	if ($level == 0) {
		return if $status;
		ok(1, "status received");
		$p->pause();
		$status = 1;
		}

	if ($level == 1) {
		my $p = int(100 * $fp / ($fp + $fl));
		my $t = sprintf("%02d:%02d", ($sp / 60) % 60, $sp % 60);
		print " $p% [$fp] $t\r";
		}
	}

sub info {
	my $o = $_[ARG0];
	return if $level;

	my $ok = 0;
	if ($o->{type} eq 'filename') {
		ok($o->{filename} eq $f, "info: filename");
		}
	elsif ($o->{type} eq 'id3') {
        my @k = qw/album artist comment genre track type year/;
        my @v = ('Test Album', 'Test Artist', 'Test Comment'
			, 'Porn Groove', 'Test Title', 'id3', '4321'
			);

		for my $i (0 .. $#k) {
			$ok++ if $o->{$k[$i]} eq $v[$i];
			}
			
		ok($ok == @k, "info: id3");
		}
	elsif ($o->{type} eq 'stream') {
		my @k = qw/bitrate framesz channels copyrighted crc emphasis
			extension layer mode mode_extension samplerate mpegtype
			/;
		my @v = (128, 417, 2, 1, 1, 0, 0, 3, 'Joint-Stereo', 2, 44100, '1.0');

		for my $i (0 .. $#k) {
			$ok++ if $o->{$k[$i]} eq $v[$i];
			}

		ok($ok == @k, "info: stream");
		}
	}

sub paused {
	ok(1, "player paused");
	$p->resume();
	}

sub resumed {
	ok(1, "player resumed");
	$p->stop();
	}

sub stopped {
	ok(1, "player stopped");
	$p->xcmd("XCMD");
	}

sub ended {
	ok(1, "track ended");
	$p->quit();
	}

sub done {
	my ($kernel) = @_[KERNEL];
	ok(1, "player quit");
	$kernel->alias_remove("main");
	}

sub died {
	ok(1, "died tested");
	$p->start();	# restart
	$level = 1;
	$status = 0;
	ok(1, "wait for end");
	$p->play($f);
	}

sub error {
	my $args = $_[ARG1];
	my $msg = "error handler";
	$msg .= qq/ [$args->{err}]: "$args->{error}"/ if $args->{err} != -1;
	ok($args->{err} == -1, $msg);
	$args->{err} == -1 ? $p->kill() : exit;
	}