diff --git a/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt b/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt index d9c70465..51973162 100644 --- a/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt +++ b/app/src/main/java/com/sadellie/unitto/screens/main/MainViewModel.kt @@ -40,6 +40,7 @@ import com.sadellie.unitto.data.KEY_8 import com.sadellie.unitto.data.KEY_9 import com.sadellie.unitto.data.KEY_DIVIDE import com.sadellie.unitto.data.KEY_DOT +import com.sadellie.unitto.data.KEY_EXPONENT import com.sadellie.unitto.data.KEY_LEFT_BRACKET import com.sadellie.unitto.data.KEY_MINUS import com.sadellie.unitto.data.KEY_MULTIPLY @@ -309,16 +310,18 @@ class MainViewModel @Inject constructor( _deleteButtonEnabled.update { true } when (symbolToAdd) { - KEY_PLUS, KEY_DIVIDE, KEY_MULTIPLY -> { + KEY_PLUS, KEY_DIVIDE, KEY_MULTIPLY, KEY_EXPONENT -> { when { // Don't need expressions that start with zero - (inputValue.value == KEY_0) or (inputValue.value == KEY_MINUS) -> {} + (inputValue.value == KEY_0) -> {} + (inputValue.value == KEY_MINUS) -> {} + (lastSymbol == KEY_SQRT) -> {} /** * For situations like "50+-", when user clicks "/" we delete "-" so it becomes * "50+". We don't add "/' here. User will click "/" second time and the input * will be "50/". */ - (lastSecondSymbol in OPERATORS) and (lastSymbol == KEY_MINUS)-> { + (lastSecondSymbol in OPERATORS) and (lastSymbol == KEY_MINUS) -> { deleteDigit() } // Don't allow multiple operators near each other diff --git a/app/src/test/java/com/sadellie/unitto/screens/MainViewModelTest.kt b/app/src/test/java/com/sadellie/unitto/screens/MainViewModelTest.kt index da2f710f..8352217f 100644 --- a/app/src/test/java/com/sadellie/unitto/screens/MainViewModelTest.kt +++ b/app/src/test/java/com/sadellie/unitto/screens/MainViewModelTest.kt @@ -98,10 +98,11 @@ class MainViewModelTest { */ `test 0`() `test digits from 1 to 9`() - `test plus, divide and multiply operators`() + `test plus, divide, multiply and exponent operators`() `test dot`() `test minus`() `test brackets`() + `test square root`() Dispatchers.resetMain() } @@ -184,7 +185,7 @@ class MainViewModelTest { viewModel.clearInput() } - private fun `test plus, divide and multiply operators`() { + private fun `test plus, divide, multiply and exponent operators`() { // 0 | +++ | 0 viewModel.processInput(KEY_PLUS) assertEquals("0", viewModel.inputValue.value) @@ -222,6 +223,24 @@ class MainViewModelTest { assertEquals("1+", viewModel.inputValue.value) assertEquals("1+", viewModel.mainFlow.value.inputValue) viewModel.clearInput() + + // 0 | ^^^ | 0 + viewModel.processInput(KEY_EXPONENT) + viewModel.processInput(KEY_EXPONENT) + viewModel.processInput(KEY_EXPONENT) + assertEquals("0", viewModel.inputValue.value) + assertEquals("0", viewModel.mainFlow.value.inputValue) + viewModel.clearInput() + + // 12 | ^^^ | 12^ + viewModel.processInput(KEY_1) + viewModel.processInput(KEY_2) + viewModel.processInput(KEY_EXPONENT) + viewModel.processInput(KEY_EXPONENT) + viewModel.processInput(KEY_EXPONENT) + assertEquals("12^", viewModel.inputValue.value) + assertEquals("12^", viewModel.mainFlow.value.inputValue) + viewModel.clearInput() } private fun `test dot`() { @@ -303,6 +322,26 @@ class MainViewModelTest { assertEquals("√-", viewModel.inputValue.value) assertEquals("√–", viewModel.mainFlow.value.inputValue) viewModel.clearInput() + + // √ | /// | √ + viewModel.processInput(KEY_SQRT) + viewModel.processInput(KEY_DIVIDE) + viewModel.processInput(KEY_DIVIDE) + viewModel.processInput(KEY_DIVIDE) + assertEquals("√", viewModel.inputValue.value) + assertEquals("√", viewModel.mainFlow.value.inputValue) + viewModel.clearInput() + + // 12^- | --- | 12^- + viewModel.processInput(KEY_1) + viewModel.processInput(KEY_2) + viewModel.processInput(KEY_EXPONENT) + viewModel.processInput(KEY_MINUS) + viewModel.processInput(KEY_MINUS) + viewModel.processInput(KEY_MINUS) + assertEquals("12^-", viewModel.inputValue.value) + assertEquals("12^–", viewModel.mainFlow.value.inputValue) + viewModel.clearInput() } private fun `test brackets`() { @@ -330,6 +369,17 @@ class MainViewModelTest { viewModel.processInput(KEY_RIGHT_BRACKET) assertEquals("√(10+2)", viewModel.inputValue.value) assertEquals("√(10+2)", viewModel.mainFlow.value.inputValue) + viewModel.clearInput() + } + + private fun `test square root`() { + // 0 | √√√ | √√√ + viewModel.processInput(KEY_SQRT) + viewModel.processInput(KEY_SQRT) + viewModel.processInput(KEY_SQRT) + assertEquals("√√√", viewModel.inputValue.value) + assertEquals("√√√", viewModel.mainFlow.value.inputValue) + viewModel.clearInput() } @Test