@@ -5,7 +5,6 @@ import com.google.common.truth.Truth.assertThat
55import io.mockk.clearAllMocks
66import io.mockk.every
77import io.mockk.mockk
8- import io.mockk.mockkStatic
98import io.mockk.unmockkStatic
109import io.mockk.verify
1110import kotlinx.coroutines.Dispatchers
@@ -33,7 +32,6 @@ private const val OFFICIAL_PRODUCT_ID = 0x0043
3332private const val CLONE_VENDOR_ID = 0x1A86
3433private const val CLONE_PRODUCT_ID = 0x7523
3534
36-
3735private const val OTHER_VENDOR_ID = 0x1234 // random id
3836private const val OTHER_PRODUCT_ID = 0x1234 // random id
3937
@@ -231,17 +229,84 @@ internal class MainActivityViewModelTest {
231229 }
232230
233231 @Test
234- fun `serialWrite updates output and returns result from arduinoUseCase` () = runTest {
235- // arrange
236- val expected = " TEST_COMMAND"
237- every { mockArduinoUsecase.serialWrite(expected) } returns true
238-
239- // act
240- val result = sut.serialWrite(expected)
241-
242- // assert
243- verify { mockArduinoUsecase.serialWrite(expected) }
244- assertThat(result).isTrue()
245- assertThat(sut.output.value).contains(expected)
246- }
232+ fun `serialWrite updates output and returns result from arduinoUseCase` () =
233+ runTest {
234+ // arrange
235+ val expected = " TEST_COMMAND"
236+ every { mockArduinoUsecase.serialWrite(expected) } returns true
237+
238+ // act
239+ val result = sut.serialWrite(expected)
240+
241+ // assert
242+ verify { mockArduinoUsecase.serialWrite(expected) }
243+ assertThat(result).isTrue()
244+ assertThat(sut.output.value).contains(expected)
245+ }
246+
247+ @Test
248+ fun `getLiveOutput emits arduinoInfo when only arduinoInfo is not empty` () =
249+ runTest {
250+ // arrange
251+ val arduinoDefaultFlow = MutableStateFlow (" " )
252+ val arduinoInfoFlow = MutableStateFlow (" arduino info message" )
253+ val arduinoErrorFlow = MutableStateFlow (" " )
254+ val usbInfoFlow = MutableStateFlow (" " )
255+
256+ every { mockArduinoUsecase.messageFlow } returns arduinoDefaultFlow
257+ every { mockArduinoUsecase.infoMessageFlow } returns arduinoInfoFlow
258+ every { mockArduinoUsecase.errorMessageFlow } returns arduinoErrorFlow
259+ every { mockUsbUseCase.infoMessageFlow } returns usbInfoFlow
260+ every { mockResourceProvider.getString(any()) } returns " "
261+
262+ // inject flows into ViewModel
263+ sut =
264+ MainActivityViewModel (
265+ arduinoUseCase = mockArduinoUsecase,
266+ usbUseCase = mockUsbUseCase,
267+ resourceProvider = mockResourceProvider,
268+ )
269+
270+ // act
271+ val outputFlow = sut.getLiveOutput()
272+ advanceUntilIdle()
273+ val output = outputFlow.value
274+
275+ // assert
276+ assertThat(output.text).isEqualTo(" arduino info message" )
277+ assertThat(output.type).isEqualTo(org.kabiri.android.usbterminal.model.OutputText .OutputType .TYPE_INFO )
278+ }
279+
280+ @Test
281+ fun `getLiveOutput emits arduinoDefault when all outputs are empty` () =
282+ runTest {
283+ // arrange
284+ val arduinoDefaultFlow = MutableStateFlow (" default message" )
285+ val arduinoInfoFlow = MutableStateFlow (" " )
286+ val arduinoErrorFlow = MutableStateFlow (" " )
287+ val usbInfoFlow = MutableStateFlow (" " )
288+
289+ every { mockArduinoUsecase.messageFlow } returns arduinoDefaultFlow
290+ every { mockArduinoUsecase.infoMessageFlow } returns arduinoInfoFlow
291+ every { mockArduinoUsecase.errorMessageFlow } returns arduinoErrorFlow
292+ every { mockUsbUseCase.infoMessageFlow } returns usbInfoFlow
293+ every { mockResourceProvider.getString(any()) } returns " "
294+
295+ // inject flows into ViewModel
296+ sut =
297+ MainActivityViewModel (
298+ arduinoUseCase = mockArduinoUsecase,
299+ usbUseCase = mockUsbUseCase,
300+ resourceProvider = mockResourceProvider,
301+ )
302+
303+ // act
304+ val outputFlow = sut.getLiveOutput()
305+ advanceUntilIdle()
306+ val output = outputFlow.value
307+
308+ // assert
309+ assertThat(output.text).isEqualTo(" default message" )
310+ assertThat(output.type).isEqualTo(org.kabiri.android.usbterminal.model.OutputText .OutputType .TYPE_NORMAL )
311+ }
247312}
0 commit comments