package org.iilab.pb.calculator;
import junit.framework.TestCase;
import org.iilab.pb.calculator.CalculatorImpl;
import org.iilab.pb.calculator.CalculatorImpl.Button;
import org.junit.Test;
import static org.iilab.pb.calculator.CalculatorImpl.Button.DIVIDE;
import static org.iilab.pb.calculator.CalculatorImpl.Button.EIGHT;
import static org.iilab.pb.calculator.CalculatorImpl.Button.EQUALS;
import static org.iilab.pb.calculator.CalculatorImpl.Button.FIVE;
import static org.iilab.pb.calculator.CalculatorImpl.Button.FOUR;
import static org.iilab.pb.calculator.CalculatorImpl.Button.MINUS;
import static org.iilab.pb.calculator.CalculatorImpl.Button.MULTIPLY;
import static org.iilab.pb.calculator.CalculatorImpl.Button.NINE;
import static org.iilab.pb.calculator.CalculatorImpl.Button.ONE;
import static org.iilab.pb.calculator.CalculatorImpl.Button.PLUS;
import static org.iilab.pb.calculator.CalculatorImpl.Button.SEVEN;
import static org.iilab.pb.calculator.CalculatorImpl.Button.SIX;
import static org.iilab.pb.calculator.CalculatorImpl.Button.THREE;
import static org.iilab.pb.calculator.CalculatorImpl.Button.TWO;
import static org.iilab.pb.calculator.CalculatorImpl.Button.ZERO;
public class CalculatorImplTest extends TestCase {
private String pressButtons(CalculatorImpl c, Button... buttons) {
String result = null;
for(Button b : buttons) result = c.handleButtonPress(b);
return result;
}
@Test
public void testAddition() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, PLUS, TWO, EQUALS);
assertEquals("3", result);
}
@Test
public void testAdditionWithNegativeFirstOperand() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, MINUS, THREE, PLUS, FOUR, EQUALS);
assertEquals("1", result);
}
@Test
public void testAdditionWithNegativeSecondOperand() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, FOUR, PLUS, MINUS, FIVE, EQUALS);
assertEquals("-1", result);
}
@Test
public void testAdditionWithMultiDigitOperands() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, MINUS, SIX, SEVEN, PLUS, EIGHT, NINE,
EQUALS);
assertEquals("22", result);
}
@Test
public void testSubtraction() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, TWO, MINUS, ONE, EQUALS);
assertEquals("1", result);
}
@Test
public void testMultiplication() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, TWO, MULTIPLY, TWO, EQUALS);
assertEquals("4", result);
}
@Test
public void testDivision() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, DIVIDE, TWO, EQUALS);
assertEquals("0.5", result);
}
@Test
public void testDivisionByZeroClearsScreen() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, DIVIDE, ZERO, EQUALS);
assertEquals("0", result);
}
@Test
public void testDivisionWithRecurringResultIsTruncated() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, DIVIDE, THREE, EQUALS);
assertEquals("0.3333333", result);
}
@Test
public void testMultiplicationWithNegativeFirstOperand() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, MINUS, TWO, MULTIPLY, THREE, EQUALS);
assertEquals("-6", result);
}
@Test
public void testMultiplicationWithNegativeSecondOperand() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, TWO, MULTIPLY, MINUS, THREE, EQUALS);
assertEquals("-6", result);
}
@Test
public void testSubtractionWithNegativeSecondOperand() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, MINUS, MINUS, TWO, EQUALS);
assertEquals("3", result);
}
@Test
public void testMinusOperatorWithoutOperandStartsNegativeOperand() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, MINUS);
assertEquals("-", result);
}
@Test
public void testNonMinusOperatorWithoutOperandClearsScreen() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, PLUS);
assertEquals("0", result);
result = pressButtons(c, MULTIPLY);
assertEquals("0", result);
result = pressButtons(c, DIVIDE);
assertEquals("0", result);
}
@Test
public void testEqualsWithoutOperandOrOperatorClearsScreen() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, EQUALS);
assertEquals("0", result);
}
@Test
public void testEqualsWithoutOperatorClearsScreen() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, EQUALS);
assertEquals("0", result);
}
@Test
public void testEqualsWithoutSecondOperandClearsScreen() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, PLUS, EQUALS);
assertEquals("0", result);
}
@Test
public void testDigitAfterResultStartsNewCalculation() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, THREE, PLUS, ONE, EQUALS, TWO);
assertEquals("2", result);
}
@Test
public void testOperatorAfterResultContinuesCalculation() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, PLUS, ONE, EQUALS);
assertEquals("2", result);
result = pressButtons(c, PLUS, ONE, EQUALS);
assertEquals("3", result);
}
@Test
public void testChainedCalculations() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, TWO, MULTIPLY, TWO, MINUS, ONE, EQUALS);
assertEquals("3", result);
}
@Test
public void testMinusSignIsDisplayed() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, MINUS, ONE, TWO, THREE);
assertEquals("-123", result);
result = pressButtons(c, PLUS, ONE, EQUALS);
assertEquals("-122", result);
}
@Test
public void testOperatorsAreDisplayed() {
CalculatorImpl c = new CalculatorImpl();
String result = pressButtons(c, ONE, PLUS);
assertEquals("+", result);
result = pressButtons(c, ONE, MINUS);
assertEquals("-", result);
result = pressButtons(c, ONE, MULTIPLY);
assertEquals("\u00d7", result);
result = pressButtons(c, ONE, DIVIDE);
assertEquals("\u00f7", result);
result = pressButtons(c, ONE, EQUALS);
assertEquals("1", result);
}
}