From cd82d882ff2ccf3cb5ac89a4a1b30525a035d5b9 Mon Sep 17 00:00:00 2001 From: Bitmap Date: Sun, 10 Mar 2024 00:32:14 +0530 Subject: [PATCH] Added Test Cases for CommandExecutor Updated kotlin_lint.yml Fixed Lint Errors --- .github/workflows/kotlin_lint.yml | 3 +- src/jvmMain/kotlin/Main.kt | 90 +++++++++++++------ src/jvmMain/kotlin/command/CommandBuilder.kt | 6 +- src/jvmMain/kotlin/command/CommandExecutor.kt | 3 +- src/jvmMain/kotlin/local/FileStorageHelper.kt | 2 +- src/jvmMain/kotlin/local/KiteDbException.kt | 1 - src/jvmMain/kotlin/ui/Styles.kt | 9 +- src/jvmMain/kotlin/ui/Typography.kt | 6 +- .../kotlin/ui/components/ButtonWithToolTip.kt | 19 +++- .../kotlin/ui/components/CheckboxWithText.kt | 4 +- .../ui/components/ChooseFileTextField.kt | 21 +++-- .../kotlin/ui/components/CustomTextField.kt | 4 +- .../kotlin/ui/components/LoadingDialog.kt | 11 ++- .../kotlin/ui/components/TextWithIcon.kt | 4 +- src/jvmMain/kotlin/utils/Constant.kt | 3 +- src/jvmMain/kotlin/utils/FileHelper.kt | 6 +- src/jvmMain/kotlin/utils/FileUtils.kt | 8 +- src/jvmMain/kotlin/utils/Utils.kt | 5 +- .../kotlin/command/CommandExecutorTest.kt | 55 ++++++++++++ .../ui/components/CheckboxWithTextTest.kt | 7 +- 20 files changed, 189 insertions(+), 78 deletions(-) create mode 100644 src/jvmTest/kotlin/command/CommandExecutorTest.kt diff --git a/.github/workflows/kotlin_lint.yml b/.github/workflows/kotlin_lint.yml index ba83209..c5b4d16 100644 --- a/.github/workflows/kotlin_lint.yml +++ b/.github/workflows/kotlin_lint.yml @@ -2,7 +2,7 @@ name: kotlin_lint on: push: - branches: + branches-ignore: - "*" pull_request: paths: @@ -12,7 +12,6 @@ on: jobs: ktlint: runs-on: ubuntu-latest - steps: - name: "checkout" uses: actions/checkout@v2 diff --git a/src/jvmMain/kotlin/Main.kt b/src/jvmMain/kotlin/Main.kt index f404a0a..ce77061 100644 --- a/src/jvmMain/kotlin/Main.kt +++ b/src/jvmMain/kotlin/Main.kt @@ -1,8 +1,28 @@ import androidx.compose.desktop.ui.tooling.preview.Preview -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.text.ClickableText -import androidx.compose.material.* -import androidx.compose.runtime.* +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -16,15 +36,28 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.compose.ui.window.* +import androidx.compose.ui.window.AwtWindow +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.WindowPosition +import androidx.compose.ui.window.application +import androidx.compose.ui.window.rememberWindowState import command.CommandBuilder import command.CommandExecutor import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import local.FileStorageHelper import ui.Styles -import ui.components.* -import utils.* +import ui.components.ButtonWithToolTip +import ui.components.CheckboxWithText +import ui.components.ChooseFileTextField +import ui.components.CustomTextField +import ui.components.LoadingDialog +import utils.Constant +import utils.DBConstants +import utils.FileDialogType +import utils.FileHelper +import utils.Log +import utils.SigningMode import java.awt.Desktop import java.awt.FileDialog import java.awt.Frame @@ -61,13 +94,13 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: var adbPath by remember { mutableStateOf("") } var showLoadingDialog by remember { mutableStateOf(Pair("", false)) } - //TODO: (Fixed this issue need to test more!) - Can't update file path once saved, For now Delete path.kb file inside storage directory. + // TODO: (Fixed this issue need to test more!) - Can't update file path once saved, For now Delete path.kb file inside storage directory. savedJarPath?.let { bundletoolPath = it saveJarPath = true } - //Check if ADB Setup is Done or Not + // Check if ADB Setup is Done or Not adbSavedPath?.let { adbPath = it isAdbSetupDone = true @@ -80,12 +113,12 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: return@FileDialog } when (fileDialogType) { - FileDialogType.BUNDLETOOL -> bundletoolPath = "${directory}$fileName" - FileDialogType.AAPT2 -> aapt2Path = "${directory}$fileName" - FileDialogType.KEY_STORE_PATH -> keyStorePath = "${directory}$fileName" + FileDialogType.BUNDLETOOL -> bundletoolPath = "$directory$fileName" + FileDialogType.AAPT2 -> aapt2Path = "$directory$fileName" + FileDialogType.KEY_STORE_PATH -> keyStorePath = "$directory$fileName" FileDialogType.ADB_PATH -> { - adbPath = "${directory}${fileName}" - //Show Loading Here + adbPath = "$directory$fileName" + // Show Loading Here showLoadingDialog = Pair(Strings.VERIFYING_ADB_PATH, true) CommandExecutor().executeCommand( CommandBuilder() @@ -96,14 +129,14 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: isAdbSetupDone = true Log.i("Saving Path in DB $adbPath") fileStorageHelper.save(DBConstants.ADB_PATH, adbPath) - //Hide Loading + // Hide Loading Thread.sleep(1000L) showLoadingDialog = Pair(Strings.VERIFYING_ADB_PATH, false) }, onFailure = { logs += it isAdbSetupDone = false - //Hide Loading + // Hide Loading showLoadingDialog = Pair(Strings.VERIFYING_ADB_PATH, false) } ) @@ -122,7 +155,7 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: if (isExecute) { isExecute = false - //Get Command to Execute + // Get Command to Execute val (cmd, isValid) = CommandBuilder() .bundletoolPath(bundletoolPath) .aabFilePath(aabFilePath) @@ -143,7 +176,7 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: val runtime = Runtime.getRuntime() val startTime = System.currentTimeMillis() try { - //Launch Runtime to execute command + // Launch Runtime to execute command val process = runtime.exec(cmd) // Read and log error output val errorReader = BufferedReader(InputStreamReader(process.errorStream)) @@ -169,8 +202,8 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: isLoading = false } - //Save Path in Storage - //If We don't have any saved path in file storage and save jar path option is checked.Then,we can save new value in storage. + // Save Path in Storage + // If We don't have any saved path in file storage and save jar path option is checked.Then,we can save new value in storage. if (savedJarPath == null && saveJarPath) { fileStorageHelper.save("path", bundletoolPath) } @@ -216,7 +249,7 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: isOpen = true }, Strings.SETUP_ADB_INFO, - icon = if (isAdbSetupDone) "done" else "info", + icon = if (isAdbSetupDone) "done" else "info" ) } Spacer(modifier = Modifier.padding(8.dp)) @@ -225,7 +258,7 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: modifier = Modifier.wrapContentSize(), verticalAlignment = Alignment.CenterVertically ) { - //Bundle tool select flow + // Bundle tool select flow ChooseFileTextField( bundletoolPath, Strings.SELECT_BUNDLETOOL_JAR, @@ -415,13 +448,13 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: isExecute = true }, modifier = Modifier.padding(start = 16.dp, top = 8.dp, end = 16.dp, bottom = 8.dp) - .wrapContentWidth(), + .wrapContentWidth() ) { Text( text = Strings.EXECUTE, style = Styles.TextStyleMedium(16.sp), color = Color.White, - fontWeight = FontWeight.Medium, + fontWeight = FontWeight.Medium ) } } @@ -439,17 +472,17 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: modifier = Modifier.padding(end = 0.dp, bottom = 8.dp), onClick = { logs = "" - }, + } ) { Text( text = Strings.CLEAR_LOGS, - style = Styles.TextStyleBold(13.sp), + style = Styles.TextStyleBold(13.sp) ) Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) Icon( painter = useResource("clear.svg") { loadSvgPainter(it, density) }, contentDescription = "Clear", - modifier = Modifier.size(ButtonDefaults.IconSize), + modifier = Modifier.size(ButtonDefaults.IconSize) ) } } @@ -457,7 +490,7 @@ fun App(fileStorageHelper: FileStorageHelper, savedPath: String?, adbSavedPath: modifier = Modifier.fillMaxSize().padding(start = 16.dp, end = 16.dp, bottom = 16.dp), value = logs, textStyle = Styles.TextStyleMedium(16.sp), - onValueChange = {}, + onValueChange = {} ) } } @@ -481,10 +514,9 @@ private fun FileDialog( dispose = FileDialog::dispose ) - fun main() = application { val fileStorageHelper = FileStorageHelper() - //Check if path for bundletool exists in local storage + // Check if path for bundletool exists in local storage val path = fileStorageHelper.read(DBConstants.BUNDLETOOL_PATH) as String? val adbPath = fileStorageHelper.read(DBConstants.ADB_PATH) as String? Log.showLogs = true diff --git a/src/jvmMain/kotlin/command/CommandBuilder.kt b/src/jvmMain/kotlin/command/CommandBuilder.kt index 5300748..4fab55a 100644 --- a/src/jvmMain/kotlin/command/CommandBuilder.kt +++ b/src/jvmMain/kotlin/command/CommandBuilder.kt @@ -29,11 +29,11 @@ class CommandBuilder { fun keyAlias(alias: String) = apply { this.keyAlias = alias } fun keyPassword(password: String) = apply { this.keyPassword = password } - fun verifyAdbPath(value: Boolean, path: String) = apply { this.adbVerifyCommandExecute = Pair(value,path) } + fun verifyAdbPath(value: Boolean, path: String) = apply { this.adbVerifyCommandExecute = Pair(value, path) } fun getAdbVerifyCommand(): String { - val (forVerify,path) = adbVerifyCommandExecute - if (forVerify){ + val (forVerify, path) = adbVerifyCommandExecute + if (forVerify) { return "\"${path}\" version" } return "" diff --git a/src/jvmMain/kotlin/command/CommandExecutor.kt b/src/jvmMain/kotlin/command/CommandExecutor.kt index 6657df6..0454c1e 100644 --- a/src/jvmMain/kotlin/command/CommandExecutor.kt +++ b/src/jvmMain/kotlin/command/CommandExecutor.kt @@ -14,7 +14,7 @@ class CommandExecutor { onSuccess: (String) -> Unit, onFailure: (Throwable) -> Unit ) { - coroutineScope.launch(Dispatchers.IO){ + coroutineScope.launch(Dispatchers.IO) { try { val runtime = Runtime.getRuntime() val startTime = System.currentTimeMillis() @@ -51,5 +51,4 @@ class CommandExecutor { } } } - } \ No newline at end of file diff --git a/src/jvmMain/kotlin/local/FileStorageHelper.kt b/src/jvmMain/kotlin/local/FileStorageHelper.kt index f152501..c7cb24e 100644 --- a/src/jvmMain/kotlin/local/FileStorageHelper.kt +++ b/src/jvmMain/kotlin/local/FileStorageHelper.kt @@ -17,6 +17,7 @@ class FileStorageHelper { init { initializeDir() } + private fun getKryo(): Kryo { return if (this::kryo.isInitialized) { kryo @@ -71,5 +72,4 @@ class FileStorageHelper { false } } - } \ No newline at end of file diff --git a/src/jvmMain/kotlin/local/KiteDbException.kt b/src/jvmMain/kotlin/local/KiteDbException.kt index 657c3fc..a8237bb 100644 --- a/src/jvmMain/kotlin/local/KiteDbException.kt +++ b/src/jvmMain/kotlin/local/KiteDbException.kt @@ -5,5 +5,4 @@ class KiteDbException : RuntimeException { constructor(detailMessage: String?) : super(detailMessage) constructor(detailMessage: String?, throwable: Throwable?) : super(detailMessage, throwable) - } \ No newline at end of file diff --git a/src/jvmMain/kotlin/ui/Styles.kt b/src/jvmMain/kotlin/ui/Styles.kt index 9a47e0a..76bc587 100644 --- a/src/jvmMain/kotlin/ui/Styles.kt +++ b/src/jvmMain/kotlin/ui/Styles.kt @@ -10,28 +10,27 @@ object Styles { TextStyle( fontWeight = FontWeight.Normal, fontFamily = codeFontFamily, - fontSize = size, + fontSize = size ) fun TextStyleMedium(size: TextUnit) = TextStyle( fontWeight = FontWeight.Medium, fontFamily = codeFontFamily, - fontSize = size, + fontSize = size ) fun TextStyleSemiBold(size: TextUnit) = TextStyle( fontWeight = FontWeight.SemiBold, fontFamily = codeFontFamily, - fontSize = size, + fontSize = size ) fun TextStyleBold(size: TextUnit) = TextStyle( fontWeight = FontWeight.Bold, fontFamily = codeFontFamily, - fontSize = size, + fontSize = size ) - } \ No newline at end of file diff --git a/src/jvmMain/kotlin/ui/Typography.kt b/src/jvmMain/kotlin/ui/Typography.kt index 1934935..717a87f 100644 --- a/src/jvmMain/kotlin/ui/Typography.kt +++ b/src/jvmMain/kotlin/ui/Typography.kt @@ -9,9 +9,9 @@ import androidx.compose.ui.unit.sp val codeFontFamily = FontFamily( Font(resource = "fonts/sans_regular.ttf", weight = FontWeight.Light), - Font( resource = "fonts/sans_thin.ttf", weight = FontWeight.Normal), - Font( resource = "fonts/sans_medium.ttf", weight = FontWeight.Medium), - Font( resource = "fonts/sans_bold.ttf", weight = FontWeight.Bold) + Font(resource = "fonts/sans_thin.ttf", weight = FontWeight.Normal), + Font(resource = "fonts/sans_medium.ttf", weight = FontWeight.Medium), + Font(resource = "fonts/sans_bold.ttf", weight = FontWeight.Bold) ) val typography = Typography( diff --git a/src/jvmMain/kotlin/ui/components/ButtonWithToolTip.kt b/src/jvmMain/kotlin/ui/components/ButtonWithToolTip.kt index dd1543f..cd7ffc7 100644 --- a/src/jvmMain/kotlin/ui/components/ButtonWithToolTip.kt +++ b/src/jvmMain/kotlin/ui/components/ButtonWithToolTip.kt @@ -6,7 +6,12 @@ import androidx.compose.foundation.TooltipPlacement import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.* +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Icon +import androidx.compose.material.Surface +import androidx.compose.material.Button +import androidx.compose.material.ButtonColors +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -23,7 +28,13 @@ import ui.Styles @OptIn(ExperimentalFoundationApi::class) @Composable -fun ButtonWithToolTip(label: String, onClick: () -> Unit, toolTipText: String = "", icon: String = "info", buttonColors: ButtonColors = ButtonDefaults.buttonColors()) { +fun ButtonWithToolTip( + label: String, + onClick: () -> Unit, + toolTipText: String = "", + icon: String = "info", + buttonColors: ButtonColors = ButtonDefaults.buttonColors() +) { val density = LocalDensity.current // to calculate the intrinsic size of vector images (SVG, XML) Button( onClick = { @@ -31,13 +42,13 @@ fun ButtonWithToolTip(label: String, onClick: () -> Unit, toolTipText: String = }, colors = buttonColors, modifier = Modifier.padding(start = 16.dp, top = 8.dp, end = 16.dp, bottom = 8.dp) - .wrapContentWidth(), + .wrapContentWidth() ) { Text( text = label, style = Styles.TextStyleMedium(16.sp), color = Color.White, - fontWeight = FontWeight.Medium, + fontWeight = FontWeight.Medium ) if (toolTipText.isNotEmpty()) { TooltipArea( diff --git a/src/jvmMain/kotlin/ui/components/CheckboxWithText.kt b/src/jvmMain/kotlin/ui/components/CheckboxWithText.kt index 6f1c88a..888785b 100644 --- a/src/jvmMain/kotlin/ui/components/CheckboxWithText.kt +++ b/src/jvmMain/kotlin/ui/components/CheckboxWithText.kt @@ -36,12 +36,12 @@ fun CheckboxWithText(label: String, isChecked: Boolean, onCheckedChange: (Boolea Checkbox( modifier = Modifier.testTag(TestTags.CHECKBOX_TAG), checked = isChecked, - onCheckedChange = { onCheckedChange.invoke(it) }, + onCheckedChange = { onCheckedChange.invoke(it) } ) Text( modifier = Modifier.testTag(TestTags.TEXT_TAG), text = label, - style = Styles.TextStyleMedium(14.sp), + style = Styles.TextStyleMedium(14.sp) ) if (toolTipText.isNotEmpty()) { TooltipArea( diff --git a/src/jvmMain/kotlin/ui/components/ChooseFileTextField.kt b/src/jvmMain/kotlin/ui/components/ChooseFileTextField.kt index fbd5434..1d988e0 100644 --- a/src/jvmMain/kotlin/ui/components/ChooseFileTextField.kt +++ b/src/jvmMain/kotlin/ui/components/ChooseFileTextField.kt @@ -2,9 +2,18 @@ package ui.components import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.border -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.* +import androidx.compose.material.Button +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.material.MaterialTheme +import androidx.compose.material.TextField +import androidx.compose.material.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -42,11 +51,11 @@ fun ChooseFileTextField(value: String, label: String, onSelect: () -> Unit) { Text( text = label, style = Styles.TextStyleMedium(16.sp), - fontWeight = FontWeight.Medium, + fontWeight = FontWeight.Medium ) }, textStyle = Styles.TextStyleMedium(16.sp), - onValueChange = {}, + onValueChange = {} ) Button( onClick = { @@ -54,11 +63,11 @@ fun ChooseFileTextField(value: String, label: String, onSelect: () -> Unit) { }, modifier = Modifier .height(50.dp) - .wrapContentWidth(), + .wrapContentWidth() ) { Icon( painter = useResource("open_folder.svg") { loadSvgPainter(it, density) }, - contentDescription = "", + contentDescription = "" ) } } diff --git a/src/jvmMain/kotlin/ui/components/CustomTextField.kt b/src/jvmMain/kotlin/ui/components/CustomTextField.kt index a4c1d73..a173cec 100644 --- a/src/jvmMain/kotlin/ui/components/CustomTextField.kt +++ b/src/jvmMain/kotlin/ui/components/CustomTextField.kt @@ -49,13 +49,13 @@ fun CustomTextField(value: String, label: String, forPassword: Boolean = true, o Text( text = label, style = Styles.TextStyleMedium(16.sp), - fontWeight = FontWeight.Medium, + fontWeight = FontWeight.Medium ) }, textStyle = Styles.TextStyleMedium(16.sp), onValueChange = { onValueChange.invoke(it) - }, + } ) } } \ No newline at end of file diff --git a/src/jvmMain/kotlin/ui/components/LoadingDialog.kt b/src/jvmMain/kotlin/ui/components/LoadingDialog.kt index 3496623..15bb87d 100644 --- a/src/jvmMain/kotlin/ui/components/LoadingDialog.kt +++ b/src/jvmMain/kotlin/ui/components/LoadingDialog.kt @@ -2,7 +2,12 @@ package ui.components import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.border -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Surface @@ -45,13 +50,11 @@ fun LoadingDialog(text: String) { Text( text = text, style = Styles.TextStyleBold(20.sp), - modifier = Modifier.padding(start = 8.dp,end = 8.dp, bottom = 8.dp) + modifier = Modifier.padding(start = 8.dp, end = 8.dp, bottom = 8.dp) ) CircularProgressIndicator() } } } - } - } \ No newline at end of file diff --git a/src/jvmMain/kotlin/ui/components/TextWithIcon.kt b/src/jvmMain/kotlin/ui/components/TextWithIcon.kt index 6fe735c..ca3b404 100644 --- a/src/jvmMain/kotlin/ui/components/TextWithIcon.kt +++ b/src/jvmMain/kotlin/ui/components/TextWithIcon.kt @@ -24,13 +24,13 @@ fun TextWithIcon(label: String, onIconClick: () -> Unit) { text = label, style = Styles.TextStyleMedium(16.sp), color = Color.Black, - fontWeight = FontWeight.Medium, + fontWeight = FontWeight.Medium ) Icon( painter = useResource("info.svg") { loadSvgPainter(it, density) }, contentDescription = "Info", modifier = Modifier.padding(start = 8.dp) - .clickable { onIconClick.invoke() }, + .clickable { onIconClick.invoke() } ) } } \ No newline at end of file diff --git a/src/jvmMain/kotlin/utils/Constant.kt b/src/jvmMain/kotlin/utils/Constant.kt index a2f6418..6cbd0c7 100644 --- a/src/jvmMain/kotlin/utils/Constant.kt +++ b/src/jvmMain/kotlin/utils/Constant.kt @@ -22,5 +22,4 @@ object FileDialogType { object SigningMode { const val DEBUG = 1 const val RELEASE = 2 -} - +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/utils/FileHelper.kt b/src/jvmMain/kotlin/utils/FileHelper.kt index 182b35f..7f1b7f4 100644 --- a/src/jvmMain/kotlin/utils/FileHelper.kt +++ b/src/jvmMain/kotlin/utils/FileHelper.kt @@ -12,7 +12,10 @@ object FileHelper { Log.i("CHANGED NAME\n Unzipping...") try { FileUtils.unzip(newFile, directory) - fileStatus.invoke(Constant.SUCCESS, "Rename and Unzip Successful\nFile Saved at ${directory.removeSuffix("\\")}.") + fileStatus.invoke( + Constant.SUCCESS, + "Rename and Unzip Successful\nFile Saved at ${directory.removeSuffix("\\")}." + ) Log.i("TRYING DELETING FILE") val value = FileUtils.deleteFile(newFile) Log.i("DELETE STATUS : $value") @@ -25,5 +28,4 @@ object FileHelper { fileStatus.invoke(Constant.FAILURE, "FAILED RENAMING THE FILE!!") } } - } \ No newline at end of file diff --git a/src/jvmMain/kotlin/utils/FileUtils.kt b/src/jvmMain/kotlin/utils/FileUtils.kt index 306ecd2..8d81876 100644 --- a/src/jvmMain/kotlin/utils/FileUtils.kt +++ b/src/jvmMain/kotlin/utils/FileUtils.kt @@ -1,6 +1,10 @@ package utils -import java.io.* +import java.io.BufferedOutputStream +import java.io.File +import java.io.IOException +import java.io.InputStream +import java.io.FileOutputStream import java.util.zip.ZipFile object FileUtils { @@ -13,7 +17,6 @@ object FileUtils { fun deleteFile(file: File) = file.delete() - /** * @param oldFile * @param newFile @@ -72,5 +75,4 @@ object FileUtils { } bos.close() } - } \ No newline at end of file diff --git a/src/jvmMain/kotlin/utils/Utils.kt b/src/jvmMain/kotlin/utils/Utils.kt index 60efa01..e788a1d 100644 --- a/src/jvmMain/kotlin/utils/Utils.kt +++ b/src/jvmMain/kotlin/utils/Utils.kt @@ -1,11 +1,10 @@ package utils -import java.util.* +import java.util.Locale object Utils { - fun isWindowsOS(): Boolean{ + fun isWindowsOS(): Boolean { return System.getProperty("os.name").lowercase(Locale.getDefault()).contains("windows") } - } \ No newline at end of file diff --git a/src/jvmTest/kotlin/command/CommandExecutorTest.kt b/src/jvmTest/kotlin/command/CommandExecutorTest.kt new file mode 100644 index 0000000..ce178c6 --- /dev/null +++ b/src/jvmTest/kotlin/command/CommandExecutorTest.kt @@ -0,0 +1,55 @@ +package command + +import junit.framework.TestCase.assertTrue +import kotlinx.coroutines.runBlocking +import org.hamcrest.MatcherAssert.assertThat +import org.junit.Before +import org.junit.Test + +class CommandExecutorTest { + private lateinit var commandExecutor: CommandExecutor + + @Before + fun setUp() { + commandExecutor = CommandExecutor() + } + + // These test cases may not work for MAC and Linux need to verify. + @Test + fun `execute valid command successfully`() { + val expectedOutput = "openjdk 11.0.18 2023-01-17" + val cmd = "java --version" + + runBlocking { + commandExecutor.executeCommand( + cmd, + this, + onSuccess = { + println("SUCCESS -> $it") + assertThat(expectedOutput, it.contains(expectedOutput)) + }, + onFailure = { + println("ERROR -> ${it.message}") + assertThat(expectedOutput, it.message?.contains(expectedOutput) ?: false) + } + ) + } + } + + @Test + fun `execute invalid command and handle failure`() { + val cmd = "invalid_command" + runBlocking { + commandExecutor.executeCommand( + cmd, + this, + onSuccess = { + assertTrue(it.isEmpty()) + }, + onFailure = { + assertTrue(it.message?.contains("The system cannot find the file specified") ?: false) + } + ) + } + } +} \ No newline at end of file diff --git a/src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt b/src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt index c3fb360..5af21ea 100644 --- a/src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt +++ b/src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt @@ -4,8 +4,12 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.test.* +import androidx.compose.ui.test.assertIsOff +import androidx.compose.ui.test.assertIsOn +import androidx.compose.ui.test.assertTextEquals +import androidx.compose.ui.test.performClick import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag import org.junit.Rule import org.junit.Test import utils.TestTags @@ -57,5 +61,4 @@ class CheckboxWithTextTest { checkbox.performClick() checkbox.assertIsOff() } - } \ No newline at end of file