@@ -26,6 +26,7 @@ class SoundBlocksTest : public testing::Test
2626 m_extension = std::make_unique<SoundBlocks>();
2727 m_engine = m_project.engine ().get ();
2828 m_extension->registerBlocks (m_engine);
29+ m_extension->onInit (m_engine);
2930
3031 SoundPrivate::audioOutput = &m_outputMock;
3132 }
@@ -428,6 +429,90 @@ TEST_F(SoundBlocksTest, PlayUntilDone_SoundName)
428429 ASSERT_TRUE (thread.isFinished ());
429430}
430431
432+ TEST_F (SoundBlocksTest, PlayUntilDone_KillWaitingThread)
433+ {
434+ auto sprite = std::make_shared<Sprite>();
435+ auto player1 = std::make_shared<AudioPlayerMock>();
436+ auto player2 = std::make_shared<AudioPlayerMock>();
437+ auto player3 = std::make_shared<AudioPlayerMock>();
438+
439+ EXPECT_CALL (m_outputMock, createAudioPlayer ()).WillOnce (Return (player1));
440+ sprite->addSound (std::make_shared<Sound>(" pop" , " a" , " wav" ));
441+
442+ EXPECT_CALL (m_outputMock, createAudioPlayer ()).WillOnce (Return (player2));
443+ auto sound2 = std::make_shared<Sound>(" meow" , " b" , " wav" );
444+ sprite->addSound (sound2);
445+
446+ EXPECT_CALL (m_outputMock, createAudioPlayer ()).WillOnce (Return (player3));
447+ sprite->addSound (std::make_shared<Sound>(" test" , " c" , " mp3" ));
448+
449+ ScriptBuilder builder (m_extension.get (), m_engine, sprite);
450+ builder.addBlock (" sound_playuntildone" );
451+ builder.addDropdownInput (" SOUND_MENU" , " meow" );
452+ auto block = builder.currentBlock ();
453+
454+ Compiler compiler (&m_engineMock, sprite.get ());
455+ auto code = compiler.compile (block);
456+ Script script (sprite.get (), block, &m_engineMock);
457+ script.setCode (code);
458+ Thread thread (sprite.get (), &m_engineMock, &script);
459+
460+ EXPECT_CALL (*player1, start).Times (0 );
461+ EXPECT_CALL (*player2, start ());
462+ EXPECT_CALL (*player3, start).Times (0 );
463+ EXPECT_CALL (*player2, isPlaying ()).WillRepeatedly (Return (true ));
464+ thread.run ();
465+ ASSERT_FALSE (thread.isFinished ());
466+ ASSERT_EQ (sound2->owner (), &thread);
467+
468+ EXPECT_CALL (*player2, stop ());
469+ m_engine->threadAboutToStop ()(&thread);
470+ thread.kill ();
471+ ASSERT_EQ (sound2->owner (), nullptr );
472+ }
473+
474+ TEST_F (SoundBlocksTest, PlayUntilDone_StopWaitingSound)
475+ {
476+ auto sprite = std::make_shared<Sprite>();
477+ auto player1 = std::make_shared<AudioPlayerMock>();
478+ auto player2 = std::make_shared<AudioPlayerMock>();
479+ auto player3 = std::make_shared<AudioPlayerMock>();
480+
481+ EXPECT_CALL (m_outputMock, createAudioPlayer ()).WillOnce (Return (player1));
482+ sprite->addSound (std::make_shared<Sound>(" pop" , " a" , " wav" ));
483+
484+ EXPECT_CALL (m_outputMock, createAudioPlayer ()).WillOnce (Return (player2));
485+ auto sound2 = std::make_shared<Sound>(" meow" , " b" , " wav" );
486+ sprite->addSound (sound2);
487+
488+ EXPECT_CALL (m_outputMock, createAudioPlayer ()).WillOnce (Return (player3));
489+ sprite->addSound (std::make_shared<Sound>(" test" , " c" , " mp3" ));
490+
491+ ScriptBuilder builder (m_extension.get (), m_engine, sprite);
492+ builder.addBlock (" sound_playuntildone" );
493+ builder.addDropdownInput (" SOUND_MENU" , " meow" );
494+ auto block = builder.currentBlock ();
495+
496+ Compiler compiler (&m_engineMock, sprite.get ());
497+ auto code = compiler.compile (block);
498+ Script script (sprite.get (), block, &m_engineMock);
499+ script.setCode (code);
500+ Thread thread (sprite.get (), &m_engineMock, &script);
501+
502+ EXPECT_CALL (*player1, start).Times (0 );
503+ EXPECT_CALL (*player2, start ());
504+ EXPECT_CALL (*player3, start).Times (0 );
505+ EXPECT_CALL (*player2, isPlaying ()).WillRepeatedly (Return (true ));
506+ thread.run ();
507+ ASSERT_FALSE (thread.isFinished ());
508+ ASSERT_EQ (sound2->owner (), &thread);
509+
510+ sound2->stop ();
511+ EXPECT_CALL (*player2, isPlaying ()).Times (0 );
512+ thread.run ();
513+ ASSERT_TRUE (thread.isFinished ());
514+ }
515+
431516TEST_F (SoundBlocksTest, PlayUntilDone_NumberIndex)
432517{
433518 auto sprite = std::make_shared<Sprite>();
0 commit comments