PaymentPeriodsFactoryTest   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 76
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 5

Importance

Changes 0
Metric Value
wmc 3
lcom 0
cbo 5
dl 0
loc 76
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
B datesProvider() 0 32 1
B testSomething() 0 29 2
1
<?php
2
3
namespace Kauri\Loan\Test;
4
5
6
use Kauri\Loan\PaymentPeriodsFactory;
7
use Kauri\Loan\PaymentScheduleConfig;
8
use Kauri\Loan\PaymentScheduleFactory;
9
use Kauri\Loan\PeriodInterface;
10
use PHPUnit\Framework\TestCase;
11
12
13
class PaymentPeriodsFactoryTest extends TestCase
14
{
15
    /**
16
     * @dataProvider datesProvider
17
     * @param $noOfPayments
18
     * @param \DateTime $startDate
19
     * @param $dateIntervalPattern
20
     * @param array $endDates
21
     * @param array $startDates
22
     * @param array $expectedPeriodsLengthsExact
23
     * @param array $expectedPeriodsLengthsAverage
24
     */
25
    public function testSomething(
26
        $noOfPayments,
27
        \DateTime $startDate,
28
        $dateIntervalPattern,
29
        array $endDates,
30
        array $startDates,
31
        array $expectedPeriodsLengthsExact,
32
        array $expectedPeriodsLengthsAverage
33
    ) {
34
        $config = new PaymentScheduleConfig($noOfPayments, $startDate, $dateIntervalPattern);
35
        $schedule = PaymentScheduleFactory::generate($config);
36
        $paymentPeriods = PaymentPeriodsFactory::generate($schedule);
37
38
        /**
39
         * @var  $no
40
         * @var PeriodInterface $period
41
         */
42
        foreach ($paymentPeriods->getPeriods() as $no => $period) {
43
            $this->assertEquals($period->getEnd()->format('Y-m-d'), $endDates[$no]);
44
            $this->assertEquals($period->getStart()->format('Y-m-d'), $startDates[$no]);
45
            $this->assertEquals($no, $period->getSequenceNo());
46
47
            $this->assertEquals($expectedPeriodsLengthsExact[$no], $period->getLength($period::LENGTH_MODE_EXACT));
48
            $this->assertEquals($expectedPeriodsLengthsExact[$no], $period->getExactLength());
49
50
            $this->assertEquals($expectedPeriodsLengthsAverage[$no], $period->getLength($period::LENGTH_MODE_AVG));
51
            $this->assertEquals($expectedPeriodsLengthsAverage[$no], $period->getAvgLength());
52
        }
53
    }
54
55
    public function datesProvider()
56
    {
57
        return [
58
            'P1D' => [
59
                3,
60
                new \DateTime('2000-01-01'),
61
                'P1D',
62
                [1 => "2000-01-02", "2000-01-03", "2000-01-04"],
63
                [1 => "2000-01-02", "2000-01-03", "2000-01-04"],
64
                [1 => 1, 1, 1],
65
                [1 => 1, 1, 1]
66
            ],
67
            'P3D' => [
68
                3,
69
                new \DateTime('2000-01-01'),
70
                'P3D',
71
                [1 => "2000-01-04", "2000-01-07", "2000-01-10"],
72
                [1 => "2000-01-02", "2000-01-05", "2000-01-08"],
73
                [1 => 3, 3, 3],
74
                [1 => 3, 3, 3]
75
            ],
76
            'P1M' => [
77
                3,
78
                new \DateTime('2000-01-01'),
79
                'P1M',
80
                [1 => "2000-02-01", "2000-03-01", "2000-04-01"],
81
                [1 => "2000-01-02", "2000-02-02", "2000-03-02"],
82
                [1 => 31, 29, 31],
83
                [1 => 30, 30, 30]
84
            ],
85
        ];
86
    }
87
88
}
89