mirror of
https://github.com/Myzel394/NumberHub.git
synced 2025-06-19 08:45:27 +02:00
Add multiply symbol where needed
This commit is contained in:
parent
669e2a0c19
commit
86596f23c0
@ -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,
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user