Passed
Pull Request — master (#5)
by Kauri
02:48
created

RatePerPeriodTest::testGetNumberOfPeriods()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
dl 0
loc 9
rs 9.6666
c 1
b 1
f 0
cc 2
eloc 5
nc 2
nop 3
1
<?php
2
3
namespace Kauri\Loan\Test;
4
5
6
use Kauri\Loan\PaymentPeriods;
7
use Kauri\Loan\Period;
8
use PHPUnit\Framework\TestCase;
9
10
class RatePerPeriodTest extends TestCase
11
{
12
    /**
13
     * @dataProvider expectedRateData
14
     * @param $calculationMode
15
     * @param $calculateFor
16
     * @param $expected
17
     */
18
    public function testGetRatePerPeriod($calculationMode, $calculateFor, $expected)
19
    {
20
        $periods = $this->periodsData();
21
22
        foreach ($periods->getPeriods() as $k => $p) {
23
            $this->assertEquals($expected[$k], $periods->getRatePerPeriod($p, 360, $calculationMode, $calculateFor));
24
        }
25
    }
26
27
    /**
28
     * @dataProvider expectedPeriodsData
29
     * @param $calculationMode
30
     * @param $calculateFor
31
     * @param $expected
32
     */
33
    public function testGetNumberOfPeriods($calculationMode, $calculateFor, $expected)
34
    {
35
        $periods = $this->periodsData();
36
37
        foreach ($periods->getPeriods() as $k => $p) {
38
            $this->assertEquals($k, $p->getSequenceNo());
39
            $this->assertEquals($expected[$k], $periods->getNumberOfPeriods($p, $calculationMode, $calculateFor));
40
        }
41
    }
42
43
    public function expectedRateData()
44
    {
45
        return [
46
            [
47
                PaymentPeriods::CALCULATION_MODE_AVERAGE,
48
                PaymentPeriods::CALCULATE_FOR_PAYMENT,
49
                [1 => 30, 30, 30, 30, 30]
50
            ],
51
            [
52
                PaymentPeriods::CALCULATION_MODE_EXACT_INTEREST,
53
                PaymentPeriods::CALCULATE_FOR_PAYMENT,
54
                [1 => 30, 30, 30, 30, 30]
55
            ],
56
            [PaymentPeriods::CALCULATION_MODE_EXACT, PaymentPeriods::CALCULATE_FOR_PAYMENT, [1 => 31, 29, 31, 30, 31]],
57
            [
58
                PaymentPeriods::CALCULATION_MODE_AVERAGE,
59
                PaymentPeriods::CALCULATE_FOR_INTEREST,
60
                [1 => 30, 30, 30, 30, 30]
61
            ],
62
            [
63
                PaymentPeriods::CALCULATION_MODE_EXACT_INTEREST,
64
                PaymentPeriods::CALCULATE_FOR_INTEREST,
65
                [1 => 31, 29, 31, 30, 31]
66
            ],
67
            [PaymentPeriods::CALCULATION_MODE_EXACT, PaymentPeriods::CALCULATE_FOR_INTEREST, [1 => 31, 29, 31, 30, 31]]
68
        ];
69
    }
70
71
    public function expectedPeriodsData()
72
    {
73
        return [
74
            [PaymentPeriods::CALCULATION_MODE_AVERAGE, PaymentPeriods::CALCULATE_FOR_PAYMENT, [1 => 5, 5, 5, 5, 5]],
75
            [
76
                PaymentPeriods::CALCULATION_MODE_EXACT_INTEREST,
77
                PaymentPeriods::CALCULATE_FOR_PAYMENT,
78
                [1 => 5, 5, 5, 5, 5]
79
            ],
80
            [
81
                PaymentPeriods::CALCULATION_MODE_EXACT,
82
                PaymentPeriods::CALCULATE_FOR_PAYMENT,
83
                [1 => 152 / 31, 152 / 29, 152 / 31, 152 / 30, 152 / 31]
84
            ],
85
            [PaymentPeriods::CALCULATION_MODE_AVERAGE, PaymentPeriods::CALCULATE_FOR_INTEREST, [1 => 5, 5, 5, 5, 5]],
86
            [
87
                PaymentPeriods::CALCULATION_MODE_EXACT_INTEREST,
88
                PaymentPeriods::CALCULATE_FOR_INTEREST,
89
                [1 => 152 / 31, 152 / 29, 152 / 31, 152 / 30, 152 / 31]
90
            ],
91
            [
92
                PaymentPeriods::CALCULATION_MODE_EXACT,
93
                PaymentPeriods::CALCULATE_FOR_INTEREST,
94
                [1 => 152 / 31, 152 / 29, 152 / 31, 152 / 30, 152 / 31]
95
            ]
96
        ];
97
    }
98
99
    private function periodsData()
100
    {
101
        $periods = new PaymentPeriods(30);
102
103
        $dates = array(
104
            ['2016-01-01', '2016-01-31'],
105
            ['2016-02-01', '2016-02-29'],
106
            ['2016-03-01', '2016-03-31'],
107
            ['2016-04-01', '2016-04-30'],
108
            ['2016-05-01', '2016-05-31']
109
        );
110
111
        foreach ($dates as $date) {
112
            $period = new Period(new \DateTime($date[0]), new \DateTime($date[1]));
113
            $periods->add($period);
114
        }
115
116
        return $periods;
117
    }
118
}
119