PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformerTest.php

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