diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 655cfae..454e4ff 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -4,6 +4,9 @@ + + + \ No newline at end of file diff --git a/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java index 530ca2f..45a67c4 100644 --- a/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java @@ -82,6 +82,10 @@ public class MusicAsset extends BaseResource implements LoadableResource, AudioR getMediaPlayer().pause(); } + public double getVolume() { + return volume; + } + @Override public void stop() { getMediaPlayer().stop(); diff --git a/framework/src/main/resources/test.mp3 b/framework/src/main/resources/test.mp3 new file mode 100644 index 0000000..45c8bf9 Binary files /dev/null and b/framework/src/main/resources/test.mp3 differ diff --git a/framework/src/test/java/org/toop/framework/audio/MusicAssetTest.java b/framework/src/test/java/org/toop/framework/audio/MusicAssetTest.java new file mode 100644 index 0000000..481230b --- /dev/null +++ b/framework/src/test/java/org/toop/framework/audio/MusicAssetTest.java @@ -0,0 +1,128 @@ +package org.toop.framework.audio; + +import javafx.application.Platform; +import javafx.scene.media.MediaPlayer; +import javafx.util.Duration; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.toop.framework.resource.resources.MusicAsset; + +import java.io.File; +import java.net.URL; +import java.util.concurrent.CountDownLatch; + +import static org.junit.jupiter.api.Assertions.*; + + +public class MusicAssetTest { + + private static boolean started = false; + private MusicAsset musicAsset; + + @BeforeAll + static void initJavaFX() throws Exception { + if (started) { + return; + } + CountDownLatch countDownLatch = new CountDownLatch(1); + Platform.startup(countDownLatch::countDown); + countDownLatch.await(); + started = true; + } + + private static void run(Runnable action) { + CountDownLatch countDownLatch = new CountDownLatch(1); + Platform.runLater(() -> { + try { + action.run(); + } finally { + countDownLatch.countDown(); + } + }); + try { + countDownLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private MusicAsset createMusicAsset() { + URL asset = getClass().getClassLoader().getResource("test.mp3"); + assertNotNull(asset, "Test MP3 not found"); + File testFile = new File(asset.getFile()); + assertTrue(testFile.exists(), "File doesn't exist"); + return new MusicAsset(testFile); + } + + private void wait(MediaPlayer player, MediaPlayer.Status status, long timeout) throws InterruptedException { + long start = System.currentTimeMillis(); + while (player.getStatus() != status && System.currentTimeMillis() - start < timeout) { + Thread.sleep(10); + } + } + + @Test + void loadMusicAssetAsLoaded() { + MusicAsset musicAsset = createMusicAsset(); + run(musicAsset::load); + assertTrue(musicAsset.isLoaded()); + assertNotNull(musicAsset.getMediaPlayer()); + } + + @Test + void loadMusicAssetAsNotLoaded() { + MusicAsset musicAsset = createMusicAsset(); + run(musicAsset::load); + assertTrue(musicAsset.isLoaded()); + run(musicAsset::unload); + assertFalse(musicAsset.isLoaded()); + assertNotNull(musicAsset.getMediaPlayer()); + } + + @Test + void updateVolume() { + MusicAsset musicAsset = createMusicAsset(); + musicAsset.updateVolume(0.5); + assertEquals(0.5, musicAsset.getVolume(), 0.0000001); + } + + @Test + void playPauseStop() throws InterruptedException { + MusicAsset musicAsset = createMusicAsset(); + run(musicAsset::load); + + run(musicAsset::play); + wait(musicAsset.getMediaPlayer(), MediaPlayer.Status.PLAYING, 500); + assertEquals(MediaPlayer.Status.PLAYING, musicAsset.getMediaPlayer().getStatus()); + + run(musicAsset::pause); + wait(musicAsset.getMediaPlayer(), MediaPlayer.Status.PAUSED, 500); + assertEquals(MediaPlayer.Status.PAUSED, musicAsset.getMediaPlayer().getStatus()); + + run(musicAsset::stop); + wait(musicAsset.getMediaPlayer(), MediaPlayer.Status.STOPPED, 500); + assertEquals(MediaPlayer.Status.STOPPED, musicAsset.getMediaPlayer().getStatus()); + } + + @Test + void duration() throws InterruptedException { + MusicAsset musicAsset = createMusicAsset(); + run(musicAsset::load); + wait(musicAsset.getMediaPlayer(), MediaPlayer.Status.READY, 500); + Duration duration = musicAsset.getMediaPlayer().getTotalDuration(); + assertTrue(duration.toMillis() > 200); // file is shorter than 1 second, so gotta put it to milliseconds + } + + @Test + void currentPosition() throws InterruptedException { + MusicAsset musicAsset = createMusicAsset(); + run(musicAsset::load); + + run(musicAsset::play); + wait(musicAsset.getMediaPlayer(), MediaPlayer.Status.PLAYING, 500); + Thread.sleep(200); + Duration currentPos = musicAsset.getMediaPlayer().getCurrentTime(); + assertTrue(currentPos.toMillis() > 0); // file is shorter than 1 second, so gotta put it to milliseconds + } +} + diff --git a/framework/src/test/java/org/toop/framework/audio/MusicManagerTest.java b/framework/src/test/java/org/toop/framework/audio/MusicManagerTest.java index d009d7e..17cc44f 100644 --- a/framework/src/test/java/org/toop/framework/audio/MusicManagerTest.java +++ b/framework/src/test/java/org/toop/framework/audio/MusicManagerTest.java @@ -51,7 +51,7 @@ class MockAudioResource extends BaseResource implements AudioResource { stopped = true; } - public void pause() { paused = false; } + public void pause() { paused = true; } @Override public long duration() {