Improved support for exponent and square root in input processing

This commit is contained in:
Sad Ellie 2022-12-08 14:11:42 +04:00
parent 7d2917d942
commit ffd4284f55
2 changed files with 58 additions and 5 deletions

View File

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

View File

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