TDD勉強会第2回終了時点のソースコード(Java版)
12章以降、id:kabakiyoさんはC#でコーディングされていたのですが、自分はそれを見つつ
教科書通りにJavaでコーディングしていました。
というわけで、Javaのコードを公開しておきます。
⇒17章終了時で、最終的に以下のようなコードになりました。
(自分の環境でGreenになったコード)
⇒感想等はこちら http://d.hatena.ne.jp/shozzy/20090627/1246110366
MoneyTest.java
import junit.framework.TestCase;
public class MoneyTest extends TestCase{
public void testMultiplication(){
Money five = Money.dollar(5);
assertEquals(Money.dollar(10), five.times(2));
assertEquals(Money.dollar(15), five.times(3));
}
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)));
}
public void testCurrency(){
assertEquals("USD", Money.dollar(1).currency());
assertEquals("CHF", Money.franc(1).currency());
}
public void testSimpleAddition(){
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);
}
public void testPlusReturnsSum(){
Money five = Money.dollar(5);
Expression result = five.plus(five);
Sum sum = (Sum) result;
assertEquals(five, sum.augend);
assertEquals(five, sum.addend);
}
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);
}
public void testReduceMoney(){
Bank bank = new Bank();
Money result = bank.reduce(Money.dollar(1), "USD");
assertEquals(Money.dollar(1), result);
}
public void testReduceMoneyDifferentCurrency(){
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Money result = bank.reduce(Money.franc(2), "USD");
assertEquals(Money.dollar(1), result);
}
public void testIdentityRate(){
assertEquals(1, new Bank().rate("USD", "USD"));
}
public void testMixedAddition(){
Expression fiveBucks = Money.dollar(5);
Expression tenFrancs = Money.franc(10);
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Money result = bank.reduce(fiveBucks.plus(tenFrancs), "USD");
assertEquals(Money.dollar(10), result);
}
public void testSumPlusMoney(){
Expression fiveBucks = Money.dollar(5);
Expression tenFrancs = Money.franc(10);
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Expression sum = new Sum(fiveBucks, tenFrancs).plus(fiveBucks);
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(15), result);
}
public void testSumTimes(){
Expression fiveBucks = Money.dollar(5);
Expression tenFrancs = Money.franc(10);
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Expression sum = new Sum(fiveBucks, tenFrancs).times(2);
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(20), result);
}
/*
//最後に削除されてる
public void testPlusSameCurrencyReturnsMoney(){
Expression sum = Money.dollar(1).plus(Money.dollar(1));
assertTrue(sum instanceof Money);
}
*/
}Money.java
public class Money implements Expression{
protected int amount;
protected String currency;
Money(int amount, String currency){
this.amount = amount;
this.currency = currency;
}
public boolean equals(Object object){
Money money = (Money) object;
return amount == money.amount
&& currency().equals(money.currency());
}
static Money dollar(int amount){
return new Money(amount, "USD");
}
static Money franc(int amount) {
return new Money(amount, "CHF");
}
public Expression times(int multiplier){
return new Money(amount * multiplier, currency);
}
String currency(){
return currency;
}
public String toString(){
return amount + " " + currency;
}
public Expression plus(Expression addend) {
// TODO Auto-generated method stub
return new Sum(this, addend);
}
public Money reduce(Bank bank, String to){
int rate = bank.rate(currency, to);
return new Money(amount / rate, to);
}
}Expression.java
interface Expression {
Money reduce(Bank bank, String to);
Expression plus(Expression addend);
Expression times(int multiplier);
}Bank.java
import java.util.*;
class Bank {
public Money reduce(Expression source, String to) {
// TODO Auto-generated method stub
return source.reduce(this, to);
}
public void addRate(String from, String to, int rate) {
// TODO Auto-generated method stub
rates.put(new Pair(from, to), new Integer(rate));
}
int rate(String from, String to){
if(from.equals(to)) return 1;
Integer rate = (Integer) rates.get(new Pair(from, to));
return rate.intValue();
}
private Hashtable rates = new Hashtable();
}Sum.java
public class Sum implements Expression{
Expression augend;
Expression addend;
Sum(Expression augend, Expression addend) {
// TODO Auto-generated constructor stub
this.augend = augend;
this.addend = addend;
}
public Money reduce(Bank bank, String to) {
// TODO Auto-generated method stub
int amount = augend.reduce(bank, to).amount + addend.reduce(bank, to).amount;
return new Money(amount, to);
}
public Expression plus(Expression addend) {
// TODO Auto-generated method stub
return new Sum(this, addend);
}
public Expression times(int multiplier) {
// TODO Auto-generated method stub
return new Sum(augend.times(multiplier), addend.times(multiplier));
}
}Pair.java
public class Pair {
private String from;
private String to;
Pair(String from, String to){
this.from = from;
this.to = to;
}
public boolean equals(Object object){
Pair pair = (Pair) object;
return from.equals(pair.from) && to.equals(pair.to);
}
public int hashCode(){
return 0;
}
}