assertEquals($expectedResult, CRM_Utils_Rule::integer($inputData)); } /** * @return array */ public function integerDataProvider() { return [ [10, TRUE], ['145E+3', FALSE], ['10', TRUE], [-10, TRUE], ['-10', TRUE], ['-10foo', FALSE], ]; } /** * @dataProvider positiveDataProvider * @param $inputData * @param $expectedResult */ public function testPositive($inputData, $expectedResult) { $this->assertEquals($expectedResult, CRM_Utils_Rule::positiveInteger($inputData)); } /** * @return array */ public function positiveDataProvider() { return [ [10, TRUE], ['145.0E+3', FALSE], ['10', TRUE], [-10, FALSE], ['-10', FALSE], ['-10foo', FALSE], ]; } /** * @dataProvider numericDataProvider * @param $inputData * @param $expectedResult */ public function testNumeric($inputData, $expectedResult) { $this->assertEquals($expectedResult, CRM_Utils_Rule::numeric($inputData)); } /** * @return array */ public function numericDataProvider() { return [ [10, TRUE], ['145.0E+3', FALSE], ['10', TRUE], [-10, TRUE], ['-10', TRUE], ['-10foo', FALSE], ]; } /** * @dataProvider moneyDataProvider * @param $inputData * @param $decimalPoint * @param $thousandSeparator * @param $currency * @param $expectedResult */ public function testMoney($inputData, $decimalPoint, $thousandSeparator, $currency, $expectedResult) { $this->setDefaultCurrency($currency); $this->setMonetaryDecimalPoint($decimalPoint); $this->setMonetaryThousandSeparator($thousandSeparator); $this->assertEquals($expectedResult, CRM_Utils_Rule::money($inputData)); } /** * @return array */ public function moneyDataProvider() { return [ [10, '.', ',', 'USD', TRUE], ['145.0E+3', '.', ',', 'USD', FALSE], ['10', '.', ',', 'USD', TRUE], [-10, '.', ',', 'USD', TRUE], ['-10', '.', ',', 'USD', TRUE], ['-10foo', '.', ',', 'USD', FALSE], ['-10.0345619', '.', ',', 'USD', TRUE], ['-10.010,4345619', '.', ',', 'USD', TRUE], ['10.0104345619', '.', ',', 'USD', TRUE], ['-0', '.', ',', 'USD', TRUE], ['-.1', '.', ',', 'USD', TRUE], ['.1', '.', ',', 'USD', TRUE], // Test currency symbols too, default locale uses $, so if we wanted to test others we'd need to reconfigure locale ['$1,234,567.89', '.', ',', 'USD', TRUE], ['-$1,234,567.89', '.', ',', 'USD', TRUE], ['$-1,234,567.89', '.', ',', 'USD', TRUE], // This is the float format. Encapsulated in strings ['1234567.89', '.', ',', 'USD', TRUE], // This is the float format. [1234567.89, '.', ',', 'USD', TRUE], // Test EURO currency ['€1,234,567.89', '.', ',', 'EUR', TRUE], ['-€1,234,567.89', '.', ',', 'EUR', TRUE], ['€-1,234,567.89', '.', ',', 'EUR', TRUE], // This is the float format. Encapsulated in strings ['1234567.89', '.', ',', 'EUR', TRUE], // This is the float format. [1234567.89, '.', ',', 'EUR', TRUE], // Test Norwegian KR currency ['kr1,234,567.89', '.', ',', 'NOK', TRUE], ['kr 1,234,567.89', '.', ',', 'NOK', TRUE], ['-kr1,234,567.89', '.', ',', 'NOK', TRUE], ['-kr 1,234,567.89', '.', ',', 'NOK', TRUE], ['kr-1,234,567.89', '.', ',', 'NOK', TRUE], ['kr -1,234,567.89', '.', ',', 'NOK', TRUE], // This is the float format. Encapsulated in strings ['1234567.89', '.', ',', 'NOK', TRUE], // This is the float format. [1234567.89, '.', ',', 'NOK', TRUE], // Test different localization options: , as decimal separator and dot as thousand separator ['$1.234.567,89', ',', '.', 'USD', TRUE], ['-$1.234.567,89', ',', '.', 'USD', TRUE], ['$-1.234.567,89', ',', '.', 'USD', TRUE], ['1.234.567,89', ',', '.', 'USD', TRUE], // This is the float format. Encapsulated in strings ['1234567.89', ',', '.', 'USD', TRUE], // This is the float format. [1234567.89, ',', '.', 'USD', TRUE], ['$1,234,567.89', ',', '.', 'USD', FALSE], ['-$1,234,567.89', ',', '.', 'USD', FALSE], ['$-1,234,567.89', ',', '.', 'USD', FALSE], // Now with a space as thousand separator ['$1 234 567,89', ',', ' ', 'USD', TRUE], ['-$1 234 567,89', ',', ' ', 'USD', TRUE], ['$-1 234 567,89', ',', ' ', 'USD', TRUE], ['1 234 567,89', ',', ' ', 'USD', TRUE], // This is the float format. Encapsulated in strings ['1234567.89', ',', ' ', 'USD', TRUE], // This is the float format. [1234567.89, ',', ' ', 'USD', TRUE], ]; } /** * @dataProvider colorDataProvider * @param $inputData * @param $expectedResult */ public function testColor($inputData, $expectedResult) { $this->assertEquals($expectedResult, CRM_Utils_Rule::color($inputData)); } /** * @return array */ public function colorDataProvider() { return [ ['#000000', TRUE], ['#ffffff', TRUE], ['#123456', TRUE], ['#00aaff', TRUE], // Some of these are valid css colors but we reject anything that doesn't conform to the html5 spec for ['#ffffff00', FALSE], ['#fff', FALSE], ['##000000', FALSE], ['ffffff', FALSE], ['red', FALSE], ['#orange', FALSE], ['', FALSE], ['rgb(255, 255, 255)', FALSE], ]; } /** * @return array */ public function extenionKeyTests() { $keys = []; $keys[] = ['org.civicrm.multisite', TRUE]; $keys[] = ['au.org.contribute2016', TRUE]; $keys[] = ['%3Csvg%20onload=alert(0)%3E', FALSE]; return $keys; } /** * @param $key * @param $expectedResult * @dataProvider extenionKeyTests */ public function testExtenionKeyValid($key, $expectedResult) { $this->assertEquals($expectedResult, CRM_Utils_Rule::checkExtensionKeyIsValid($key)); } /** * @return array */ public function alphanumericData() { $expectTrue = [ 0, 999, -5, '', 'foo', '0', '-', '_foo', 'one-two', 'f00', ]; $expectFalse = [ ' ', 5.7, 'one two', 'one.two', 'Aalert('XSS');", '(foo)', 'foo;', '[foo]', ]; $data = []; foreach ($expectTrue as $value) { $data[] = [$value, TRUE]; } foreach ($expectFalse as $value) { $data[] = [$value, FALSE]; } return $data; } /** * @dataProvider alphanumericData * @param $value * @param $expected */ public function testAlphanumeric($value, $expected) { $this->assertEquals($expected, CRM_Utils_Rule::alphanumeric($value)); } }