TDD Pactice Material
Transcript of TDD Pactice Material
-
8/12/2019 TDD Pactice Material
1/48
TDD
1. .
IBM PC 1000 25 USD 25000 USD
Novartis
PC400
150
CHF60000 CHF
Total 65000 USD
2. Dollar.
. 5 2 10.
3. Eclipse New > Java ProjectMoneyPrj
.
4. MoneyPrjNew > JUnitTestCase.
5. MoneyTestTest .
-
8/12/2019 TDD Pactice Material
2/48
6. .
7. 5 2 10.
public void testMultiplication(){
-
8/12/2019 TDD Pactice Material
3/48
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amount);
}
8. Dollar .
public class Dollar {
int amount = 10;
Dollar(int amount){
}
void times(int multiplier){
}
}
9. .
10. times amount .
public class Dollar {
int amount;
Dollar(int amount){
}
void times(int multiplier){
amount = 5*2;
}
-
8/12/2019 TDD Pactice Material
4/48
}
11. .
12. .
public class Dollar {
int amount;
Dollar(int amount){
this.amount = amount;
}
void times(int multiplier){
amount = amount*multiplier;
}
}
13. times .
public class Dollar {
int amount;
Dollar(int amount){
this.amount = amount;
}
void times(int multiplier){
amount *= multiplier;
}
}
14. .
-
8/12/2019 TDD Pactice Material
5/48
15. .
public class MoneyTest extends TestCase {
public void testMultiplication(){
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amount);
five.times(3);
assertEquals(15, five.amount);
}
}
16. . 5 10.
. times
Dollar.
public class MoneyTest extends TestCase {
public void testMultiplication(){
Dollar five = new Dollar(5);
Dollar product = five.times(2);
assertEquals(10, product.amount);
product = five.times(3);
assertEquals(15, product.amount);
}
}
17. times .
public class Dollar {
int amount;
-
8/12/2019 TDD Pactice Material
6/48
Dollar(int amount){
this.amount = amount;
}
Dollar times(int multiplier){
return new Dollar(amount * multiplier);
}
}
18. .
19. Dollar Value Object. Value Object.
.
20. .
public class MoneyTest extends TestCase {
public void testMultiplication(){
Dollar five = new Dollar(5);Dollar product = five.times(2);
assertEquals(10, product.amount);
product = five.times(3);
assertEquals(15, product.amount);
}
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
}
}
21. Dollar equals .
public class Dollar {
int amount;
-
8/12/2019 TDD Pactice Material
7/48
Dollar(int amount){
this.amount = amount;
}
Dollar times(int multiplier){
return new Dollar(amount * multiplier);
}
public boolean equals(Object object){
return true;
}
}
22. .
23. .
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
}
24. Dollarequals .
public boolean equals(Object object){
Dollar dollar = (Dollar)object;
return amount == dollar.amount;}
25. .
26. equals assertEquals. testMultiplication
.
public void testMultiplication(){
Dollar five = new Dollar(5);
assertEquals(new Dollar(10), five.times(2));
-
8/12/2019 TDD Pactice Material
8/48
assertEquals(new Dollar(15), five.times(3));
}
27. .
28. Dollar. Franc.
public class Franc {
int amount;
Franc(int amount){
this.amount = amount;
}
Franc times(int multiplier){
return new Franc(amount * multiplier);
}
public boolean equals(Object object){
Franc franc = (Franc)object;
return amount == franc.amount;
}
}
29. Franc .
public void testFrancMultiplication(){
Franc five = new Franc(5);
assertEquals(new Franc(10), five.times(2));
assertEquals(new Franc(15), five.times(3));
}
30. Dollar Franc Money . Dollar
Franc amountMoney amount.
public class Money {
-
8/12/2019 TDD Pactice Material
9/48
protected int amount;
}
31. Dollar .
public class Dollar extends Money{
Dollar(int amount){
this.amount = amount;
}
Dollar times(int multiplier){
return new Dollar(amount * multiplier);
}
public boolean equals(Object object){
Dollar dollar = (Dollar)object;
return amount == dollar.amount;
}
}
32. Franc .
public class Franc extends Money{
Franc(int amount){
this.amount = amount;
}
Franc times(int multiplier){
return new Franc(amount * multiplier);
}
-
8/12/2019 TDD Pactice Material
10/48
public boolean equals(Object object){
Franc franc = (Franc)object;
return amount == franc.amount;
}
}
33. Dollar equals .
public boolean equals(Object object){
Money money = (Money)object;
return amount == money.amount;
}
34. Franc equals .
public boolean equals(Object object){
Money money = (Money)object;
return amount == money.amount;
}
35. equals . equals
Refactor > Pull up.
-
8/12/2019 TDD Pactice Material
11/48
36. equals .
-
8/12/2019 TDD Pactice Material
12/48
37. equals .
-
8/12/2019 TDD Pactice Material
13/48
38. Finishequals Money .
public class Money {
protected int amount;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount;
}
}
39. testEquality.
-
8/12/2019 TDD Pactice Material
14/48
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
assertTrue(new Franc(5).equals(new Franc(5)));
assertFalse(new Franc(5).equals(new Franc(6)));
}
40. .
41. Franc Dollar. testEquality
.
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
assertTrue(new Franc(5).equals(new Franc(5)));
assertFalse(new Franc(5).equals(new Franc(6)));
assertFalse(new Franc(5).equals(new Dollar(5)));
}
42. .
43. equals .
public class Money {
protected int amount;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
getClass().equals(money.getClass());
}
}
44. .
45. Money Factory .
testMultiplication .
public void testMultiplication(){
Dollar five = Money.dollar(5);
-
8/12/2019 TDD Pactice Material
15/48
assertEquals(new Dollar(10), five.times(2));
assertEquals(new Dollar(15), five.times(3));
}
46. Money static .
public class Money {
protected int amount;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
getClass().equals(money.getClass());
}
static Dollar dollar(int amount){
return new Dollar(amount);
}
}
47. testMultiplication .
public void testMultiplication(){
Money five = Money.dollar(5);
assertEquals(new Dollar(10), five.times(2));
assertEquals(new Dollar(15), five.times(3));
}
48. Money times . Money times. Money .
public abstract class Money {
protected int amount;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
-
8/12/2019 TDD Pactice Material
16/48
getClass().equals(money.getClass());
}
static Dollar dollar(int amount){
return new Dollar(amount);
}
abstract Money times(int multiplier);
}
49. dollar return Money.
public abstract class Money {
protected int amount;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
getClass().equals(money.getClass());
}
static Money dollar(int amount){
return new Dollar(amount);
}
abstract Money times(int multiplier);
}
50. .
51. factory .
public class MoneyTest extends TestCase {
public void testMultiplication(){
Money five = Money.dollar(5);
assertEquals(Money.dollar(10), five.times(2));
-
8/12/2019 TDD Pactice Material
17/48
assertEquals(Money.dollar(15), five.times(3));
}
public void testFrancMultiplication(){
Franc five = new Franc(5);
assertEquals(new Franc(10), five.times(2));
assertEquals(new Franc(15), five.times(3));
}
public void testEquality(){
assertTrue(Money.dollar(5).equals(Money.dollar(5)));
assertFalse(Money.dollar(5).equals(Money.dollar(6)));
assertTrue(new Franc(5).equals(new Franc(5)));
assertFalse(new Franc(5).equals(new Franc(6)));
assertFalse(new Franc(5).equals(new Dollar(5)));
}
}
52. .
53. Franc factory Money .
static Money franc(int amount){
return new Franc(amount);
}
54. factory .
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));
-
8/12/2019 TDD Pactice Material
18/48
}
public void testFrancMultiplication(){
Money five = Money.franc(5);
assertEquals(new Franc(10), five.times(2));
assertEquals(new Franc(15), five.times(3));
}
public void testEquality(){
assertTrue(Money.dollar(5).equals(Money.dollar(5)));
assertFalse(Money.dollar(5).equals(Money.dollar(6)));
assertTrue(Money.franc(5).equals(Money.franc(5)));
assertFalse(Money.franc(5).equals(Money.franc(6)));
assertTrue(Money.franc(5).equals(Money.franc(5)));
}
}
55. Money . .
public void testCurrency(){
assertEquals("USD", Money.dollar(1).currency());
assertEquals("CHF", Money.franc(1).currency());
}
56. Money currency .
public abstract class Money {
protected int amount;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
getClass().equals(money.getClass());
}
-
8/12/2019 TDD Pactice Material
19/48
static Money dollar(int amount){
return new Dollar(amount);
}
static Money franc(int amount){
return new Franc(amount);
}
abstract Money times(int multiplier);
abstract String currency();
}
57. Franc .
public class Franc extends Money{
Franc(int amount){
this.amount = amount;
}
Franc times(int multiplier){
return new Franc(amount * multiplier);
}
String currency(){
return "CHF";
}
}
58. Dollar .
public class Dollar extends Money{
-
8/12/2019 TDD Pactice Material
20/48
Dollar(int amount){
this.amount = amount;
}
Money times(int multiplier){
return new Dollar(amount * multiplier);
}
String currency(){
return "USD";
}
}
59. .
60. Franc .
public class Franc extends Money{
private String currency;
Franc(int amount){
this.amount = amount;
currency = "CHF";
}
Franc times(int multiplier){
return new Franc(amount * multiplier);
}
String currency(){
return currency;
}
-
8/12/2019 TDD Pactice Material
21/48
}
71. Dollar currency.
public class Dollar extends Money{
private String currency;
Dollar(int amount){
this.amount = amount;
currency = "USD";
}
Money times(int multiplier){
return new Dollar(amount * multiplier);
}
String currency(){
return currency;
}
}
72. .
73. DollarFranccurrencyMoney.
public abstract class Money {
protected int amount;
protected String currency;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
getClass().equals(money.getClass());
}
-
8/12/2019 TDD Pactice Material
22/48
static Money dollar(int amount){
return new Dollar(amount);
}
static Money franc(int amount){
return new Franc(amount);
}
abstract Money times(int multiplier);
String currency(){
return currency;
}
}
73. Dollar .
public class Dollar extends Money{
Dollar(int amount){
this.amount = amount;
currency = "USD";
}
Money times(int multiplier){
return new Dollar(amount * multiplier);
}
}
74. Franc .
public class Franc extends Money{
Franc(int amount){
-
8/12/2019 TDD Pactice Material
23/48
this.amount = amount;
currency = "CHF";
}
Franc times(int multiplier){
return new Franc(amount * multiplier);
}
}
75. .
77. Franc .
Franc(int amount, String currency){
this.amount = amount;
currency = "CHF";
}
78. Money franc .
static Money franc(int amount){
return new Franc(amount, null);
}
79. Franc times .
Franc times(int multiplier){
return new Franc(amount * multiplier, null);
}
80. times factory .
public class Franc extends Money{
Franc(int amount, String currency){
this.amount = amount;
currency = "CHF";
}
-
8/12/2019 TDD Pactice Material
24/48
Money times(int multiplier){
return Money.franc(amount * multiplier);
}
}
81. Money factory .
static Money franc(int amount){
return new Franc(amount, "CHF");
}
82. Franc currency.
public class Franc extends Money{
Franc(int amount, String currency){
this.amount = amount;
this.currency = currency;
}
Money times(int multiplier){
return Money.franc(amount * multiplier);
}
}
83. Money dollar .
public abstract class Money {
protected int amount;
protected String currency;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
getClass().equals(money.getClass());
-
8/12/2019 TDD Pactice Material
25/48
}
static Money dollar(int amount){
return new Dollar(amount, "USD");
}
static Money franc(int amount){
return new Franc(amount, "CHF");
}
abstract Money times(int multiplier);
String currency(){
return currency;
}
}
84. Dollar Franc .
public class Dollar extends Money{
Dollar(int amount, String currency){
this.amount = amount;
this.currency = currency;
}
Money times(int multiplier){
return Money.dollar(amount * multiplier);
}
}
85. .
86. Money Franc . Money
super .
-
8/12/2019 TDD Pactice Material
26/48
87. Money .
Money(int amount, String currency){
this.amount = amount;this.currency = currency;
}
88. Franc .
public class Franc extends Money{
Franc(int amount, String currency){
super(amount, currency);
}
Money times(int multiplier){
return Money.franc(amount * multiplier);
}
}
89. Dollar .
public class Dollar extends Money{
Dollar(int amount, String currency){
super(amount, currency);
}
Money times(int multiplier){
return Money.dollar(amount * multiplier);
}
}
90. .
91. Franc Dollar times .
-
8/12/2019 TDD Pactice Material
27/48
92. Franc times .
Money times(int multiplier){
return new Franc(amount * multiplier, "CHF");}
93. Dollar times .
Money times(int multiplier){
return new Dollar(amount * multiplier, "USD");
}
94. CHFUSDcurrency .
95. Franc times .
Money times(int multiplier){
return new Franc(amount * multiplier, currency);
}
96. Dollar times .
Money times(int multiplier){
return new Dollar(amount * multiplier, currency);
}
97. times Franc Dollar . Money
.
98. Franc times .
Money times(int multiplier){
return new Money(amount * multiplier, currency);
}
99. . Money abstract . Money
abstract times .
public class Money {
protected int amount;
protected String currency;
-
8/12/2019 TDD Pactice Material
28/48
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
getClass().equals(money.getClass());
}
static Money dollar(int amount){
return new Dollar(amount, "USD");
}
static Money franc(int amount){
return new Franc(amount, "CHF");
}
Money times(int amount){
return null;
}
String currency(){
return currency;
}
Money(int amount, String currency){
this.amount = amount;
this.currency = currency;
}
}
100. . times Money equal
. Franc times Franc
.
Money times(int multiplier){
return new Franc(amount * multiplier, currency);
}
-
8/12/2019 TDD Pactice Material
29/48
101. .
public void testDifferentClassEquality(){
assertTrue(new Money(10, "CHF").equals(newFranc(10, "CHF")));
}
102. . .
103. equals classcurrency.
.
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
currency.equals(money.currency());
}
104. Franc times .
Money times(int multiplier){
return new Money(amount * multiplier, currency);
}
105. Dollar times .
Money times(int multiplier){
return new Money(amount * multiplier, currency);
}
106. times .
107. Money times .
108. times Refactor > Pull up. Dollar Franc times
.
-
8/12/2019 TDD Pactice Material
30/48
109. Money .
public class Money {
protected int amount;
protected String currency;
public boolean equals(Object object) {
Money money = (Money)object;
return amount == money.amount &&
currency.equals(money.currency());
}
-
8/12/2019 TDD Pactice Material
31/48
static Money dollar(int amount){
return new Dollar(amount, "USD");
}
static Money franc(int amount){
return new Franc(amount, "CHF");
}
String currency(){
return currency;
}
Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
Money(int amount, String currency){
this.amount = amount;
this.currency = currency;
}
}
110. .
111. Dollar Franc . Dollar Franc
. Money static .
static Money dollar(int amount){
return new Money(amount, "USD");
}
static Money franc(int amount){
return new Money(amount, "CHF");
}
112. testDifferentClassEquality .
-
8/12/2019 TDD Pactice Material
32/48
113. testEquality 3, 4.
public void testEquality(){
assertTrue(Money.dollar(5).equals(Money.dollar(5)));
assertFalse(Money.dollar(5).equals(Money.dollar(6)));
assertTrue(Money.franc(5).equals(Money.franc(5)));
}
114. Dollar Franc .
115. .
116. 5 5 10.
117. .
public void testSimpleAddition(){
Money sum = Money.dollar(5).plus(Money.dollar(5));
assertEquals(Money.dollar(10), sum);
}
118. Money plus .
Money plus(Money addend){
return new Money(amount + addend.amount, currency);
}
119. .
120. Money Expression Bank .
testSimleAddition .
public void testSimpleAddition(){
Money reduced = bank.reduce(sum, "USD");
assertEquals(Money.dollar(10), reduced);
}
121. Bank .
public void testSimpleAddition(){
-
8/12/2019 TDD Pactice Material
33/48
Bank bank = new Bank();
Money reduced = bank.reduce(sum, "USD");
assertEquals(Money.dollar(10), reduced);
}
122. 5 5Expression.
public void testSimpleAddition(){
Expression sum = five.plus(five);
Bank bank = new Bank();
Money reduced = bank.reduce(sum, "USD");
assertEquals(Money.dollar(10), reduced);
}
123. Money .
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);
}
124. Money Money Expression .
Expression Money. Expression .
New > Interface.
-
8/12/2019 TDD Pactice Material
34/48
125. Expression.
126. Finish.
public interface Expresssion {
-
8/12/2019 TDD Pactice Material
35/48
}
127. Money Expression .
public class Money implements Expression{
128. Moneyplus Expression .
Expression plus(Money addend){
return new Money(amount + addend.amount, currency);
}
129. Bank reduce .
public class Bank {
Money reduce(Expression source, String to){
return null;
}
}
130. reduce.
Money reduce(Expression source, String to){
return Money.dollar(10);
}
131. .
132. Sum. SumExpression.
133. .
public void testPlusReturnSum(){
Money five = Money.dollar(5);
Expression result = five.plus(five);
Sum sum = (Sum)result;
assertEquals(five, sum.augend);
assertEquals(five, sum.addend);
}
-
8/12/2019 TDD Pactice Material
36/48
134. Summoney. .
public class Sum {
Money augend;Money addend;
}
135. Money plus .
Expression plus(Money addend){
return new Sum(this, addend);
}
136. Sum Expression .
public class Sum implements Expression{
Money augend;
Money addend;
}
137. Sum .
public class Sum implements Expression{
Money augend;
Money addend;
Sum(Money augend, Money addend){
this.augend = augend;this.addend = addend;
}
}
138. .
139. .
public void testReduceSum(){
Expression sum = new Sum(Money.dollar(3),
-
8/12/2019 TDD Pactice Material
37/48
Money.dollar(4));
Bank bank = new Bank();
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(7), result);
}
140. Bank reduce .
Money reduce(Expression source, String to){
Sum sum = (Sum) source;
int amount = sum.augend.amount + sum.addend.amount;
return new Money(amount, to);
}
141.
. .
Money reduce(Expression source, String to){
Sum sum = (Sum) source;
return sum.reduce(to);
}
142. Sum reduce .
public class Sum implements Expression{
Money augend;
Money addend;
Sum(Money augend, Money addend){
this.augend = augend;
this.addend = addend;
}
public Money reduce(String to){
int amount = augend.amount + addend.amount;
return new Money(amount, to);
}
-
8/12/2019 TDD Pactice Material
38/48
}
143. .
144. SumMoney reduce.
.
public void testReduceMoney(){
Bank bank = new Bank();
Money result = bank.reduce(Money.dollar(1), "USD");
assertEquals(Money.dollar(1), result);
}
145. Bank reduce .
public class Bank {
Money reduce(Expression source, String to){
if(source instanceof Money) return (Money)source;
Sum sum = (Sum) source;
return sum.reduce(to);
}
}
146. Expression reduce
. Bank reduce .
public class Bank {
Money reduce(Expression source, String to){
if(source instanceof Money)
return (Money)source.reduce(to);
Sum sum = (Sum) source;
return sum.reduce(to);
}
}
-
8/12/2019 TDD Pactice Material
39/48
147. Money reduce .
public Money reduce(String to){
return this;}
148. Expression reduce . Sum Money
reduce .
public interface Expression {
Money reduce(String to);
}
149. Bank reduce .
public class Bank {
Money reduce(Expression source, String to){
return source.reduce(to);
}
}
150. SumMoney reduce
.
151. . bank.
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);
}
152. Money reduce.
public Money reduce(String to){
int rate = (currency.equals("CHF") &&
-
8/12/2019 TDD Pactice Material
40/48
to.equals("USD"))
? 2:1;
return new Money(amount/ rate, to);
}
153. reduce . Bank reduce .
Money reduce(Expression source, String to){
return source.reduce(this, to);
}
154. Expression reduce .
public interface Expression {
Money reduce(Bank bank, String to);
}
155. Sumreduce .
public class Sum implements Expression{
Money augend;
Money addend;
Sum(Money augend, Money addend){
this.augend = augend;
this.addend = addend;
}
public Money reduce(Bank bank, String to){
int amount = augend.amount + addend.amount;
return new Money(amount, to);
}
}
156. Money reduce .
public Money reduce(Bank bank, String to){
int rate = (currency.equals("CHF") &&
-
8/12/2019 TDD Pactice Material
41/48
to.equals("USD"))
? 2:1;
return new Money(amount/ rate, to);
}
157. Bank rate .
public class Bank {
Money reduce(Expression source, String to){
return source.reduce(this, to);
}
int rate(String from, String to){
return (from.equals("CHF")&&to.equals("USD"))
? 2:1;
}
}
158. Money reduce Bank rate.
public Money reduce(Bank bank, String to){
int rate = bank.rate(currency, to);
return new Money(amount/ rate, to);
}
159. . hashtable
.160. Bank inner class.
public class Bank {
Money reduce(Expression source, String to){
return source.reduce(this, to);
}
-
8/12/2019 TDD Pactice Material
42/48
int rate(String from, String to){
return (from.equals("CHF")&&to.equals("USD"))
? 2:1;
}
private class Pair{
private String from;
private String to;
Pair(String from, String to){
this.from = from;
this.to = to;
}
}
}
161. Pair equals .
private 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);
}
-
8/12/2019 TDD Pactice Material
43/48
-
8/12/2019 TDD Pactice Material
44/48
168. 5 10 .
169. .
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);
}
170. Expression Money.
public void testMixedAddition(){
Money fiveBucks = Money.dollar(5);
Money 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);
}
171. .
172. Sum reduce .
public Money reduce(Bank bank, String to){
int amount = augend.reduce(bank, to).amount +
addend.reduce(bank, to).amount;
return new Money(amount, to);
}
173. .
174. Money Expression.
Sum .
-
8/12/2019 TDD Pactice Material
45/48
public class Sum implements Expression{
Expression augend;
Expression addend;
Sum(Expression augend, Expression addend){
this.augend = augend;
this.addend = addend;
}
public Money reduce(Bank bank, String to){
int amount = augend.reduce(bank, to).amount +
addend.reduce(bank, to).amount;
return new Money(amount, to);
}
}
175. Money plus .
Expression plus(Expression addend){
return new Sum(this, addend);
}
176. times .
Expression times(int multiplier) {
return new Money(amount * multiplier, currency);
}
177. testMixedAddition .
public void testMixedAddition(){
Money 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");
-
8/12/2019 TDD Pactice Material
46/48
assertEquals(Money.dollar(10), result);
}
178. .
179. fiveBucksExpression .
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);
}
180. . Expression plus
.
public interface Expression {
Money reduce(Bank bank, String to);Expression plus(Expression addend);
}
181. Money plus . public .
public Expression plus(Expression addend){
return new Sum(this, addend);
}
182. Sum plus .
public Expression plus(Expression addend){
return null;
}
183. .
184. .
public void testSumPlusMoney(){
-
8/12/2019 TDD Pactice Material
47/48
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);
}
185. Sum plus .
public Expression plus(Expression addend){
return new Sum(this, addend);
}
186. .
187. .
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);
}
188. Sum times .
Expression times(int multiplier){
return new Sum(augend.times(multiplier),
addend.times(multiplier));
}
-
8/12/2019 TDD Pactice Material
48/48
189. Expression times .
public interface Expression {
Money reduce(Bank bank, String to);Expression plus(Expression addend);
Expression times(int multiplier);
}
190. Sum times public.
public Expression times(int multiplier){
return new Sum(augend.times(multiplier),
addend.times(multiplier));
}
191. Money times public .
public Expression times(int multiplier) {
return new Money(amount * multiplier, currency);
}
192. .