package unittestdemo;

public class Calculator {

  int lastValue = 0;
  int currentValue = 0;

  enum Operator {
    ADD, SUBTRACT, MULTIPLY, DIVIDE, NONE
  };
  Operator lastOp = Operator.NONE;

////////////////////////////////////////////////////////////////////////////////
//  Methods for typical calculator buttons
//  NOTE: Several of these are buggy!
////////////////////////////////////////////////////////////////////////////////
  public void pressDigit(int digit) {
    currentValue = 10 * currentValue + digit;
  }

  public void clear() {
    currentValue = 0;
  }

  public void clearAll() {
    lastValue = 0;
  }

  // These methods don't look very DRY. What ought we do instead?
  public void add() {
    lastOp = Operator.ADD;
    lastValue = currentValue;
    currentValue = 0;
  }

  public void subtract() {
    lastOp = Operator.SUBTRACT;
    lastValue = currentValue;
    currentValue = 0;
  }

  public void multiply() {
    lastOp = Operator.MULTIPLY;
    lastValue = currentValue;
    currentValue = 0;
  }

  public void divide() {
    lastOp = Operator.MULTIPLY;
    lastValue = currentValue;
    currentValue = 0;
  }

  public void equals() {
    // NOTE: This is bad practice, what should we do here instead?
    switch (lastOp) {
      case ADD:
        lastValue = lastValue + currentValue;
        break;
      case SUBTRACT:
        lastValue = currentValue - lastValue;
        break;
      case MULTIPLY:
        lastValue = lastValue * currentValue;
        break;
      case DIVIDE:
        lastValue = lastValue / currentValue;
        break;
      case NONE:
        break;
    }
    currentValue = 0;
  }

////////////////////////////////////////////////////////////////////////////////
//  Other helpers and accessors
////////////////////////////////////////////////////////////////////////////////
  public int getLastComputed() {
    return lastValue;
  }

  public static void main(String[] args) {
    Calculator calc = new Calculator();
    calc.pressDigit(1);
    calc.pressDigit(0);
    calc.pressDigit(0);
    calc.add();
    calc.pressDigit(1);
    calc.pressDigit(0);
    calc.equals();
    System.out.println("Simple Test: " + calc.getLastComputed());
  }
}
