mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2026-02-09 08:44:39 +01:00
Add view model tests
This commit is contained in:
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.utils
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.*
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.utils.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.utils
|
||||
|
||||
import org.junit.Assert.*
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -20,9 +20,5 @@ dependencies {
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.bps
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.bps.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -90,8 +90,11 @@ internal class BPSViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun onDisconnectButtonClick() {
|
||||
bpsManager.disconnect().enqueue()
|
||||
repository.clear()
|
||||
if (bpsManager.isConnected) {
|
||||
bpsManager.disconnect().enqueue()
|
||||
} else {
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
package no.nordicsemi.android.bps
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.bps.data.BPSRepository
|
||||
import no.nordicsemi.android.bps.repository.BPSManager
|
||||
import no.nordicsemi.android.bps.view.DisconnectEvent
|
||||
import no.nordicsemi.android.bps.viewmodel.BPSViewModel
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class BPSViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = BPSRepository()
|
||||
val manager = mockk<BPSManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
every { manager.isConnected } returns true
|
||||
justRun { manager.setConnectionObserver(any()) }
|
||||
justRun { manager.disconnect().enqueue() }
|
||||
|
||||
val viewModel = BPSViewModel(manager, repository, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
//Invoke by manager
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if manager not connected event returns success`() {
|
||||
val repository = BPSRepository()
|
||||
val manager = mockk<BPSManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
every { manager.isConnected } returns false
|
||||
justRun { manager.setConnectionObserver(any()) }
|
||||
|
||||
val viewModel = BPSViewModel(manager, repository, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.bps
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -21,9 +21,5 @@ dependencies {
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.cgms
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.cgms.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
package no.nordicsemi.android.cgms.data
|
||||
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.*
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
@@ -35,7 +31,11 @@ internal class CGMRepository @Inject constructor() {
|
||||
}
|
||||
|
||||
fun sendNewServiceCommand(workingMode: CGMServiceCommand) {
|
||||
_command.tryEmit(workingMode)
|
||||
if (_command.subscriptionCount.value > 0) {
|
||||
_command.tryEmit(workingMode)
|
||||
} else {
|
||||
_status.tryEmit(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
fun setNewStatus(status: BleManagerStatus) {
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
package no.nordicsemi.android.cgms
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.cgms.data.CGMRepository
|
||||
import no.nordicsemi.android.cgms.view.DisconnectEvent
|
||||
import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class CGMSViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = CGMRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = CGMScreenViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
//Invoke by remote service
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if no service started event returns success`() {
|
||||
val repository = CGMRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = CGMScreenViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.cgms
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -21,9 +21,5 @@ dependencies {
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.csc
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.csc.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,11 @@ internal class CSCRepository @Inject constructor() {
|
||||
}
|
||||
|
||||
fun sendNewServiceCommand(workingMode: CSCServiceCommand) {
|
||||
_command.tryEmit(workingMode)
|
||||
if (_command.subscriptionCount.value > 0) {
|
||||
_command.tryEmit(workingMode)
|
||||
} else {
|
||||
_status.tryEmit(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
fun setNewStatus(status: BleManagerStatus) {
|
||||
|
||||
@@ -74,7 +74,6 @@ internal class CSCViewModel @Inject constructor(
|
||||
|
||||
private fun onDisconnectButtonClick() {
|
||||
repository.sendNewServiceCommand(DisconnectCommand)
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
repository.clear()
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
package no.nordicsemi.android.csc
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.csc.data.CSCRepository
|
||||
import no.nordicsemi.android.csc.view.OnDisconnectButtonClick
|
||||
import no.nordicsemi.android.csc.viewmodel.CSCViewModel
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class CSCViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = CSCRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = CSCViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(OnDisconnectButtonClick)
|
||||
|
||||
//Invoke by remote service
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if no service started event returns success`() {
|
||||
val repository = CSCRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = CSCViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(OnDisconnectButtonClick)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package no.nordicsemi.android.csc
|
||||
|
||||
import androidx.annotation.FloatRange
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
|
||||
println("red: ${colorToHex(0f)}")
|
||||
println("green: ${colorToHex(169f)}")
|
||||
println("blue: ${colorToHex(206f)}")
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
|
||||
private fun colorToHex(@FloatRange(from = 0.0, to = 1.0) value: Float) = Integer.toHexString((0xFF * value).toInt())
|
||||
}
|
||||
@@ -23,9 +23,5 @@ dependencies {
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.gls
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.gls.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,11 @@ internal class GLSViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun disconnect() {
|
||||
glsManager.disconnect().enqueue()
|
||||
if (glsManager.isConnected) {
|
||||
glsManager.disconnect().enqueue()
|
||||
} else {
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.gls
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package no.nordicsemi.android.gls
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.gls.data.GLSRepository
|
||||
import no.nordicsemi.android.gls.main.view.DisconnectEvent
|
||||
import no.nordicsemi.android.gls.main.viewmodel.GLSViewModel
|
||||
import no.nordicsemi.android.gls.repository.GLSManager
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class GLSViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = GLSRepository()
|
||||
val manager = mockk<GLSManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
every { manager.isConnected } returns true
|
||||
justRun { manager.setConnectionObserver(any()) }
|
||||
justRun { manager.disconnect().enqueue() }
|
||||
|
||||
val viewModel = GLSViewModel(manager, repository, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
//Invoke by manager
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if manager not connected event returns success`() {
|
||||
val repository = GLSRepository()
|
||||
val manager = mockk<GLSManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
every { manager.isConnected } returns false
|
||||
justRun { manager.setConnectionObserver(any()) }
|
||||
|
||||
val viewModel = GLSViewModel(manager, repository, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -21,10 +21,7 @@ dependencies {
|
||||
implementation libs.lifecycle.service
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
implementation libs.kotlin.coroutines
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.hrs
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.hrs.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
package no.nordicsemi.android.hrs.data
|
||||
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.*
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
@@ -38,7 +34,11 @@ internal class HRSRepository @Inject constructor() {
|
||||
}
|
||||
|
||||
fun sendDisconnectCommand() {
|
||||
_command.tryEmit(DisconnectCommand)
|
||||
if (_command.subscriptionCount.value > 0) {
|
||||
_command.tryEmit(DisconnectCommand)
|
||||
} else {
|
||||
_status.tryEmit(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
fun setNewStatus(status: BleManagerStatus) {
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.hrs
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package no.nordicsemi.android.hrs
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.hrs.data.HRSRepository
|
||||
import no.nordicsemi.android.hrs.view.DisconnectEvent
|
||||
import no.nordicsemi.android.hrs.viewmodel.HRSViewModel
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class HRSViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = HRSRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = HRSViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
//Invoke by remote service
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if no service started event returns success`() {
|
||||
val repository = HRSRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = HRSViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -21,9 +21,5 @@ dependencies {
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.hts
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.hts.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
package no.nordicsemi.android.hts.data
|
||||
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.*
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
@@ -35,7 +31,11 @@ internal class HTSRepository @Inject constructor() {
|
||||
}
|
||||
|
||||
fun sendDisconnectCommand() {
|
||||
_command.tryEmit(DisconnectCommand)
|
||||
if (_command.subscriptionCount.value > 0) {
|
||||
_command.tryEmit(DisconnectCommand)
|
||||
} else {
|
||||
_status.tryEmit(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
fun setNewStatus(status: BleManagerStatus) {
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.hts
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package no.nordicsemi.android.hts
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.hts.data.HTSRepository
|
||||
import no.nordicsemi.android.hts.view.DisconnectEvent
|
||||
import no.nordicsemi.android.hts.viewmodel.HTSViewModel
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class HTSViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = HTSRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = HTSViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
//Invoke by remote service
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if no service started event returns success`() {
|
||||
val repository = HTSRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = HTSViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -20,9 +20,5 @@ dependencies {
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.prx
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.prx.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,6 @@
|
||||
package="no.nordicsemi.android.prx">
|
||||
|
||||
<application>
|
||||
<service android:name=".service.PRXService"/>
|
||||
<service android:name=".repository.PRXService"/>
|
||||
</application>
|
||||
</manifest>
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
package no.nordicsemi.android.prx.data
|
||||
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.*
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
@@ -36,7 +32,11 @@ internal class PRXRepository @Inject constructor() {
|
||||
}
|
||||
|
||||
fun invokeCommand(command: PRXCommand) {
|
||||
_command.tryEmit(command)
|
||||
if (_command.subscriptionCount.value > 0) {
|
||||
_command.tryEmit(command)
|
||||
} else {
|
||||
_status.tryEmit(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
fun setNewStatus(status: BleManagerStatus) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package no.nordicsemi.android.prx.service
|
||||
package no.nordicsemi.android.prx.repository
|
||||
|
||||
import android.content.Context
|
||||
import android.media.AudioManager
|
||||
@@ -19,7 +19,7 @@
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package no.nordicsemi.android.prx.service
|
||||
package no.nordicsemi.android.prx.repository
|
||||
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothGatt
|
||||
@@ -1,4 +1,4 @@
|
||||
package no.nordicsemi.android.prx.service
|
||||
package no.nordicsemi.android.prx.repository
|
||||
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
@@ -19,7 +19,7 @@
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package no.nordicsemi.android.prx.service
|
||||
package no.nordicsemi.android.prx.repository
|
||||
|
||||
import android.bluetooth.BluetoothGattCharacteristic
|
||||
import android.bluetooth.BluetoothGattService
|
||||
@@ -9,8 +9,8 @@ import no.nordicsemi.android.prx.data.DisableAlarm
|
||||
import no.nordicsemi.android.prx.data.Disconnect
|
||||
import no.nordicsemi.android.prx.data.EnableAlarm
|
||||
import no.nordicsemi.android.prx.data.PRXRepository
|
||||
import no.nordicsemi.android.prx.service.PRXService
|
||||
import no.nordicsemi.android.prx.service.PRX_SERVICE_UUID
|
||||
import no.nordicsemi.android.prx.repository.PRXService
|
||||
import no.nordicsemi.android.prx.repository.PRX_SERVICE_UUID
|
||||
import no.nordicsemi.android.prx.view.*
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.prx
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package no.nordicsemi.android.prx
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.prx.data.PRXRepository
|
||||
import no.nordicsemi.android.prx.view.DisconnectEvent
|
||||
import no.nordicsemi.android.prx.viewmodel.PRXViewModel
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class PRXViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = PRXRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = PRXViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
//Invoke by remote service
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if no service started event returns success`() {
|
||||
val repository = PRXRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = PRXViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -20,9 +20,5 @@ dependencies {
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.test.junit
|
||||
androidTestImplementation libs.android.test.junit
|
||||
androidTestImplementation libs.android.test.espresso
|
||||
androidTestImplementation libs.android.test.compose.ui
|
||||
debugImplementation libs.android.test.compose.tooling
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
package no.nordicsemi.android.rscs
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("no.nordicsemi.android.rscs.test", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,6 @@
|
||||
package="no.nordicsemi.android.rscs">
|
||||
|
||||
<application>
|
||||
<service android:name=".service.RSCSService"/>
|
||||
<service android:name=".repository.RSCSService"/>
|
||||
</application>
|
||||
</manifest>
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
package no.nordicsemi.android.rscs.data
|
||||
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.*
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
@@ -47,7 +43,11 @@ internal class RSCSRepository @Inject constructor() {
|
||||
}
|
||||
|
||||
fun sendDisconnectCommand() {
|
||||
_command.tryEmit(DisconnectCommand)
|
||||
if (_command.subscriptionCount.value > 0) {
|
||||
_command.tryEmit(DisconnectCommand)
|
||||
} else {
|
||||
_status.tryEmit(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package no.nordicsemi.android.rscs.service
|
||||
package no.nordicsemi.android.rscs.repository
|
||||
|
||||
import android.bluetooth.BluetoothDevice
|
||||
import android.bluetooth.BluetoothGatt
|
||||
@@ -1,4 +1,4 @@
|
||||
package no.nordicsemi.android.rscs.service
|
||||
package no.nordicsemi.android.rscs.repository
|
||||
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
@@ -6,8 +6,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.*
|
||||
import no.nordicsemi.android.navigation.*
|
||||
import no.nordicsemi.android.rscs.data.RSCSRepository
|
||||
import no.nordicsemi.android.rscs.service.RSCSService
|
||||
import no.nordicsemi.android.rscs.service.RSCS_SERVICE_UUID
|
||||
import no.nordicsemi.android.rscs.repository.RSCSService
|
||||
import no.nordicsemi.android.rscs.repository.RSCS_SERVICE_UUID
|
||||
import no.nordicsemi.android.rscs.view.DisconnectEvent
|
||||
import no.nordicsemi.android.rscs.view.DisplayDataState
|
||||
import no.nordicsemi.android.rscs.view.LoadingState
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package no.nordicsemi.android.rscs
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package no.nordicsemi.android.rscs
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.rscs.data.RSCSRepository
|
||||
import no.nordicsemi.android.rscs.view.DisconnectEvent
|
||||
import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class RSCSViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = RSCSRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = RSCSViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
//Invoke by remote service
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if no service started event returns success`() {
|
||||
val repository = RSCSRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = RSCSViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(DisconnectEvent)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -20,4 +20,6 @@ dependencies {
|
||||
implementation libs.lifecycle.service
|
||||
implementation libs.compose.lifecycle
|
||||
implementation libs.compose.activity
|
||||
|
||||
testImplementation libs.bundles.test
|
||||
}
|
||||
|
||||
@@ -41,7 +41,11 @@ internal class UARTRepository @Inject constructor() {
|
||||
}
|
||||
|
||||
fun sendNewCommand(command: UARTServiceCommand) {
|
||||
_command.tryEmit(command)
|
||||
if (_command.subscriptionCount.value > 0) {
|
||||
_command.tryEmit(command)
|
||||
} else {
|
||||
_status.tryEmit(BleManagerStatus.DISCONNECTED)
|
||||
}
|
||||
}
|
||||
|
||||
fun setNewStatus(status: BleManagerStatus) {
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
package no.nordicsemi.android.gls
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.justRun
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.test.UnconfinedTestDispatcher
|
||||
import kotlinx.coroutines.test.resetMain
|
||||
import kotlinx.coroutines.test.setMain
|
||||
import no.nordicsemi.android.navigation.NavigationManager
|
||||
import no.nordicsemi.android.service.BleManagerStatus
|
||||
import no.nordicsemi.android.service.ServiceManager
|
||||
import no.nordicsemi.android.uart.data.UARTRepository
|
||||
import no.nordicsemi.android.uart.view.OnDisconnectButtonClick
|
||||
import no.nordicsemi.android.uart.viewmodel.UARTViewModel
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class UARTViewModelTest {
|
||||
|
||||
val dispatcher = UnconfinedTestDispatcher()
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
Dispatchers.setMain(dispatcher)
|
||||
}
|
||||
|
||||
@After
|
||||
fun tearDown() {
|
||||
Dispatchers.resetMain()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect event returns success`() {
|
||||
val repository = UARTRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = UARTViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(OnDisconnectButtonClick)
|
||||
|
||||
//Invoke by remote service
|
||||
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `check if navigation up called after disconnect if no service started event returns success`() {
|
||||
val repository = UARTRepository()
|
||||
val serviceManager = mockk<ServiceManager>()
|
||||
val navigationManager = mockk<NavigationManager>()
|
||||
|
||||
every { navigationManager.recentResult } returns MutableSharedFlow(
|
||||
extraBufferCapacity = 1,
|
||||
onBufferOverflow = BufferOverflow.DROP_OLDEST
|
||||
)
|
||||
justRun { navigationManager.navigateTo(any(), any()) }
|
||||
|
||||
val viewModel = UARTViewModel(repository, serviceManager, navigationManager)
|
||||
|
||||
viewModel.onEvent(OnDisconnectButtonClick)
|
||||
|
||||
verify { navigationManager.navigateUp() }
|
||||
}
|
||||
}
|
||||
@@ -60,6 +60,11 @@ dependencyResolutionManagement {
|
||||
alias('android-test-espresso').to('androidx.test.espresso:espresso-core:3.4.0')
|
||||
alias('android-test-compose-ui').to('androidx.compose.ui', 'ui-test-junit4').versionRef('compose')
|
||||
alias('android-test-compose-tooling').to('androidx.compose.ui', 'ui-tooling').versionRef('compose')
|
||||
|
||||
alias('mockk-main').to('io.mockk:mockk:1.12.2')
|
||||
alias('mockk-jvm').to('io.mockk:mockk-agent-jvm:1.12.2')
|
||||
alias('test-coroutines').to('org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0')
|
||||
bundle('test', ['test-junit', 'android-test-junit', 'mockk-main', 'mockk-jvm', 'test-coroutines'])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user