The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl -w
use strict;
use warnings;
use SDL;
use SDL::Config;

my $audiodriver;

BEGIN {
	use Config;
	if ( !$Config{'useithreads'} ) {
		print("1..0 # Skip: Perl not compiled with 'useithreads'\n");
		exit(0);
	}
	require threads;
	require threads::shared;

	use Test::More;
	use lib 't/lib';
	use SDL::TestTool;

	$audiodriver = $ENV{SDL_AUDIODRIVER};
	$ENV{SDL_AUDIODRIVER} = 'dummy' unless $ENV{SDL_RELEASE_TESTING};

	if ( !SDL::TestTool->init(SDL_INIT_AUDIO) ) {
		plan( skip_all => 'Failed to init sound' );
	} elsif ( !SDL::Config->has('SDL_mixer') ) {
		plan( skip_all => 'SDL_mixer support not compiled' );
	}
}

use_ok( 'SDLx::Music', "Can load SDLx::Music" );

# Object Creation

can_ok( 'SDLx::Music', 'new' );

my $music = SDLx::Music->new();

#my $music2 = SDLx::Music->new();

isa_ok( $music, "SDLx::Music" );

#isa_ok( $music2, "SDLx::Music" );

# Music Data defination

can_ok( 'SDLx::Music', 'data' );

## Simple
ok( $music->data( silence => 'test/data/silence.wav' ) );

## Long
ok( $music->data(
		sample => {
			file    => 'test/data/sample.wav',
			loops   => 2,
			fade_in => 0.5,
			volume  => 72
		},
	)
);


## Check if stuff actually got loaded
my $silence = $music->data('silence');

isa_ok( $silence,               "SDLx::Music::Data" );
isa_ok( $music->data('sample'), "SDLx::Music::Data" );

is_deeply( $silence,               $music->{data}->{silence}, "Silence is retreived correctly" );
is_deeply( $music->data('sample'), $music->{data}->{sample},  "Sample is retreived correctly" );

# Chained changes

can_ok( 'SDLx::Music', 'playing' );

$silence->volume(55)->loops(2)->file('test/data/silence.wav');

$music->play($silence);

my $played;
while ( $music->playing ) {
	$played = 1 unless $played;
}

is( $played, 1, "Music played and atleast one" );

isa_ok( $music->{data}->{silence}->{_content}, "SDL::Mixer::MixMusic", "Didn't load data for play" );

can_ok( 'SDLx::Music', 'load' );

$music->load;

isa_ok( $music->{data}->{sample}->{_content}, "SDL::Mixer::MixMusic" );

$music->play( $music->data('sample') );

$played = 0;
while ( $music->playing ) {
	$played = 1 unless $played;
}

is( $played, 1, "Music played and atleast one" );

is( $silence->{volume}, 55 );


# Clear the data

can_ok( 'SDLx::Music', 'clear' );

ok( $music->clear );

## Check if we are actually clear

is( $music->{data}, undef, "Is clear" );

# Check default call

can_ok( 'SDLx::Music', 'default' );

isa_ok( $music->default, "SDLx::Music::Default" );

$music->default->ext('.wav');

isa_ok( SDLx::Music->default, "SDLx::Music::Default" );

SDLx::Music->default->ext('.ogg');

is( $music->default->ext,      '.wav' );
is( SDLx::Music->default->ext, '.ogg' );

if ($audiodriver) {
	$ENV{SDL_AUDIODRIVER} = $audiodriver;
} else {
	delete $ENV{SDL_AUDIODRIVER};
}

done_testing();