Add multiply symbol where needed

This commit is contained in:
Sad Ellie 2022-12-10 18:06:57 +04:00
parent 669e2a0c19
commit 86596f23c0
3 changed files with 166 additions and 30 deletions

View File

@ -51,17 +51,34 @@ const val KEY_EXPONENT = "^"
const val KEY_SQRT = "" const val KEY_SQRT = ""
val OPERATORS = listOf( val OPERATORS by lazy {
KEY_PLUS, listOf(
KEY_MINUS, KEY_PLUS,
KEY_MINUS_DISPLAY, KEY_MINUS,
KEY_MULTIPLY, KEY_MINUS_DISPLAY,
KEY_MULTIPLY_DISPLAY, KEY_MULTIPLY,
KEY_DIVIDE, KEY_MULTIPLY_DISPLAY,
KEY_DIVIDE_DISPLAY, KEY_DIVIDE,
KEY_SQRT, KEY_DIVIDE_DISPLAY,
KEY_EXPONENT, KEY_SQRT,
) KEY_EXPONENT,
)
}
val DIGITS by lazy {
listOf(
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_0,
)
}
val INTERNAL_DISPLAY: Map<String, String> = hashMapOf( val INTERNAL_DISPLAY: Map<String, String> = hashMapOf(
KEY_MINUS to KEY_MINUS_DISPLAY, KEY_MINUS to KEY_MINUS_DISPLAY,

View File

@ -27,6 +27,7 @@ import androidx.lifecycle.viewModelScope
import com.github.keelar.exprk.ExpressionException import com.github.keelar.exprk.ExpressionException
import com.github.keelar.exprk.Expressions import com.github.keelar.exprk.Expressions
import com.sadellie.unitto.FirebaseHelper import com.sadellie.unitto.FirebaseHelper
import com.sadellie.unitto.data.DIGITS
import com.sadellie.unitto.data.INTERNAL_DISPLAY import com.sadellie.unitto.data.INTERNAL_DISPLAY
import com.sadellie.unitto.data.KEY_0 import com.sadellie.unitto.data.KEY_0
import com.sadellie.unitto.data.KEY_1 import com.sadellie.unitto.data.KEY_1
@ -328,18 +329,33 @@ class MainViewModel @Inject constructor(
} }
} }
KEY_0 -> { KEY_0 -> {
// Don't add zero if the input is already a zero when {
if (inputValue.value == KEY_0) return // Don't add zero if the input is already a zero
// Prevents things like "-00" and "4+000" (inputValue.value == KEY_0) -> {}
if ((lastSecondSymbol in OPERATORS) and (lastSymbol == KEY_0)) return (lastSymbol == KEY_RIGHT_BRACKET) -> {
setInputSymbols(symbolToAdd) processInput(KEY_MULTIPLY)
setInputSymbols(symbolToAdd)
}
// Prevents things like "-00" and "4+000"
((lastSecondSymbol in OPERATORS + KEY_LEFT_BRACKET) and (lastSymbol == KEY_0)) -> {}
else -> {
setInputSymbols(symbolToAdd)
}
}
} }
KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 -> { KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 -> {
// Replace single zero (default input) if it's here // Replace single zero (default input) if it's here
if (inputValue.value == KEY_0) { when {
setInputSymbols(symbolToAdd, false) (inputValue.value == KEY_0) -> {
} else { setInputSymbols(symbolToAdd, false)
setInputSymbols(symbolToAdd) }
(lastSymbol == KEY_RIGHT_BRACKET) -> {
processInput(KEY_MULTIPLY)
setInputSymbols(symbolToAdd)
}
else -> {
setInputSymbols(symbolToAdd)
}
} }
} }
KEY_MINUS -> { KEY_MINUS -> {
@ -371,6 +387,10 @@ class MainViewModel @Inject constructor(
(inputValue.value == KEY_0) -> { (inputValue.value == KEY_0) -> {
setInputSymbols(symbolToAdd, false) setInputSymbols(symbolToAdd, false)
} }
(lastSymbol == KEY_RIGHT_BRACKET) || (lastSymbol in DIGITS) || (lastSymbol == KEY_DOT) -> {
processInput(KEY_MULTIPLY)
setInputSymbols(symbolToAdd)
}
else -> { else -> {
setInputSymbols(symbolToAdd) setInputSymbols(symbolToAdd)
} }
@ -379,9 +399,7 @@ class MainViewModel @Inject constructor(
KEY_RIGHT_BRACKET -> { KEY_RIGHT_BRACKET -> {
when { when {
// Replace single zero with minus (to support negative numbers) // Replace single zero with minus (to support negative numbers)
(inputValue.value == KEY_0) -> { (inputValue.value == KEY_0) -> {}
setInputSymbols(symbolToAdd, false)
}
(lastSymbol == KEY_LEFT_BRACKET) -> {} (lastSymbol == KEY_LEFT_BRACKET) -> {}
(latestInputStack.filter { it == KEY_LEFT_BRACKET }.size == (latestInputStack.filter { it == KEY_LEFT_BRACKET }.size ==
latestInputStack.filter { it == KEY_RIGHT_BRACKET }.size) -> {} latestInputStack.filter { it == KEY_RIGHT_BRACKET }.size) -> {}
@ -396,6 +414,10 @@ class MainViewModel @Inject constructor(
(inputValue.value == KEY_0) -> { (inputValue.value == KEY_0) -> {
setInputSymbols(symbolToAdd, false) setInputSymbols(symbolToAdd, false)
} }
(lastSymbol == KEY_RIGHT_BRACKET) || (lastSymbol in DIGITS) || (lastSymbol == KEY_DOT) -> {
processInput(KEY_MULTIPLY)
setInputSymbols(symbolToAdd)
}
else -> { else -> {
setInputSymbols(symbolToAdd) setInputSymbols(symbolToAdd)
} }

View File

@ -167,6 +167,48 @@ class MainViewModelTest {
assertEquals("√0", viewModel.inputValue.value) assertEquals("√0", viewModel.inputValue.value)
assertEquals("√0", viewModel.mainFlow.value.inputValue) assertEquals("√0", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() viewModel.clearInput()
// ( | 000 | (0
viewModel.processInput(KEY_LEFT_BRACKET)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_0)
assertEquals("(0", viewModel.inputValue.value)
assertEquals("(0", viewModel.mainFlow.value.inputValue)
viewModel.clearInput()
// (1+12) | 000 | (1+12)*0
viewModel.processInput(KEY_LEFT_BRACKET)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_PLUS)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_2)
viewModel.processInput(KEY_RIGHT_BRACKET)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_0)
assertEquals("(1+12)*0", viewModel.inputValue.value)
assertEquals("(1+12)×0", viewModel.mainFlow.value.inputValue)
viewModel.clearInput()
// (1.002+120) | 000 | (1+120)*0
viewModel.processInput(KEY_LEFT_BRACKET)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_DOT)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_2)
viewModel.processInput(KEY_PLUS)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_2)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_RIGHT_BRACKET)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_0)
assertEquals("(1.002+120)*0", viewModel.inputValue.value)
assertEquals("(1.002+120)×0", viewModel.mainFlow.value.inputValue)
viewModel.clearInput()
} }
private fun `test digits from 1 to 9`() { private fun `test digits from 1 to 9`() {
@ -183,6 +225,19 @@ class MainViewModelTest {
assertEquals("123456789", viewModel.inputValue.value) assertEquals("123456789", viewModel.inputValue.value)
assertEquals("123456789", viewModel.mainFlow.value.inputValue) assertEquals("123456789", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() viewModel.clearInput()
// (1+1) | 111 | (1+1)*111
viewModel.processInput(KEY_LEFT_BRACKET)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_PLUS)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_RIGHT_BRACKET)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_1)
assertEquals("(1+1)*111", viewModel.inputValue.value)
assertEquals("(1+1)×111", viewModel.mainFlow.value.inputValue)
viewModel.clearInput()
} }
private fun `test plus, divide, multiply and exponent operators`() { private fun `test plus, divide, multiply and exponent operators`() {
@ -407,10 +462,12 @@ class MainViewModelTest {
} }
private fun `test brackets`() { private fun `test brackets`() {
// 0 | ( | ( // 0 | ))) | 0
viewModel.processInput(KEY_LEFT_BRACKET) viewModel.processInput(KEY_RIGHT_BRACKET)
assertEquals("(", viewModel.inputValue.value) viewModel.processInput(KEY_RIGHT_BRACKET)
assertEquals("(", viewModel.mainFlow.value.inputValue) viewModel.processInput(KEY_RIGHT_BRACKET)
assertEquals("0", viewModel.inputValue.value)
assertEquals("0", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() viewModel.clearInput()
// 0 | ((( | ((( // 0 | ((( | (((
@ -421,7 +478,7 @@ class MainViewModelTest {
assertEquals("(((", viewModel.mainFlow.value.inputValue) assertEquals("(((", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() viewModel.clearInput()
// √ | (10+2) | √(10+2) // √(10+2 | )( | √(10+2)*(
viewModel.processInput(KEY_SQRT) viewModel.processInput(KEY_SQRT)
viewModel.processInput(KEY_LEFT_BRACKET) viewModel.processInput(KEY_LEFT_BRACKET)
viewModel.processInput(KEY_1) viewModel.processInput(KEY_1)
@ -429,8 +486,23 @@ class MainViewModelTest {
viewModel.processInput(KEY_PLUS) viewModel.processInput(KEY_PLUS)
viewModel.processInput(KEY_2) viewModel.processInput(KEY_2)
viewModel.processInput(KEY_RIGHT_BRACKET) viewModel.processInput(KEY_RIGHT_BRACKET)
assertEquals("√(10+2)", viewModel.inputValue.value) viewModel.processInput(KEY_LEFT_BRACKET)
assertEquals("√(10+2)", viewModel.mainFlow.value.inputValue) assertEquals("√(10+2)*(", viewModel.inputValue.value)
assertEquals("√(10+2)×(", viewModel.mainFlow.value.inputValue)
viewModel.clearInput()
// √(10+2./ | ( | √(10+2./(
viewModel.processInput(KEY_SQRT)
viewModel.processInput(KEY_LEFT_BRACKET)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_PLUS)
viewModel.processInput(KEY_2)
viewModel.processInput(KEY_DOT)
viewModel.processInput(KEY_DIVIDE)
viewModel.processInput(KEY_LEFT_BRACKET)
assertEquals("√(10+2./(", viewModel.inputValue.value)
assertEquals("√(10+2.÷(", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() viewModel.clearInput()
// 0 | ()()))(( | (((( // 0 | ()()))(( | ((((
@ -445,6 +517,20 @@ class MainViewModelTest {
assertEquals("((((", viewModel.inputValue.value) assertEquals("((((", viewModel.inputValue.value)
assertEquals("((((", viewModel.mainFlow.value.inputValue) assertEquals("((((", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() viewModel.clearInput()
// √(10+2)^ | ( | √(10+2)^(
viewModel.processInput(KEY_SQRT)
viewModel.processInput(KEY_LEFT_BRACKET)
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_0)
viewModel.processInput(KEY_PLUS)
viewModel.processInput(KEY_2)
viewModel.processInput(KEY_RIGHT_BRACKET)
viewModel.processInput(KEY_EXPONENT)
viewModel.processInput(KEY_LEFT_BRACKET)
assertEquals("√(10+2)^(", viewModel.inputValue.value)
assertEquals("√(10+2)^(", viewModel.mainFlow.value.inputValue)
viewModel.clearInput()
} }
private fun `test square root`() { private fun `test square root`() {
@ -455,6 +541,17 @@ class MainViewModelTest {
assertEquals("√√√", viewModel.inputValue.value) assertEquals("√√√", viewModel.inputValue.value)
assertEquals("√√√", viewModel.mainFlow.value.inputValue) assertEquals("√√√", viewModel.mainFlow.value.inputValue)
viewModel.clearInput() viewModel.clearInput()
// 123 | √√√ | 123*√√√
viewModel.processInput(KEY_1)
viewModel.processInput(KEY_2)
viewModel.processInput(KEY_3)
viewModel.processInput(KEY_SQRT)
viewModel.processInput(KEY_SQRT)
viewModel.processInput(KEY_SQRT)
assertEquals("123*√√√", viewModel.inputValue.value)
assertEquals("123×√√√", viewModel.mainFlow.value.inputValue)
viewModel.clearInput()
} }
@Test @Test