@@ -19,15 +19,18 @@ import androidx.lifecycle.SavedStateHandle
1919import androidx.test.ext.junit.runners.AndroidJUnit4
2020import com.ichi2.anki.Flag
2121import com.ichi2.anki.browser.IdsFile
22+ import com.ichi2.anki.cardviewer.CardMediaPlayer
2223import com.ichi2.anki.servicelayer.NoteService
2324import com.ichi2.anki.utils.ext.flag
2425import com.ichi2.testutils.JvmTest
2526import com.ichi2.testutils.common.Flaky
2627import com.ichi2.testutils.common.OS
2728import io.mockk.coEvery
29+ import io.mockk.coVerify
2830import io.mockk.every
2931import io.mockk.mockk
3032import io.mockk.spyk
33+ import io.mockk.verify
3134import kotlinx.coroutines.flow.first
3235import kotlinx.coroutines.test.TestScope
3336import kotlinx.coroutines.test.advanceUntilIdle
@@ -42,7 +45,13 @@ import org.junit.runner.RunWith
4245class PreviewerViewModelTest : JvmTest () {
4346 private val idsFile: IdsFile = mockk()
4447
48+ private class InstrumentedPreviewerViewModel (
49+ savedStateHandle : SavedStateHandle ,
50+ override val cardMediaPlayer : CardMediaPlayer ,
51+ ) : PreviewerViewModel(savedStateHandle)
52+
4553 private lateinit var viewModel: PreviewerViewModel
54+ private lateinit var mockMediaPlayer: CardMediaPlayer
4655
4756 private fun TestScope.onNextButtonClick () {
4857 viewModel.onNextButtonClick()
@@ -79,9 +88,9 @@ class PreviewerViewModelTest : JvmTest() {
7988 set(PreviewerFragment .CARD_IDS_FILE_ARG , idsFile)
8089 }
8190
82- viewModel = spyk( PreviewerViewModel (savedStateHandle) )
83- // the default implementation requires the Collection media directory,
84- // which needs Robolectric with CollectionStorageMode.IN_MEMORY_WITH_MEDIA or ON_DISK
91+ mockMediaPlayer = mockk(relaxed = true )
92+ viewModel = spyk( InstrumentedPreviewerViewModel (savedStateHandle, mockMediaPlayer))
93+
8594 coEvery { viewModel.prepareCardTextForDisplay(any()) } answers { firstArg() }
8695 }
8796
@@ -270,4 +279,26 @@ class PreviewerViewModelTest : JvmTest() {
270279 onSliderChange(sliderPosition = 2 )
271280 assertEquals(" Index should update for valid input" , 1 , viewModel.currentIndex.value)
272281 }
282+
283+ @Test
284+ fun `audio stops when changing sides` () =
285+ runTest {
286+ viewModel.onPageFinished(false )
287+ viewModel.showingAnswer.value = false
288+
289+ // 1. Next Button (Question -> Answer)
290+ onNextButtonClick()
291+ coVerify(atLeast = 1 ) { mockMediaPlayer.stop() }
292+
293+ // Reset mocks
294+ io.mockk.clearMocks(mockMediaPlayer, answers = false , recordedCalls = true , childMocks = false )
295+
296+ onPreviousButtonClick()
297+ coVerify(atLeast = 1 ) { mockMediaPlayer.stop() }
298+
299+ io.mockk.clearMocks(mockMediaPlayer, answers = false , recordedCalls = true , childMocks = false )
300+
301+ toggleBackSideOnly()
302+ coVerify(atLeast = 1 ) { mockMediaPlayer.stop() }
303+ }
273304}
0 commit comments