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