The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;

use Mac::iTunes;
eval "use Mac::iTunes::AppleScript qw(:boolean :state :size)";

if( $@ )
	{
	plan skip_all => "Skipping tests for Mac::iTunes::Applescript"
	}
else
	{
	plan tests => 44;
	}

my $controller = Mac::iTunes->controller;
isa_ok( $controller, 'Mac::iTunes::AppleScript' );

my %old_values;

my @properties = qw(volume mute sound_volume player_state 
		player_position EQ_enabled fixed_indexing current_visual
		visuals_enabled visual_size full_screen
		current_encoder frontmost);

my $Debug = $ENV{ITUNES_DEBUG} || 0;

foreach my $property ( @properties )
	{
	my $value = $controller->$property;
	$hash{$property} = $value;
	diag( "$property is $value" ) if $Debug;
	}

ok( $controller->activate,         'Activate iTunes'    );

SKIP: {
skip "iTunes doesn't handle frontmost correctly (yet)", 4, "set frontmost to 0";
ok( $controller->frontmost(TRUE),  'Send to background' );
is( $controller->frontmost, TRUE,  'Player is in background' );
ok( $controller->frontmost(0),     'Send to background' );
is( $controller->frontmost, FALSE, 'Player is in background' );
};

my $volume = 65;
is( $controller->volume($volume), $volume,  'Set volume'   );
is( $controller->volume,          $volume,  'Fetch volume' );
is( $controller->volume(150),         100,  'Set volume past maximum' );
is( $controller->volume(-5),            0,  'Fetch volume below minimum' );
is( $controller->volume(50),           50,  'Fetch volume to middle of range' );

ok(  $controller->mute(TRUE),  'Set mute on'   );
ok(  $controller->mute,        'Fetch mute while on' );
ok( !$controller->mute(FALSE), 'Set mute off' );
ok( !$controller->mute,        'Fetch mute while off' );

SKIP: {
skip "iTunes seems to have problems reporting state", 8;
ok( $controller->stop,           'Stop controller'   );
is( $controller->state, STOPPED, 'Player is stopped' );
ok( $controller->play,           'Play controller'   );
is( $controller->state, PLAYING, 'Player is playing' );
ok( $controller->pause,          'Pause controller'  );
is( $controller->state, PAUSED,  'Player is paused' );
ok( $controller->playpause,      'Toggle playpause to play'  );
is( $controller->state, PLAYING, 'Player is playing' );
};

sleep 3;
ok( $controller->playpause,      'Toggle playpause to pause'  );
is( $controller->state, PAUSED,  'Player is paused' );

# the application needs to be visible for these tests
is( $controller->browser_window_visible(TRUE), TRUE, 'Make browser visible' );

ok(  $controller->visuals_enabled(FALSE),   'Set visuals to false' );
ok( !$controller->visuals_enabled,	    'Set visuals to false' );
ok(  $controller->full_screen(FALSE),	    'Set full-screen to false' );
ok( !$controller->full_screen,		    'Full screen is false' );
ok(  $controller->visuals_enabled(TRUE),    'Set visuals to true' );
ok(  $controller->visuals_enabled,	    'Visuals to true' );
ok(  $controller->full_screen(TRUE),	    'Set full-screen to true' );
is(  $controller->full_screen, TRUE,	    'Full screen is true' );
ok(  $controller->full_screen(FALSE),	    'Set full-screen to false' );
ok( !$controller->full_screen,		    'Full screen is false' );

foreach my $size ( SMALL, MEDIUM, LARGE )
	{
	ok( $controller->visual_size($size), "Set visual size to $size" );
	is( $controller->visual_size, $size, "Visual size is $size" );
	}
	
ok(  $controller->visuals_enabled(FALSE), 'Set visuals to false' );
ok( !$controller->visuals_enabled,	  'Set visuals to false' );