/
MoneyTest.php
120 lines (106 loc) · 3.49 KB
/
MoneyTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
require_once 'Money.php';
require_once 'Bank.php';
require_once 'Sum.php';
/**
* Created by PhpStorm.
* User: patrick.johnmeyer
* Date: 7/6/15
* Time: 10:19 PM
*/
class TestMoney extends PHPUnit_Framework_TestCase
{
public function testMultiplication()
{
$five = Money::dollar(5);
$this->assertEquals(Money::dollar(10), $five->times(2));
$this->assertEquals(Money::dollar(15), $five->times(3));
}
// PHP thankfully gives us member-wise equality for free
public function testEquality()
{
$this->assertEquals(Money::dollar(5), Money::dollar(5));
$this->assertNotEquals(Money::dollar(5), Money::dollar(6));
$this->assertNotEquals(Money::franc(5), Money::dollar(5));
}
public function testCurrency()
{
$this->assertEquals('USD', Money::dollar(1)->currency());
$this->assertEquals('CHF', Money::franc(1)->currency());
}
public function testSimpleAddition()
{
$five = Money::dollar(5);
$sum = $five->plus($five);
$bank = new Bank();
$reduced = $bank->reduce($sum, 'USD');
$this->assertEquals(Money::dollar(10), $reduced);
}
public function testPlusReturnsSum()
{
$five = Money::dollar(5);
$sum = $five->plus($five);
// using assertInstanceOf where the type system handles things in the
// Java examples
$this->assertInstanceOf('Expression', $sum);
$this->assertInstanceOf('Sum', $sum);
$this->assertEquals($five, $sum->augend); // (FWIW I normally use "lhs" and "rhs")
$this->assertEquals($five, $sum->addend);
}
public function testReduceSum()
{
$sum = new Sum(Money::dollar(3), Money::dollar(4));
$bank = new Bank();
$result = $bank->reduce($sum, 'USD');
$this->assertEquals(Money::dollar(7), $result);
}
public function testReduceMoney()
{
$bank = new Bank();
$result = $bank->reduce(Money::dollar(1), 'USD');
$this->assertEquals(Money::dollar(1), $result);
}
public function testReduceMoneyDifferentCurrency()
{
$bank = new Bank();
$bank->addRate('CHF', 'USD', 2);
$result = $bank->reduce(Money::franc(2), 'USD');
$this->assertEquals(Money::dollar(1), $result);
}
public function testIdentity()
{
$bank = new Bank();
$this->assertEquals(1, $bank->rate('USD', 'USD'));
}
public function testMixedAddition()
{
$fiveBucks = Money::dollar(5);
$tenFrancs = Money::franc(10);
$bank = new Bank();
$bank->addRate('CHF', 'USD', 2);
$result = $bank->reduce($fiveBucks->plus($tenFrancs), 'USD');
$this->assertEquals(Money::dollar(10), $result);
}
public function testSumPlusMoney()
{
$fiveBucks = Money::dollar(5);
$tenFrancs = Money::franc(10);
$bank = new Bank();
$bank->addRate('CHF', 'USD', 2);
$step1 = new Sum($fiveBucks, $tenFrancs);
$sum = $step1->plus($fiveBucks);
$result = $bank->reduce($sum, 'USD');
$this->assertEquals(Money::dollar(15), $result);
}
public function testSumTimes()
{
$fiveBucks = Money::dollar(5);
$tenFrancs = Money::franc(10);
$bank = new Bank();
$bank->addRate('CHF', 'USD', 2);
$step1 = new Sum($fiveBucks, $tenFrancs);
$sum = $step1->times(2);
$result = $bank->reduce($sum, 'USD');
$this->assertEquals(Money::dollar(20), $result);
}
}