Passed
Push — master ( c30421...54de7b )
by Kauri
53s
created

PaymentPeriodsTest::testRatePerPeriodException()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
3
namespace Kauri\Loan\Test;
4
5
6
use Kauri\Loan\PaymentPeriods;
7
use Kauri\Loan\PaymentPeriodsInterface;
8
use Kauri\Loan\Period;
9
use Kauri\Loan\PeriodInterface;
10
use PHPUnit\Framework\TestCase;
11
12
13
class PaymentPeriodsTest extends TestCase
14
{
15
    /**
16
     * @dataProvider periodsData
17
     * @param $averagePeriodLength
18
     * @param $paymentPeriods
19
     */
20
    public function testPaymentPeriods($averagePeriodLength, $paymentPeriods)
21
    {
22
        $periodsCollection = new PaymentPeriods($averagePeriodLength);
23
        $noOfPayments = count($paymentPeriods);
24
25
        $this->assertEquals(0, $periodsCollection->getNoOfPeriods());
26
        $this->assertTrue(empty($periodsCollection->getPeriods()));
27
28
        foreach ($paymentPeriods as $periodLength) {
29
            $periodMock = $this->getMockPeriod($periodLength);
30
            $periodsCollection->add($periodMock);
31
        }
32
33
        $this->assertEquals($noOfPayments, $periodsCollection->getNoOfPeriods());
34
        $this->assertTrue(!empty($periodsCollection->getPeriods()));
35
36
        foreach ($periodsCollection->getPeriodsLengths(PaymentPeriodsInterface::CALCULATION_MODE_AVERAGE) as $k => $periodLength) {
37
            $this->assertEquals($averagePeriodLength, $periodLength);
38
        }
39
40
        foreach ($periodsCollection->getPeriodsLengths(PaymentPeriodsInterface::CALCULATION_MODE_EXACT) as $k => $periodLength) {
41
            $this->assertEquals($paymentPeriods[$k], $periodLength);
42
        }
43
    }
44
45
    /**
46
     * @dataProvider periodsData
47
     * @param int $averagePeriodLength
48
     * @param array $paymentPeriods
49
     */
50
    public function testPeriod(int $averagePeriodLength, array $paymentPeriods)
51
    {
52
        $periodsCollection = new PaymentPeriods($averagePeriodLength);
53
54
        foreach ($paymentPeriods as $periodLength) {
55
            $periodMock = $this->getMockPeriod($periodLength);
56
            $periodsCollection->add($periodMock);
57
        }
58
59
        $periods = $periodsCollection->getPeriods();
60
61
        /** @var PeriodInterface $period */
62
        foreach ($periods as $period) {
63
            $this->assertEquals($paymentPeriods[$period->getSequenceNo()], $period->getLength());
64
        }
65
    }
66
67
    public function periodsData()
68
    {
69
        return [
70
            [7, [1 => 6, 5, 3, 9]],
71
            [30, [1 => 29, 30, 31, 30, 28]]
72
        ];
73
    }
74
75
    /**
76
     * @param $length
77
     * @return PeriodInterface
78
     */
79
    private function getMockPeriod($length)
80
    {
81
        $stub = $this->getMockBuilder(Period::class)
82
            ->disableOriginalConstructor()
83
            ->setMethods(['getLength'])
84
            ->getMock();
85
86
        $stub->method('getLength')
87
            ->willReturn($length);
88
89
        return $stub;
90
    }
91
92
}
93