Add view model tests

This commit is contained in:
Sylwester Zieliński
2022-01-28 15:09:51 +01:00
parent d3fca87c45
commit 11372953ee
57 changed files with 781 additions and 437 deletions

View File

@@ -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)
}
}

View File

@@ -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)
}
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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() {

View File

@@ -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() }
}
}

View File

@@ -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)
}
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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) {

View File

@@ -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() }
}
}

View File

@@ -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)
}
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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) {

View File

@@ -74,7 +74,6 @@ internal class CSCViewModel @Inject constructor(
private fun onDisconnectButtonClick() {
repository.sendNewServiceCommand(DisconnectCommand)
repository.setNewStatus(BleManagerStatus.DISCONNECTED)
repository.clear()
}

View File

@@ -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() }
}
}

View File

@@ -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())
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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() {

View File

@@ -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)
}
}

View File

@@ -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() }
}
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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) {

View File

@@ -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)
}
}

View File

@@ -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() }
}
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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) {

View File

@@ -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)
}
}

View File

@@ -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() }
}
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -3,6 +3,6 @@
package="no.nordicsemi.android.prx">
<application>
<service android:name=".service.PRXService"/>
<service android:name=".repository.PRXService"/>
</application>
</manifest>

View File

@@ -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) {

View File

@@ -1,4 +1,4 @@
package no.nordicsemi.android.prx.service
package no.nordicsemi.android.prx.repository
import android.content.Context
import android.media.AudioManager

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)
}
}

View File

@@ -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() }
}
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -3,6 +3,6 @@
package="no.nordicsemi.android.rscs">
<application>
<service android:name=".service.RSCSService"/>
<service android:name=".repository.RSCSService"/>
</application>
</manifest>

View File

@@ -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() {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)
}
}

View File

@@ -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() }
}
}

View File

@@ -20,4 +20,6 @@ dependencies {
implementation libs.lifecycle.service
implementation libs.compose.lifecycle
implementation libs.compose.activity
testImplementation libs.bundles.test
}

View File

@@ -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) {

View File

@@ -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() }
}
}

View File

@@ -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'])
}
}
}