#!/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; }