From 153e6343e1dd912018ca5a4383e22d49802decac Mon Sep 17 00:00:00 2001 From: michiel301b Date: Thu, 18 Dec 2025 20:57:39 +0100 Subject: [PATCH] MusicAssetTests --- .idea/inspectionProfiles/Project_Default.xml | 3 + .../resource/resources/MusicAsset.java | 4 + framework/src/main/resources/test.mp3 | Bin 0 -> 18390 bytes .../toop/framework/audio/MusicAssetTest.java | 128 ++++++++++++++++++ .../framework/audio/MusicManagerTest.java | 2 +- 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 framework/src/main/resources/test.mp3 create mode 100644 framework/src/test/java/org/toop/framework/audio/MusicAssetTest.java 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 0000000000000000000000000000000000000000..45c8bf9eed5df340d620dfe3fb347c75f5ca710e GIT binary patch literal 18390 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
    38s;TEQ5xoyYl8yE)*%A6QMSx8(vlc zZ!~jG17lkp5ektEW6LWygkALzh7TQLjoh)8X&h8x1KuIh1Z6W5%02@s=1H07ib`kj z_D$Pn$VvYLB-BM|=k*M@^T0|Ck?CVnkk}kC{*yGi--QQMd_>f!Nlg2)gN~gfmnUZ(ChON?fe2D%sd4Xky<} zo`o$R zps{LgKC_LrBc^Bs#xx-Kd~srjX)#$^|Ey0L4zt^jWXFKP6h$yOegU)&7V9NTObU`w zE=67*9QKaAwvAr{HeVgN9iW`wp^hT#4bhhmD(pRBx%|6kt(eTO)q|9%I_N5#b3G84M_dKu(bfh7{TqUfkz=T?ip^DYn5i@hGex{{VqZ zq**JuWrM{Y=p#0snzvBwJ(s~2@<-dPVK28Ut9S8O_>wudu_?6yv&+3)4eTJFMqx= zN+smYyxruTf?{B|N>IPquO?W>c7YN~q^WJtm&B2r>^ZOOIX3wW=!3$R2r|$tEewTA z$4AVNQ_{B7+AUncq82U?6RZ+&0B)GoW1Ue&stBw~LKrM2P~p~7l?w%tc{zS&F;$`| z)xD2;?-2b2hC)(e*QD|jYvg@h{RY3x7}%YUSacZDEJnXQm?z#|E`Mv9$?9Z>t6CXU z5oXJ4=fn7`T@p{G%m_5Z2Sh4jTipgiZc0kNv^ENK(v|g_3r|SBHKVcCk{h!7p7fZ- z6g~9onG4o6`P&=gCAWEA-1#YW4|1qmv-vYgo6a;%*WSw#N?M9NJIBJtIN2R5Q^f_vZ$QvEKb#Djt*~SU=S+M-)GR-Qvv%I$hA>@3q2u=RG>EqF?kl zwy1D^(WuZzTzLtRL1Q(XMc=sP8gL{o+4<(0=PW-@&RXAXY6FAnDdtlZi!G~j|` z2$w4?T(jN{72mDV!UM#98E%i06BaIA|2_;tL7u%|?>4&~_w=6^)3ZOjcRl+@ILAZs z++jJX!`7usrYm=?l_Fh2EKyuk>Z`83JFmO6$&&LFUKx)gFrzu&dhdba09E`Nn@i+&p@!x7HJl5mC- z38rck@EBSFZa$_Y!}`sTT=v&XhdTI<_8SITtyd5--)B2zvvA}rmrXZ?GeX12KFZ1E>O4s zrFrPf*Ii~$4;4!NVtQ=bI3ZR06+F|f^Kn`zF7nioU~W@u=+FEQr49c)DZZ=Z{h=cH z)YI2f&+q)|LbB{vtVsqxR_|Omm1A&mE&Fx*7hvx_50(r#Utjj##}(^?IB$6p2%P@I z3s=L^sD`+0W#EvmU4~@C=e-Q|8UuubIV#Pjl`ZP}MPvo2*V;_P&MQak&G~FbkTkKs_AqLX>3oQ-PDuvEEB;&ikH>;upITo% z^Xn-)+<2u|^0gBPXjnmu21WOYcq>&aN*OGkX=wHfeXAy%ZXs=XAAWc=0*! z>VU-xY@f84r_OHE(bxCY(FYyGcgXGB6~ML#XMB9G6iKIzlBC$|v8ZZ< z>9ZZ8j!iEfj}Vw;QQv9DYa`~r&JJkXUntQ%K3!6}t7ZNh#>Di-%jZ?u{I=sN^pKf2 z<1puyh3?Ztr|?ycwxe?r`*&rhwcCGZG_$t_;OV1|Cem*516Ros{?86a<*lP`S*YdJ z-FQ(kDA_ewEwdWRJ_S1TN)YYzet3k-9kXI&%DLt*YaF z!DHB^!)X(Xk5jJ7`s}k-+BP2B*3i~M4d|UPQkjI5m>jHca__Dv=TpL$7cZVpA9sEe zuBWAklg3Jwd)$~jBN0}VO{)p?m-&7bT(Z{297QZ@Y{P~34^L7f_5k>JwH`Nv7mc+}#F z{h;$eN&3{TXfs>1VC43JqcZoE>fdO0zqufFKLZ_d>G3P?&-B*a0bWuH+TfH*e3pIA z0i0%bvHDWP*u!eScA`sxO~f;5GWxy1qwd5}%!)*>*vU-#mAr@*uPC zXo#d2EPqJFGB4L5P5hDPBxv(MewZZk`-;?9qj&=T{n-HOiuy z=T>}IJjVDeDyB=GRHcp?>>TBptBWnY#+JVdUtS(hBwlWHJ?N7|`9z3iTH+?r4VIQ(yU{7)bP?t28=s(=CrU z-#__A*@s$GY5!)GTx_-2a7m3a+j9#0Y<*OkqJBuPaqi0Rbw~r=CwAmo4aX)b_tF|h znKWpkc zwobT(>dPqFsHHm|E`Qc8-HbkMTs-D}rcsG#Kg%Qf*;`gSU5+t+Xzf5%-X-wBP134< zRi|nG5`aMy3a+|XCl%61Tzb24exd=nc$=ntXKqcwzKbmnh~Y;It(?#LisLo%0RRRd z)~QqL3;ikg3qamN`_?PiNe`xGT=_r_YAPn;xlq==w2G#UN6(rg9`?lognC23xXxNd z<*|g=3IBjooGP>$Kk>nknQntoDSp3su3WT>eO_nT5OUO7O(iTu)ha{eGST(z{`Ft6 zy)4^RhGY0(-vMyd@>ckekmPOZBl)X-Dd(Gtwg;$;r|Fs)H10giH)ARGR>GXX*YMF* zl&uJux9q`;E?rr$O!e|T5^t^Im%4aT)_3)UM1TQ7QJD%VIAG5oqnM^2c+qCDr#X=& zsO;>AD^LjvFFxa6xuEJ(ACahI&UU+!bukhebK{q~!mh-}RMKAm;3jsBPoL%X!CF=I zC`03I_&w69#Cj)CnFS&~BPYHPU4w7qo2}bhXwzRccwOJwCOK!~^^IVGfm|^6OHRqo z52E~IA^|RWtxfDVkZ$FDCws5$`RZj!Y0InGyJe=yrYY6&On@8sva9tuZ&B@UU0FK0 zEK{Ufw7Tg{PioJ@^>uQ{gQA;epSjEQJt9VBHR*792VsItM59JysF;n2b)%vXHtV#D zjmUvfn>w2VOO48*+twF{h@S#BM%o$7rHhHUcc0IaL|MrU4W!LvmI&l+vo^3X(b6E3 zNKSuy`OOd@vb^ykb>qwl@%vnEMPD{x7AqY0&?Yv44l`CPRN9 zr%i_bfQf&v#3n<3AiGV5{(y;puf)bl;pSfMe;D5;LjOYp|L(7EE<=AHzfFezfQf&v z#3n<3AiGV5{(y;puf!%pe;~U}hW>zwf3L(QLw_Kzwf3L(QLw_K { + 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() {