@Test
 public void testReduceSum() {
   Expression sum = new Sum(Money.dollar(3), Money.dollar(4));
   Bank bank = new Bank();
   Money result = bank.reduce(sum, "USD");
   assertEquals(Money.dollar(7), result);
 }
 @Test
 public void testAddition() {
   Money five = Money.dollar(5);
   Expression sum = five.plus(five);
   Bank bank = new Bank();
   Money reduced = bank.reduce(sum, "USD");
   assertEquals(Money.dollar(10), reduced);
 }
  @Test
  public void testMixedAddiction() {
    Expression fiveBucks = Money.dollar(5);
    Expression tenFranks = Money.franc(10);
    Bank bank = new Bank();
    bank.addRate("CHF", "USD", 2);
    Money result = bank.reduce(fiveBucks.plus(tenFranks), "USD");

    assertEquals(Money.dollar(10), result);
  }
  @Test
  public void testSumTimes() {
    Expression fiveBucks = Money.dollar(5);
    Expression tenFranks = Money.franc(10);
    Bank bank = new Bank();
    bank.addRate("CHF", "USD", 2);

    Expression sum = new Sum(fiveBucks, tenFranks).times(2);
    Money result = bank.reduce(sum, "USD");
    assertEquals(Money.dollar(20), result);
  }
 @Test
 public void testPlusReturnsSum() {
   Expression five = Money.dollar(5);
   Expression result = five.plus(five);
   Sum sum = (Sum) result;
   assertEquals(five, sum.augend);
   assertEquals(five, sum.addend);
 }
 @Test
 public void testEquality() {
   assertTrue(Money.dollar(5).equals(Money.dollar(5)));
   assertFalse(Money.dollar(5).equals(Money.dollar(6)));
   assertFalse(Money.franc(5).equals(Money.dollar(5)));
 }
 @Test
 public void testReduceMoneyDifferentCurrency() {
   Bank bank = new Bank();
   bank.addRate("CHF", "USD", 2);
   assertEquals(Money.dollar(1), bank.reduce(Money.franc(2), "USD"));
 }
 @Test
 public void testReduceMoney() {
   Bank bank = new Bank();
   Money result = bank.reduce(Money.dollar(1), "USD");
   assertEquals(Money.dollar(1), result);
 }
 @Test
 public void testCurrency() {
   assertEquals("USD", Money.dollar(5).currency());
   assertEquals("CHF", Money.franc(5).currency());
 }
 @Test
 public void testPlusSameCurrencyReturnsMoney() {
   Money result = Money.dollar(1).plus(Money.dollar(1));
   assertEquals(Money.dollar(2), result);
 }
 @Test
 public void testReduce() {
   Money dollar = Money.dollar(1);
   Money reduce = dollar.reduce(new Bank(), dollar.currency());
   assertEquals(dollar, reduce);
 }
 @Test
 public void testCurrency() {
   assertEquals(USD, Money.dollar(1).currency());
   assertEquals(CHF, Money.franc(1).currency());
 }
 @Test
 public void testEquality() {
   Money fiveFrancs = Money.franc(5);
   Money fiveDollars = Money.dollar(5);
   assertFalse(fiveFrancs.equals(fiveDollars));
 }