tdd pactice material

Upload: sam-hwang

Post on 03-Jun-2018

226 views

Category:

Documents


0 download

TRANSCRIPT

  • 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. .