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_9
import com.sadellie.unitto.data.KEY_DIVIDE import com.sadellie.unitto.data.KEY_DIVIDE
import com.sadellie.unitto.data.KEY_DOT 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_LEFT_BRACKET
import com.sadellie.unitto.data.KEY_MINUS import com.sadellie.unitto.data.KEY_MINUS
import com.sadellie.unitto.data.KEY_MULTIPLY import com.sadellie.unitto.data.KEY_MULTIPLY
@ -309,16 +310,18 @@ class MainViewModel @Inject constructor(
_deleteButtonEnabled.update { true } _deleteButtonEnabled.update { true }
when (symbolToAdd) { when (symbolToAdd) {
KEY_PLUS, KEY_DIVIDE, KEY_MULTIPLY -> { KEY_PLUS, KEY_DIVIDE, KEY_MULTIPLY, KEY_EXPONENT -> {
when { when {
// Don't need expressions that start with zero // 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 * 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 * "50+". We don't add "/' here. User will click "/" second time and the input
* will be "50/". * will be "50/".
*/ */
(lastSecondSymbol in OPERATORS) and (lastSymbol == KEY_MINUS)-> { (lastSecondSymbol in OPERATORS) and (lastSymbol == KEY_MINUS) -> {
deleteDigit() deleteDigit()
} }
// Don't allow multiple operators near each other // Don't allow multiple operators near each other

View File

@ -98,10 +98,11 @@ class MainViewModelTest {
*/ */
`test 0`() `test 0`()
`test digits from 1 to 9`() `test digits from 1 to 9`()
`test plus, divide and multiply operators`() `test plus, divide, multiply and exponent operators`()
`test dot`() `test dot`()
`test minus`() `test minus`()
`test brackets`() `test brackets`()
`test square root`()
Dispatchers.resetMain() Dispatchers.resetMain()
} }
@ -184,7 +185,7 @@ class MainViewModelTest {
viewModel.clearInput() viewModel.clearInput()
} }
private fun `test plus, divide and multiply operators`() { private fun `test plus, divide, multiply and exponent operators`() {
// 0 | +++ | 0 // 0 | +++ | 0
viewModel.processInput(KEY_PLUS) viewModel.processInput(KEY_PLUS)
assertEquals("0", viewModel.inputValue.value) assertEquals("0", viewModel.inputValue.value)
@ -222,6 +223,24 @@ class MainViewModelTest {
assertEquals("1+", viewModel.inputValue.value) assertEquals("1+", viewModel.inputValue.value)
assertEquals("1+", viewModel.mainFlow.value.inputValue) assertEquals("1+", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() 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`() { private fun `test dot`() {
@ -303,6 +322,26 @@ class MainViewModelTest {
assertEquals("√-", viewModel.inputValue.value) assertEquals("√-", viewModel.inputValue.value)
assertEquals("√–", viewModel.mainFlow.value.inputValue) assertEquals("√–", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() 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`() { private fun `test brackets`() {
@ -330,6 +369,17 @@ class MainViewModelTest {
viewModel.processInput(KEY_RIGHT_BRACKET) viewModel.processInput(KEY_RIGHT_BRACKET)
assertEquals("√(10+2)", viewModel.inputValue.value) assertEquals("√(10+2)", viewModel.inputValue.value)
assertEquals("√(10+2)", viewModel.mainFlow.value.inputValue) 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 @Test