Compare commits

...

2 Commits

Author SHA1 Message Date
Mariya
a7f3729dd6 digital card fragment coding is finished, testing is pending 2023-11-17 12:41:08 +05:30
Mariya
a068ae492c unitest is pending 2023-11-06 12:36:50 +05:30
14 changed files with 188 additions and 54 deletions

View File

@@ -71,15 +71,16 @@ dependencies {
implementation 'com.google.android.gms:play-services-location:21.0.1' implementation 'com.google.android.gms:play-services-location:21.0.1'
implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
implementation 'com.google.android.things:androidthings:1.0' implementation 'com.google.android.things:androidthings:1.0'
implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta10' implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta11'
implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta10") implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta11")
// Testing // Testing
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
testImplementation 'org.mockito:mockito-core:3.12.0'
testImplementation "androidx.arch.core:core-testing:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
implementation 'com.opencsv:opencsv:4.6' implementation 'com.opencsv:opencsv:4.6'

View File

@@ -0,0 +1,29 @@
package com.example.hpostesting.di
import android.content.Context
import com.example.hpostesting.data.repository.DatabaseRepository
import com.example.hpostesting.data.dao.UserDao
import com.example.hpostesting.domain.SaveRawData
import com.example.hpostesting.domain.SaveRawDataTest
import com.example.hpostesting.presentation.testRight.TestRightViewModel
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.qualifiers.ApplicationContext
@Module
@InstallIn(ViewModelComponent::class)
object ViewModelModule {
@Provides
fun provideTestRightViewModel(
saveRawData: SaveRawData,
saveRawDataTest: SaveRawDataTest,
databaseRepository: DatabaseRepository,
userDao: UserDao,
context: Context
): TestRightViewModel {
return TestRightViewModel(saveRawData, saveRawDataTest, databaseRepository, userDao, context)
}
}

View File

@@ -138,4 +138,8 @@ class DatabaseRepository : Repository {
// Find the DeviceData object with the specified deviceId // Find the DeviceData object with the specified deviceId
return allDeviceDataList.find { it.deviceId == deviceId } return allDeviceDataList.find { it.deviceId == deviceId }
} }
override fun <UserData> addTestToDatabase(testDetails: UserData): Any {
TODO("Not yet implemented")
}
} }

View File

@@ -1,5 +1,6 @@
package com.example.hpostesting.data.repository package com.example.hpostesting.data.repository
interface Repository { interface Repository {
abstract fun <UserData> addTestToDatabase(testDetails: UserData): Any
// suspend fun addToDatabase(data: PatientDetails) // suspend fun addToDatabase(data: PatientDetails)
} }

View File

@@ -40,7 +40,7 @@ import java.util.Locale
class HomeFragment : Fragment() { class HomeFragment : Fragment() {
private var _binding: FragmentHomeBinding? = null private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private val viewModel: TestRightViewModel by activityViewModels() private val viewModel: TestRightViewModel<Any?> by activityViewModels()
private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels() private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels()
private lateinit var rvAdapter: UserListAdapter private lateinit var rvAdapter: UserListAdapter
private var batLevel: Int = 0 // Initialize with a default value, or obtain the actual battery level private var batLevel: Int = 0 // Initialize with a default value, or obtain the actual battery level

View File

@@ -309,7 +309,7 @@ class HemoCubeFragment : Fragment() {
} }
} }
private fun handleValidResult(validString: String, fullReadOutput: String) { fun handleValidResult(validString: String, fullReadOutput: String) {
try { try {
val result = validString.split(" ") val result = validString.split(" ")
val deviceLog = resultData val deviceLog = resultData

View File

@@ -32,7 +32,7 @@ import `in`.sminnovations.hpostesting.databinding.ActivityTestRightBinding
class TestRightActivity : AppCompatActivity() { class TestRightActivity : AppCompatActivity() {
private lateinit var binding: ActivityTestRightBinding private lateinit var binding: ActivityTestRightBinding
private val viewModel by viewModels<TestRightViewModel>() private val viewModel by viewModels<TestRightViewModel<Any?>>()
private var myMenu: Menu? = null private var myMenu: Menu? = null
private lateinit var mDriver: UsbSerialDriver private lateinit var mDriver: UsbSerialDriver

View File

@@ -25,7 +25,7 @@ import `in`.sminnovations.hpostesting.databinding.FragmentTestRightExpReferenceB
@AndroidEntryPoint @AndroidEntryPoint
class TestRightExpReference : Fragment() { class TestRightExpReference : Fragment() {
private lateinit var binding: FragmentTestRightExpReferenceBinding private lateinit var binding: FragmentTestRightExpReferenceBinding
private val viewModel: TestRightViewModel by activityViewModels() private val viewModel: TestRightViewModel<Any?> by activityViewModels()
private val TAG = "TestRightExpReference" private val TAG = "TestRightExpReference"
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?

View File

@@ -27,7 +27,7 @@ import `in`.sminnovations.hpostesting.databinding.FragmentTestRightExpSampleBind
class TestRightExpSample : Fragment() { class TestRightExpSample : Fragment() {
private lateinit var binding: FragmentTestRightExpSampleBinding private lateinit var binding: FragmentTestRightExpSampleBinding
private val viewModel: TestRightViewModel by activityViewModels() private val viewModel: TestRightViewModel<Any?> by activityViewModels()
private val TAG = "TestRightExpSample" private val TAG = "TestRightExpSample"

View File

@@ -32,7 +32,7 @@ import kotlinx.coroutines.withContext
class TestRightResults : Fragment() { class TestRightResults : Fragment() {
private lateinit var binding: FragmentTestRightResultsBinding private lateinit var binding: FragmentTestRightResultsBinding
private val viewModel: TestRightViewModel by activityViewModels() private val viewModel: TestRightViewModel<Any?> by activityViewModels()
private lateinit var sharedPreference: SharedPreferences private lateinit var sharedPreference: SharedPreferences
override fun onCreateView( override fun onCreateView(

View File

@@ -2,7 +2,6 @@ package com.example.hpostesting.presentation.testRight
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.util.Log
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
@@ -27,6 +26,7 @@ import com.example.hpostesting.domain.TestRightResultCalculation
import com.example.hpostesting.util.MyUtils import com.example.hpostesting.util.MyUtils
import com.google.firebase.storage.FirebaseStorage import com.google.firebase.storage.FirebaseStorage
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await import kotlinx.coroutines.tasks.await
import java.io.File import java.io.File
@@ -39,14 +39,16 @@ import kotlin.math.log10
import kotlin.math.pow import kotlin.math.pow
@HiltViewModel @HiltViewModel
@ViewModelScoped
class TestRightViewModel @Inject constructor( class TestRightViewModel @Inject constructor(
private val saveRawData: SaveRawData, private val saveRawData: SaveRawData,
private val saveRawDataTest: SaveRawDataTest, private val saveRawDataTest: SaveRawDataTest,
private val repository: DatabaseRepository, private val repository: DatabaseRepository,
private val userDao: UserDao, private val userDao: UserDao,
context: Context context: Context?
) : ViewModel() { ) : ViewModel() {
var isServiceConnected = false var isServiceConnected = false
val progressBar = MutableLiveData(false) val progressBar = MutableLiveData(false)
@@ -55,10 +57,10 @@ class TestRightViewModel @Inject constructor(
val fireBaseUpload = MutableLiveData<String>() val fireBaseUpload = MutableLiveData<String>()
val testDetails = DataHolder.selectedTest var testDetails = DataHolder.selectedTest
private val _networkStatusLiveData = NetworkStatusLiveData(context) private val _networkStatusLiveData = context?.let { NetworkStatusLiveData(it) }
val networkStatusLiveData: LiveData<Boolean> val networkStatusLiveData: NetworkStatusLiveData?
get() = _networkStatusLiveData get() = _networkStatusLiveData
val allUserData = userDao.getAll() val allUserData = userDao.getAll()
@@ -440,7 +442,7 @@ class TestRightViewModel @Inject constructor(
"yyyy-MM-dd HH:mm:ss", Locale.getDefault() "yyyy-MM-dd HH:mm:ss", Locale.getDefault()
).format(Calendar.getInstance().time) ).format(Calendar.getInstance().time)
when (repository.addTestToDatabase(testDetails)) { when (repository.addTestToDatabase(testDetails)) {
is Response.Success -> { is Response.Success<*> -> {
fireBaseUpload.postValue("Success") fireBaseUpload.postValue("Success")
} }
@@ -449,43 +451,45 @@ class TestRightViewModel @Inject constructor(
} }
} }
fun uploadResultToDatabase(context: Context, isOnline: Boolean,deviceSerialNumber: String) = viewModelScope.launch { fun uploadResultToDatabase(context: Context, isOnline: Boolean, deviceSerialNumber: String) =
val csvFilePath = MyUtils.getAppFolderPath(context) + getCSVFileName() viewModelScope.launch {
val logTxtFilePath = MyUtils.getAppFolderPath(context) + getLogFileName() val csvFilePath = MyUtils.getAppFolderPath(context) + getCSVFileName()
testDetails?.csvPath = csvFilePath val logTxtFilePath = MyUtils.getAppFolderPath(context) + getLogFileName()
testDetails?.reportPath = logTxtFilePath testDetails?.csvPath = csvFilePath
testDetails?.deviceSerialNumber = deviceSerialNumber testDetails?.reportPath = logTxtFilePath
if (isOnline) { testDetails?.deviceSerialNumber = deviceSerialNumber
val storageRef = FirebaseStorage.getInstance().reference if (isOnline) {
val storageTestDetailsRef = storageRef.child("${testDetails?._id}/") val storageRef = FirebaseStorage.getInstance().reference
val storageTestDetailsRef = storageRef.child("${testDetails?._id}/")
try { try {
val csvFileUri = Uri.fromFile(File(csvFilePath)) val csvFileUri = Uri.fromFile(File(csvFilePath))
val logTxtFileUri = Uri.fromFile(File(logTxtFilePath)) val logTxtFileUri = Uri.fromFile(File(logTxtFilePath))
val csvUploadTask = val csvUploadTask =
storageTestDetailsRef.child(csvFileUri.lastPathSegment!!).putFile(csvFileUri) storageTestDetailsRef.child(csvFileUri.lastPathSegment!!)
.await() .putFile(csvFileUri)
val logUploadTask = storageTestDetailsRef.child(logTxtFileUri.lastPathSegment!!) .await()
.putFile(logTxtFileUri).await() val logUploadTask = storageTestDetailsRef.child(logTxtFileUri.lastPathSegment!!)
.putFile(logTxtFileUri).await()
val csvUri = csvUploadTask.storage.downloadUrl.await().toString() val csvUri = csvUploadTask.storage.downloadUrl.await().toString()
val logUri = logUploadTask.storage.downloadUrl.await().toString() val logUri = logUploadTask.storage.downloadUrl.await().toString()
val serialNumber = Constants.STATICID.firstOrNull { it == deviceSerialNumber } val serialNumber = Constants.STATICID.firstOrNull { it == deviceSerialNumber }
testDetails?.csvPath = csvUri testDetails?.csvPath = csvUri
testDetails?.reportPath = logUri testDetails?.reportPath = logUri
addResultTestToDb() addResultTestToDb()
} catch (exception: Exception) { } catch (exception: Exception) {
// Handle the exception appropriately (e.g., log the error, display an error message) // Handle the exception appropriately (e.g., log the error, display an error message)
}
} else {
testDetails?.testTime = SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()
).format(Calendar.getInstance().time)
userDao.insertAll(testDetails!!)
} }
} else {
testDetails?.testTime = SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.getDefault()
).format(Calendar.getInstance().time)
userDao.insertAll(testDetails!!)
} }
}
fun bulkUploadResultToDatabase(userData: UserData) = viewModelScope.launch { fun bulkUploadResultToDatabase(userData: UserData) = viewModelScope.launch {
val storageRef = FirebaseStorage.getInstance().reference val storageRef = FirebaseStorage.getInstance().reference
@@ -520,7 +524,7 @@ class TestRightViewModel @Inject constructor(
"yyyy-MM-dd HH:mm:ss", Locale.getDefault() "yyyy-MM-dd HH:mm:ss", Locale.getDefault()
).format(Calendar.getInstance().time) ).format(Calendar.getInstance().time)
when (repository.addTestToDatabase(userData)) { when (repository.addTestToDatabase(userData)) {
is Response.Success -> { is Response.Success<*> -> {
fireBaseUpload.postValue("Success") fireBaseUpload.postValue("Success")
} }

View File

@@ -0,0 +1,60 @@
package com.example.hpostesting
import android.content.SharedPreferences
import android.view.View
import com.example.hpostesting.presentation.hemocube.HemoCubeFragment
import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel
import com.example.hpostesting.presentation.hemocube.HemocubeActivity
import `in`.sminnovations.hpostesting.databinding.FragmentHemoCubeReferenceBinding
import org.junit.Before
import org.junit.Test
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
class HemocubeViewModelTest {
@Mock
private lateinit var mockSharedPreferences: SharedPreferences
@Mock
private lateinit var mockActivity: HemocubeActivity // Replace with your actual Activity class
@Mock
private lateinit var mockBinding: FragmentHemoCubeReferenceBinding // Replace with your actual Binding class
private lateinit var hemoCubeFragment: HemoCubeFragment
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
hemoCubeFragment = HemoCubeFragment()
}
@Test
fun `handleValidResult with valid input`() {
val validString = "valid string"
val fullReadOutput = "full read output"
`when`(mockSharedPreferences.getString(anyString(), anyString())).thenReturn("dummy_value")
`when`(mockActivity.runOnUiThread(any())).thenAnswer {
val runnable = it.getArgument(0, Runnable::class.java)
runnable.run()
}
// Act
hemoCubeFragment.handleValidResult(validString, fullReadOutput)
// Assert
// Add appropriate assertions based on the behavior you expect
verify(mockSharedPreferences).edit()
verify(mockBinding).btnSubmit.visibility = View.VISIBLE
verify(mockBinding).btnSubmit.isEnabled = true
// Add more verifications as needed
}
// Add more test cases for different scenarios if needed
}

View File

@@ -1,17 +1,49 @@
package com.example.hpostesting package com.example.hpostesting
import android.content.Context
import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.DataHolder
import com.example.hpostesting.data.constant.Constants import com.example.hpostesting.data.constant.Constants
import com.example.hpostesting.data.model.PatientData import com.example.hpostesting.data.dao.UserDao
import com.example.hpostesting.data.model.test.TestRightResultType import com.example.hpostesting.data.model.patient.UserData
import com.example.hpostesting.data.repository.DatabaseRepository
import com.example.hpostesting.domain.SaveRawData
import com.example.hpostesting.domain.SaveRawDataTest
import com.example.hpostesting.presentation.testRight.TestRightViewModel import com.example.hpostesting.presentation.testRight.TestRightViewModel
import junit.framework.Assert.assertEquals import junit.framework.Assert.assertEquals
import org.junit.Before
import org.junit.Test import org.junit.Test
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import java.math.RoundingMode import java.math.RoundingMode
import java.text.DecimalFormat import java.text.DecimalFormat
class TestRightViewModelTest { class TestRightViewModelTest {
private val viewModel = TestRightViewModel()
@Mock
lateinit var mockContext: Context
@Mock
lateinit var mockRepository: DatabaseRepository
@Mock
lateinit var mockSaveRawData: SaveRawData
@Mock
lateinit var mockSaveRawDataTest: SaveRawDataTest
@Mock
lateinit var mockUserDao: UserDao
lateinit var viewModel: TestRightViewModel<Any?>
@Before
fun setUp() {
// Initialize mocks
MockitoAnnotations.initMocks(this)
// Create the ViewModel with mock dependencies
viewModel = TestRightViewModel(mockSaveRawData,mockSaveRawDataTest,mockRepository,mockUserDao,mockContext)
}
private val data = InputData() private val data = InputData()
@Test @Test
@@ -63,8 +95,11 @@ class TestRightViewModelTest {
viewModel.mapDeviceConstants(data.inputRead) viewModel.mapDeviceConstants(data.inputRead)
viewModel.mapPixelNumberToWavelength() viewModel.mapPixelNumberToWavelength()
viewModel.mapIntensityValues(TestDataGenerator().getInputReferenceMapIntensityValues(), true) viewModel.mapIntensityValues(TestDataGenerator().getInputReferenceMapIntensityValues(), true)
viewModel.mapIntensityValues(TestDataGenerator().getInputSampleMapIntensityValues(), false) val mapIntensityValues = viewModel.mapIntensityValues(
viewModel.patientDetails = PatientData("Surya", 2, "Male", TestRightResultType.UNDEFINED) TestDataGenerator().getInputSampleMapIntensityValues(),
false
)
viewModel.testDetails = UserData("Surya", "2", "Male")
viewModel.mapWavelengthToAbsorbance() viewModel.mapWavelengthToAbsorbance()
val wavelengthList = TestDataGenerator().getOutputMapPixelNumberToWavelength() val wavelengthList = TestDataGenerator().getOutputMapPixelNumberToWavelength()

View File

@@ -4,8 +4,8 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.0.2' classpath 'com.android.tools.build:gradle:8.0.2'
classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.gms:google-services:4.4.0'
classpath 'com.google.firebase:firebase-appdistribution-gradle:4.0.0' classpath 'com.google.firebase:firebase-appdistribution-gradle:4.0.1'
} }
repositories { repositories {
mavenCentral() mavenCentral()