1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* PHP Billing Library |
4
|
|
|
* |
5
|
|
|
* @link https://github.com/hiqdev/php-billing |
6
|
|
|
* @package php-billing |
7
|
|
|
* @license BSD-3-Clause |
8
|
|
|
* @copyright Copyright (c) 2017-2020, HiQDev (http://hiqdev.com/) |
9
|
|
|
*/ |
10
|
|
|
|
11
|
|
|
namespace hiqdev\php\billing\tests\unit\formula; |
12
|
|
|
|
13
|
|
|
use Cache\Adapter\PHPArray\ArrayCachePool; |
14
|
|
|
use DateTimeImmutable; |
15
|
|
|
use hiqdev\php\billing\charge\modifiers\addons\MonthPeriod; |
16
|
|
|
use hiqdev\php\billing\charge\modifiers\addons\Reason; |
17
|
|
|
use hiqdev\php\billing\charge\modifiers\addons\Since; |
18
|
|
|
use hiqdev\php\billing\charge\modifiers\FixedDiscount; |
19
|
|
|
use hiqdev\php\billing\charge\modifiers\Installment; |
20
|
|
|
use hiqdev\php\billing\formula\FormulaEngine; |
21
|
|
|
use PHPUnit\Framework\TestCase; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* @author Andrii Vasyliev <[email protected]> |
25
|
|
|
*/ |
26
|
|
|
class FormulaEngineTest extends TestCase |
27
|
|
|
{ |
28
|
|
|
/** |
29
|
|
|
* @var FormulaEngine |
30
|
|
|
*/ |
31
|
|
|
protected $engine; |
32
|
|
|
|
33
|
|
|
public function setUp(): void |
34
|
|
|
{ |
35
|
|
|
$this->engine = new FormulaEngine(new ArrayCachePool()); |
36
|
|
|
} |
37
|
|
|
|
38
|
|
|
public function testSimpleDiscount() |
39
|
|
|
{ |
40
|
|
|
$date = '2018-08-01'; |
41
|
|
|
$rate = '2'; |
42
|
|
|
$reason = 'test reason'; |
43
|
|
|
$formula = $this->engine->build("discount.fixed('$rate%').since('$date').reason('$reason')"); |
44
|
|
|
|
45
|
|
|
$this->assertInstanceOf(FixedDiscount::class, $formula); |
46
|
|
|
$this->assertSame($rate, $formula->getValue()->getValue()); |
47
|
|
|
$this->assertTrue($formula->isRelative()); |
48
|
|
|
$this->assertInstanceOf(Since::class, $formula->getSince()); |
49
|
|
|
$this->assertEquals(new DateTimeImmutable($date), $formula->getSince()->getValue()); |
50
|
|
|
$this->assertInstanceOf(Reason::class, $formula->getReason()); |
51
|
|
|
$this->assertSame($reason, $formula->getReason()->getValue()); |
52
|
|
|
$this->assertNull($formula->getTill()); |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
public function testSimpleInstallment() |
56
|
|
|
{ |
57
|
|
|
$this->checkSimpleInstallment('2024-08-01', 2, 'test reason'); |
58
|
|
|
$this->checkSimpleInstallment('2024-09-01', 3, 'test reason'); |
59
|
|
|
} |
60
|
|
|
|
61
|
|
|
protected function checkSimpleInstallment($date, $num, $reason) |
62
|
|
|
{ |
63
|
|
|
$formula = $this->engine->build("installment.since('$date').lasts('$num months').reason('$reason')"); |
64
|
|
|
|
65
|
|
|
$this->assertInstanceOf(Installment::class, $formula); |
66
|
|
|
$this->assertInstanceOf(MonthPeriod::class, $formula->getTerm()); |
67
|
|
|
$this->assertSame($num, $formula->getTerm()->getValue()); |
68
|
|
|
$this->assertInstanceOf(Since::class, $formula->getSince()); |
69
|
|
|
$this->assertEquals(new DateTimeImmutable($date), $formula->getSince()->getValue()); |
70
|
|
|
$this->assertInstanceOf(Reason::class, $formula->getReason()); |
71
|
|
|
$this->assertSame($reason, $formula->getReason()->getValue()); |
72
|
|
|
$this->assertNull($formula->getTill()); |
73
|
|
|
} |
74
|
|
|
|
75
|
|
|
public function normalizeDataProvider() |
76
|
|
|
{ |
77
|
|
|
return [ |
78
|
|
|
["ab\ncd", "ab\ncd"], |
79
|
|
|
[" ab \n \n cd", "ab\ncd"], |
80
|
|
|
['', null], |
81
|
|
|
[' ', null], |
82
|
|
|
["\n\n\n", null], |
83
|
|
|
['ab', 'ab'], |
84
|
|
|
["ab\ncd", "ab\ncd"], |
85
|
|
|
[true, '1'], |
86
|
|
|
]; |
87
|
|
|
} |
88
|
|
|
|
89
|
|
|
/** |
90
|
|
|
* @dataProvider normalizeDataProvider |
91
|
|
|
*/ |
92
|
|
|
public function testNormalize($formula, $expected) |
93
|
|
|
{ |
94
|
|
|
return $this->assertSame($expected, $this->engine->normalize($formula)); |
|
|
|
|
95
|
|
|
} |
96
|
|
|
|
97
|
|
|
/** |
98
|
|
|
* @dataProvider validateDataProvider |
99
|
|
|
*/ |
100
|
|
|
public function testValidate($formula, $error) |
101
|
|
|
{ |
102
|
|
|
return $this->assertSame($error, $this->engine->validate($formula)); |
|
|
|
|
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
public function validateDataProvider() |
106
|
|
|
{ |
107
|
|
|
return [ |
108
|
|
|
['', "Unexpected token \"EOF\" (EOF) at line 1 and column 1:\n\nā : "], |
109
|
|
|
//['', 'Failed to interpret formula : '], |
110
|
|
|
['true', 'Formula run returned unexpected result : true'], |
111
|
|
|
['discount.fixed("50%")', null], |
112
|
|
|
["discount.fixed(\"50%\")\ndiscount.fixed(\"5 USD\")", null], |
113
|
|
|
]; |
114
|
|
|
} |
115
|
|
|
} |
116
|
|
|
|
This check looks for function or method calls that always return null and whose return value is used.
The method
getObject()
can return nothing but null, so it makes no sense to use the return value.The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.