Merge pull request #18554 from civicrm/5.30
[civicrm-core.git] / tests / phpunit / CRM / Utils / MoneyTest.php
CommitLineData
c10c4749
EL
1<?php
2
3/**
4 * Class CRM_Utils_RuleTest
5 * @group headless
6 */
7class 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}