Commit | Line | Data |
---|---|---|
c10c4749 EL |
1 | <?php |
2 | ||
3 | /** | |
4 | * Class CRM_Utils_RuleTest | |
5 | * @group headless | |
6 | */ | |
7 | class CRM_Utils_MoneyTest extends CiviUnitTestCase { | |
8 | ||
9 | public function setUp() { | |
10 | parent::setUp(); | |
11 | } | |
12 | ||
13 | /** | |
14 | * @dataProvider subtractCurrenciesDataProvider | |
b8b8e604 | 15 | * @param string $leftOp |
16 | * @param string $rightOp | |
17 | * @param string $currency | |
18 | * @param float $expectedResult | |
c10c4749 EL |
19 | */ |
20 | public function testSubtractCurrencies($leftOp, $rightOp, $currency, $expectedResult) { | |
21 | $this->assertEquals($expectedResult, CRM_Utils_Money::subtractCurrencies($leftOp, $rightOp, $currency)); | |
22 | } | |
23 | ||
c16c6ad8 CR |
24 | public function testEquals() { |
25 | $testValue = 0.01; | |
26 | ||
3d5246e2 FW |
27 | for ($i = 0; $i < 10; $i++) { |
28 | $equalValues = CRM_Utils_Money::equals($testValue, $testValue + ($i * 0.0005), 'USD'); | |
29 | $this->assertTrue($equalValues, 'Currency - USD' . $testValue . ' is equal to USD' . ($testValue + ($i * 0.0005))); | |
c16c6ad8 CR |
30 | } |
31 | ||
3d5246e2 | 32 | $this->assertFalse(CRM_Utils_Money::equals($testValue + 0.004, $testValue + 0.006, 'USD'), 'Currency - USD' . ($testValue + 0.004) . ' is different to USD' . ($testValue + 0.006)); |
c16c6ad8 CR |
33 | } |
34 | ||
c10c4749 EL |
35 | /** |
36 | * @return array | |
37 | */ | |
38 | public function subtractCurrenciesDataProvider() { | |
9099cab3 CW |
39 | return [ |
40 | [number_format(300.00, 2), number_format(299.99, 2), 'USD', number_format(0.01, 2)], | |
41 | [2, 1, 'USD', 1], | |
42 | [0, 0, 'USD', 0], | |
43 | [1, 2, 'USD', -1], | |
ca4cfe7a | 44 | [269.565217391, 1, 'USD', 268.57], |
9099cab3 CW |
45 | [number_format(19.99, 2), number_format(20.00, 2), 'USD', number_format(-0.01, 2)], |
46 | ['notanumber', 5.00, 'USD', NULL], | |
47 | ]; | |
c10c4749 EL |
48 | } |
49 | ||
b8b8e604 | 50 | /** |
51 | * Test rounded by currency function. | |
52 | * | |
53 | * In practice this only does rounding to 2 since rounding by any other amount is | |
54 | * only place-holder supported. | |
55 | */ | |
56 | public function testFormatLocaleNumericRoundedByCurrency() { | |
57 | $result = CRM_Utils_Money::formatLocaleNumericRoundedByCurrency(8950.3678, 'NZD'); | |
58 | $this->assertEquals('8,950.37', $result); | |
59 | } | |
60 | ||
61 | /** | |
62 | * Test rounded by currency function. | |
63 | * | |
64 | * This should be formatted according to European standards - . thousand separator | |
65 | * and , for decimal. (The Europeans are wrong but they don't know that. We will forgive them | |
66 | * because ... metric). | |
67 | */ | |
68 | public function testFormatLocaleNumericRoundedByCurrencyEuroThousand() { | |
69 | $this->setCurrencySeparators('.'); | |
70 | $result = CRM_Utils_Money::formatLocaleNumericRoundedByCurrency(8950.3678, 'NZD'); | |
71 | $this->assertEquals('8.950,37', $result); | |
72 | $this->setCurrencySeparators(','); | |
73 | } | |
74 | ||
c9763347 | 75 | /** |
76 | * Test rounded by currency function with specified precision. | |
77 | * | |
78 | * @param string $thousandSeparator | |
79 | * | |
80 | * @dataProvider getThousandSeparators | |
81 | */ | |
82 | public function testFormatLocaleNumericRoundedByPrecision($thousandSeparator) { | |
83 | $this->setCurrencySeparators($thousandSeparator); | |
84 | $result = CRM_Utils_Money::formatLocaleNumericRoundedByPrecision(8950.3678, 3); | |
85 | $expected = ($thousandSeparator === ',') ? '8,950.368' : '8.950,368'; | |
86 | $this->assertEquals($expected, $result); | |
87 | } | |
88 | ||
89 | /** | |
90 | * Test rounded by currency function with specified precision but without padding to reach it. | |
91 | * | |
92 | * @param string $thousandSeparator | |
93 | * | |
94 | * @dataProvider getThousandSeparators | |
95 | */ | |
96 | public function testFormatLocaleNumericRoundedByOptionalPrecision($thousandSeparator) { | |
97 | $this->setCurrencySeparators($thousandSeparator); | |
98 | $result = CRM_Utils_Money::formatLocaleNumericRoundedByOptionalPrecision(8950.3678, 8); | |
99 | $expected = ($thousandSeparator === ',') ? '8,950.3678' : '8.950,3678'; | |
100 | $this->assertEquals($expected, $result); | |
101 | ||
102 | $result = CRM_Utils_Money::formatLocaleNumericRoundedByOptionalPrecision(123456789.987654321, 9); | |
103 | $expected = ($thousandSeparator === ',') ? '123,456,789.98765' : '123.456.789,98765'; | |
104 | $this->assertEquals($result, $expected); | |
105 | } | |
106 | ||
5fb64d51 PF |
107 | /** |
108 | * Test that using the space character as a currency works | |
109 | */ | |
110 | public function testSpaceCurrency() { | |
111 | $this->assertEquals(' 8,950.37', CRM_Utils_Money::format(8950.37, ' ')); | |
112 | } | |
113 | ||
114 | /** | |
115 | * Test that passing an invalid currency throws an error | |
116 | */ | |
117 | public function testInvalidCurrency() { | |
fe5fa054 | 118 | $this->expectException(\CRM_Core_Exception::class, 'Invalid currency "NOT_A_CURRENCY"'); |
5fb64d51 PF |
119 | CRM_Utils_Money::format(4.00, 'NOT_A_CURRENCY'); |
120 | } | |
121 | ||
c10c4749 | 122 | } |