// ====================================================================== // [FUNC] Re-initializes various fields. private void initFields() { clear(); prmScreenText = "0"; clearPrmScreen = true; hasError = false; lastKey = null; }
@Before public void setUp() throws Exception { calculator.clear(); }
// ====================================================================== // [FUNC] Accepts input key from the user. public void inputKey(String key) { if (hasError) { if (key == CXX || key == GRP) { } else if (key == HEX || key == DEC || key == OCT || key == BIN) initFields(); else { beep(); return; } } else if (lastKey == EQU && key != BSP) { clear(); } switch (key) { case GRP: groupDigits = !groupDigits; if (hasError) return; break; case BIN: case OCT: case DEC: case HEX: prmScreenText = dec2rad(rad2dec(prmScreenText, numMode), key); numMode = key; clearPrmScreen = true; break; case MCX: memValue = "0"; clearPrmScreen = true; break; case MRX: if (memValue != "0") prmScreenText = dec2rad(memValue, numMode); else { prmScreenText = "0"; lastKey = DG0; return; } clearPrmScreen = true; break; case MSX: memValue = rad2dec(prmScreenText, numMode); clearPrmScreen = true; break; case MPX: memValue = new BigDecimal(rad2dec(prmScreenText, numMode)) .add(new BigDecimal(memValue)) .toPlainString(); clearPrmScreen = true; break; case MMX: memValue = new BigDecimal(rad2dec(memValue, numMode)) .subtract(new BigDecimal(prmScreenText)) .toPlainString(); clearPrmScreen = true; break; case BSP: if (clearPrmScreen) { beep(); return; } else if (prmScreenText.length() > 1) prmScreenText = prmScreenText.substring(0, prmScreenText.length() - 1); else if (prmScreenText != "0") prmScreenText = "0"; else if (expr[0].hasItems()) pop(); else beep(); break; case CEX: prmScreenText = "0"; break; case CXX: this.initFields(); break; case AVG: if (nset.size() > 0) { BigDecimal bd = BigDecimal.ZERO; for (int i = 0; i < nset.size(); i++) bd = bd.add((BigDecimal) nset.get(i)); prmScreenText = dec2rad( bd.divide(new BigDecimal(nset.size()), 32, BigDecimal.ROUND_HALF_EVEN) .stripTrailingZeros() .toPlainString(), numMode); } else throwError("Invalid Operation: Empty set"); clearPrmScreen = true; break; case SUM: BigDecimal bd = BigDecimal.ZERO; for (int i = 0; i < nset.size(); i++) bd = bd.add((BigDecimal) nset.get(i)); prmScreenText = dec2rad(bd.toPlainString(), numMode); clearPrmScreen = true; if (prmScreenText == "0") { lastKey = DG0; return; } break; case LST: if (prmScreenText != "0") nset.add(new BigDecimal(rad2dec(prmScreenText, numMode))); else beep(); clearPrmScreen = true; break; case CLS: nset.clear(); break; case DG0: if (clearPrmScreen) { prmScreenText = "0"; clearPrmScreen = false; } else if (prmScreenText != "0") prmScreenText += key; else if (lastKey == DG0) beep(); break; case DG1: case DG2: case DG3: case DG4: case DG5: case DG6: case DG7: case DG8: case DG9: case DGA: case DGB: case DGC: case DGD: case DGE: case DGF: if (clearPrmScreen || prmScreenText == DG0) { prmScreenText = key; clearPrmScreen = false; } else prmScreenText += key; break; case DOT: if (clearPrmScreen || prmScreenText == DG0) { prmScreenText = DG0 + DOT; clearPrmScreen = false; } else if (prmScreenText.indexOf(DOT) < 0) prmScreenText += key; else beep(); break; case BR1: case BR2: case SRT: case CRT: case REC: case SQR: case CUB: case FCT: case SIN: case COS: case TAN: case LOG: case NLG: case INT: case NEG: case POW: case MUL: case DIV: case MOD: case ADD: case SUB: if (prmScreenText != "0" || isDigit(lastKey)) push(prmScreenText); if (key.equals(BR1)) push(Expression.BRO); else if (key.equals(BR2)) push(Expression.BRC); else if (key.equals(SRT)) push(Expression.SRT); else if (key.equals(CRT)) push(Expression.CRT); else if (key.equals(REC)) push(Expression.REC); else if (key.equals(SQR)) push(Expression.SQR); else if (key.equals(CUB)) push(Expression.CUB); else if (key.equals(FCT)) push(Expression.FCT); else if (key.equals(SIN)) push(Expression.SIN); else if (key.equals(COS)) push(Expression.COS); else if (key.equals(TAN)) push(Expression.TAN); else if (key.equals(LOG)) push(Expression.LOG); else if (key.equals(NLG)) push(Expression.NLG); else if (key.equals(INT)) push(Expression.INT); else if (key.equals(NEG)) push(Expression.NEG); else if (key.equals(POW)) push(Expression.POW); else if (key.equals(MUL)) push(Expression.MUL); else if (key.equals(DIV)) push(Expression.DIV); else if (key.equals(MOD)) push(Expression.MOD); else if (key.equals(ADD)) push(Expression.ADD); else if (key.equals(SUB)) push(Expression.SUB); prmScreenText = "0"; clearPrmScreen = false; break; case EQU: if (prmScreenText != "0" || isDigit(lastKey) || !expr[0].hasItems()) push(prmScreenText); try { prmScreenText = stripZeros(expr[0].eval().toPlainString()); if (numMode == BIN) prmScreenText = dec2rad(prmScreenText, BIN); else if (numMode == OCT) prmScreenText = dec2rad(prmScreenText, OCT); else if (numMode == HEX) prmScreenText = dec2rad(prmScreenText, HEX); clearPrmScreen = true; } catch (SyntaxErrorException e) { throwError("Syntax Error: " + e.getMessage()); } catch (InvalidInputException e) { throwError("Input Error: " + e.getMessage()); } catch (UnknownOperatorException e) { throwError("Unknown Operator: " + e.getMessage()); } catch (ArithmeticException e) { throwError("Math Error: " + e.getMessage()); } catch (Exception e) { throwError("Application Error: " + e.getMessage()); } break; } lastKey = key; }