@Test
 public void testSimpleAddition() {
   Expression 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 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 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));
 }