1<?php 2 3/* 4 * This file is part of the Symfony package. 5 * 6 * (c) Fabien Potencier <fabien@symfony.com> 7 * 8 * For the full copyright and license information, please view the LICENSE 9 * file that was distributed with this source code. 10 */ 11 12namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer; 13 14use PHPUnit\Framework\TestCase; 15use Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStringTransformer; 16use Symfony\Component\Intl\Util\IntlTestHelper; 17 18class IntegerToLocalizedStringTransformerTest extends TestCase 19{ 20 private $defaultLocale; 21 22 protected function setUp() 23 { 24 $this->defaultLocale = \Locale::getDefault(); 25 \Locale::setDefault('en'); 26 } 27 28 protected function tearDown() 29 { 30 \Locale::setDefault($this->defaultLocale); 31 } 32 33 public function transformWithRoundingProvider() 34 { 35 return [ 36 // towards positive infinity (1.6 -> 2, -1.6 -> -1) 37 [1234.5, '1235', IntegerToLocalizedStringTransformer::ROUND_CEILING], 38 [1234.4, '1235', IntegerToLocalizedStringTransformer::ROUND_CEILING], 39 [-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_CEILING], 40 [-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_CEILING], 41 // towards negative infinity (1.6 -> 1, -1.6 -> -2) 42 [1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_FLOOR], 43 [1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_FLOOR], 44 [-1234.5, '-1235', IntegerToLocalizedStringTransformer::ROUND_FLOOR], 45 [-1234.4, '-1235', IntegerToLocalizedStringTransformer::ROUND_FLOOR], 46 // away from zero (1.6 -> 2, -1.6 -> 2) 47 [1234.5, '1235', IntegerToLocalizedStringTransformer::ROUND_UP], 48 [1234.4, '1235', IntegerToLocalizedStringTransformer::ROUND_UP], 49 [-1234.5, '-1235', IntegerToLocalizedStringTransformer::ROUND_UP], 50 [-1234.4, '-1235', IntegerToLocalizedStringTransformer::ROUND_UP], 51 // towards zero (1.6 -> 1, -1.6 -> -1) 52 [1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_DOWN], 53 [1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_DOWN], 54 [-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_DOWN], 55 [-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_DOWN], 56 // round halves (.5) to the next even number 57 [1234.6, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 58 [1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 59 [1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 60 [1233.5, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 61 [1232.5, '1232', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 62 [-1234.6, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 63 [-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 64 [-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 65 [-1233.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 66 [-1232.5, '-1232', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 67 // round halves (.5) away from zero 68 [1234.6, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 69 [1234.5, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 70 [1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 71 [-1234.6, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 72 [-1234.5, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 73 [-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 74 // round halves (.5) towards zero 75 [1234.6, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 76 [1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 77 [1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 78 [-1234.6, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 79 [-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 80 [-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 81 ]; 82 } 83 84 /** 85 * @dataProvider transformWithRoundingProvider 86 */ 87 public function testTransformWithRounding($input, $output, $roundingMode) 88 { 89 $transformer = new IntegerToLocalizedStringTransformer(null, null, $roundingMode); 90 91 $this->assertEquals($output, $transformer->transform($input)); 92 } 93 94 public function testReverseTransform() 95 { 96 // Since we test against "de_AT", we need the full implementation 97 IntlTestHelper::requireFullIntl($this, false); 98 99 \Locale::setDefault('de_AT'); 100 101 $transformer = new IntegerToLocalizedStringTransformer(); 102 103 $this->assertEquals(1, $transformer->reverseTransform('1')); 104 $this->assertEquals(12345, $transformer->reverseTransform('12345')); 105 } 106 107 public function testReverseTransformEmpty() 108 { 109 $transformer = new IntegerToLocalizedStringTransformer(); 110 111 $this->assertNull($transformer->reverseTransform('')); 112 } 113 114 public function testReverseTransformWithGrouping() 115 { 116 // Since we test against "de_DE", we need the full implementation 117 IntlTestHelper::requireFullIntl($this, false); 118 119 \Locale::setDefault('de_DE'); 120 121 $transformer = new IntegerToLocalizedStringTransformer(null, true); 122 123 $this->assertEquals(1234, $transformer->reverseTransform('1.234')); 124 $this->assertEquals(12345, $transformer->reverseTransform('12.345')); 125 $this->assertEquals(1234, $transformer->reverseTransform('1234')); 126 $this->assertEquals(12345, $transformer->reverseTransform('12345')); 127 } 128 129 public function reverseTransformWithRoundingProvider() 130 { 131 return [ 132 // towards positive infinity (1.6 -> 2, -1.6 -> -1) 133 ['1234,5', 1235, IntegerToLocalizedStringTransformer::ROUND_CEILING], 134 ['1234,4', 1235, IntegerToLocalizedStringTransformer::ROUND_CEILING], 135 ['-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_CEILING], 136 ['-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_CEILING], 137 // towards negative infinity (1.6 -> 1, -1.6 -> -2) 138 ['1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_FLOOR], 139 ['1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_FLOOR], 140 ['-1234,5', -1235, IntegerToLocalizedStringTransformer::ROUND_FLOOR], 141 ['-1234,4', -1235, IntegerToLocalizedStringTransformer::ROUND_FLOOR], 142 // away from zero (1.6 -> 2, -1.6 -> 2) 143 ['1234,5', 1235, IntegerToLocalizedStringTransformer::ROUND_UP], 144 ['1234,4', 1235, IntegerToLocalizedStringTransformer::ROUND_UP], 145 ['-1234,5', -1235, IntegerToLocalizedStringTransformer::ROUND_UP], 146 ['-1234,4', -1235, IntegerToLocalizedStringTransformer::ROUND_UP], 147 // towards zero (1.6 -> 1, -1.6 -> -1) 148 ['1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_DOWN], 149 ['1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_DOWN], 150 ['-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_DOWN], 151 ['-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_DOWN], 152 // round halves (.5) to the next even number 153 ['1234,6', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 154 ['1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 155 ['1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 156 ['1233,5', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 157 ['1232,5', 1232, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 158 ['-1234,6', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 159 ['-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 160 ['-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 161 ['-1233,5', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 162 ['-1232,5', -1232, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN], 163 // round halves (.5) away from zero 164 ['1234,6', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 165 ['1234,5', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 166 ['1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 167 ['-1234,6', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 168 ['-1234,5', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 169 ['-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_UP], 170 // round halves (.5) towards zero 171 ['1234,6', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 172 ['1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 173 ['1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 174 ['-1234,6', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 175 ['-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 176 ['-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN], 177 ]; 178 } 179 180 /** 181 * @dataProvider reverseTransformWithRoundingProvider 182 */ 183 public function testReverseTransformWithRounding($input, $output, $roundingMode) 184 { 185 $transformer = new IntegerToLocalizedStringTransformer(null, null, $roundingMode); 186 187 $this->assertEquals($output, $transformer->reverseTransform($input)); 188 } 189 190 public function testReverseTransformExpectsString() 191 { 192 $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); 193 $transformer = new IntegerToLocalizedStringTransformer(); 194 195 $transformer->reverseTransform(1); 196 } 197 198 public function testReverseTransformExpectsValidNumber() 199 { 200 $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); 201 $transformer = new IntegerToLocalizedStringTransformer(); 202 203 $transformer->reverseTransform('foo'); 204 } 205 206 /** 207 * @dataProvider floatNumberProvider 208 */ 209 public function testReverseTransformExpectsInteger($number, $locale) 210 { 211 $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); 212 IntlTestHelper::requireFullIntl($this, false); 213 214 \Locale::setDefault($locale); 215 216 $transformer = new IntegerToLocalizedStringTransformer(); 217 218 $transformer->reverseTransform($number); 219 } 220 221 public function floatNumberProvider() 222 { 223 return [ 224 ['12345.912', 'en'], 225 ['1.234,5', 'de_DE'], 226 ]; 227 } 228 229 public function testReverseTransformDisallowsNaN() 230 { 231 $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); 232 $transformer = new IntegerToLocalizedStringTransformer(); 233 234 $transformer->reverseTransform('NaN'); 235 } 236 237 public function testReverseTransformDisallowsNaN2() 238 { 239 $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); 240 $transformer = new IntegerToLocalizedStringTransformer(); 241 242 $transformer->reverseTransform('nan'); 243 } 244 245 public function testReverseTransformDisallowsInfinity() 246 { 247 $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); 248 $transformer = new IntegerToLocalizedStringTransformer(); 249 250 $transformer->reverseTransform('∞'); 251 } 252 253 public function testReverseTransformDisallowsNegativeInfinity() 254 { 255 $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); 256 $transformer = new IntegerToLocalizedStringTransformer(); 257 258 $transformer->reverseTransform('-∞'); 259 } 260} 261