import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

class CalcTest {
    private final Expr twoPlusThreeTimesFour = new Add(new Num(2), new Mul(new Num(3), new Num(4)));

    @Test
    void evalRespectsTheTree() {
        assertEquals(14, Calc.eval(twoPlusThreeTimesFour));
        assertEquals(20, Calc.eval(new Mul(new Add(new Num(2), new Num(3)), new Num(4))));
    }

    @Test
    void showParenthesizesSums() {
        assertEquals("(2 + 3 * 4)", Calc.show(twoPlusThreeTimesFour));
    }

    @Test
    void simplifyRemovesNeutralElements() {
        Expr e = new Add(new Mul(new Num(1), new Num(7)), new Num(0));
        assertEquals(new Num(7), Calc.simplify(e));
    }

    @Test
    void bothStylesAgree() {
        ExprMethods.Expr e = new ExprMethods.Add(new ExprMethods.Num(2),
                new ExprMethods.Mul(new ExprMethods.Num(3), new ExprMethods.Num(4)));
        assertEquals(Calc.eval(twoPlusThreeTimesFour), e.eval());
        assertEquals(Calc.show(twoPlusThreeTimesFour), e.show());
    }
}
