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

https://github.com/deviantintegral/symfony · PHP · 305 lines · 179 code · 71 blank · 55 comment · 0 complexity · 06741cc9f7a359a3533370680b1a31a3 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\PercentToLocalizedStringTransformer;
  13. use Symfony\Component\Intl\Util\IntlTestHelper;
  14. class PercentToLocalizedStringTransformerTest extends TestCase
  15. {
  16. protected function setUp()
  17. {
  18. parent::setUp();
  19. \Locale::setDefault('en');
  20. }
  21. public function testTransform()
  22. {
  23. $transformer = new PercentToLocalizedStringTransformer();
  24. $this->assertEquals('10', $transformer->transform(0.1));
  25. $this->assertEquals('15', $transformer->transform(0.15));
  26. $this->assertEquals('12', $transformer->transform(0.1234));
  27. $this->assertEquals('200', $transformer->transform(2));
  28. }
  29. public function testTransformEmpty()
  30. {
  31. $transformer = new PercentToLocalizedStringTransformer();
  32. $this->assertEquals('', $transformer->transform(null));
  33. }
  34. public function testTransformWithInteger()
  35. {
  36. $transformer = new PercentToLocalizedStringTransformer(null, 'integer');
  37. $this->assertEquals('0', $transformer->transform(0.1));
  38. $this->assertEquals('1', $transformer->transform(1));
  39. $this->assertEquals('15', $transformer->transform(15));
  40. $this->assertEquals('16', $transformer->transform(15.9));
  41. }
  42. public function testTransformWithScale()
  43. {
  44. // Since we test against "de_AT", we need the full implementation
  45. IntlTestHelper::requireFullIntl($this, false);
  46. \Locale::setDefault('de_AT');
  47. $transformer = new PercentToLocalizedStringTransformer(2);
  48. $this->assertEquals('12,34', $transformer->transform(0.1234));
  49. }
  50. public function testReverseTransform()
  51. {
  52. $transformer = new PercentToLocalizedStringTransformer();
  53. $this->assertEquals(0.1, $transformer->reverseTransform('10'));
  54. $this->assertEquals(0.15, $transformer->reverseTransform('15'));
  55. $this->assertEquals(0.12, $transformer->reverseTransform('12'));
  56. $this->assertEquals(2, $transformer->reverseTransform('200'));
  57. }
  58. public function testReverseTransformEmpty()
  59. {
  60. $transformer = new PercentToLocalizedStringTransformer();
  61. $this->assertNull($transformer->reverseTransform(''));
  62. }
  63. public function testReverseTransformWithInteger()
  64. {
  65. $transformer = new PercentToLocalizedStringTransformer(null, 'integer');
  66. $this->assertEquals(10, $transformer->reverseTransform('10'));
  67. $this->assertEquals(15, $transformer->reverseTransform('15'));
  68. $this->assertEquals(12, $transformer->reverseTransform('12'));
  69. $this->assertEquals(200, $transformer->reverseTransform('200'));
  70. }
  71. public function testReverseTransformWithScale()
  72. {
  73. // Since we test against "de_AT", we need the full implementation
  74. IntlTestHelper::requireFullIntl($this, false);
  75. \Locale::setDefault('de_AT');
  76. $transformer = new PercentToLocalizedStringTransformer(2);
  77. $this->assertEquals(0.1234, $transformer->reverseTransform('12,34'));
  78. }
  79. public function testTransformExpectsNumeric()
  80. {
  81. $transformer = new PercentToLocalizedStringTransformer();
  82. $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Form\Exception\TransformationFailedException');
  83. $transformer->transform('foo');
  84. }
  85. public function testReverseTransformExpectsString()
  86. {
  87. $transformer = new PercentToLocalizedStringTransformer();
  88. $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Form\Exception\TransformationFailedException');
  89. $transformer->reverseTransform(1);
  90. }
  91. public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsNotDot()
  92. {
  93. IntlTestHelper::requireFullIntl($this, '4.8.1.1');
  94. \Locale::setDefault('fr');
  95. $transformer = new PercentToLocalizedStringTransformer(1, 'integer');
  96. // completely valid format
  97. $this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
  98. // accept dots
  99. $this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
  100. // omit group separator
  101. $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
  102. $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
  103. }
  104. /**
  105. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  106. */
  107. public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDot()
  108. {
  109. // Since we test against "de_DE", we need the full implementation
  110. IntlTestHelper::requireFullIntl($this, '4.8.1.1');
  111. \Locale::setDefault('de_DE');
  112. $transformer = new PercentToLocalizedStringTransformer(1, 'integer');
  113. $transformer->reverseTransform('1.234.5');
  114. }
  115. /**
  116. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  117. */
  118. public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDotWithNoGroupSep()
  119. {
  120. // Since we test against "de_DE", we need the full implementation
  121. IntlTestHelper::requireFullIntl($this, '4.8.1.1');
  122. \Locale::setDefault('de_DE');
  123. $transformer = new PercentToLocalizedStringTransformer(1, 'integer');
  124. $transformer->reverseTransform('1234.5');
  125. }
  126. public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsDotButNoGroupingUsed()
  127. {
  128. // Since we test against other locales, we need the full implementation
  129. IntlTestHelper::requireFullIntl($this, false);
  130. \Locale::setDefault('fr');
  131. $transformer = new PercentToLocalizedStringTransformer(1, 'integer');
  132. $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
  133. $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
  134. }
  135. public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsNotComma()
  136. {
  137. // Since we test against other locales, we need the full implementation
  138. IntlTestHelper::requireFullIntl($this, '4.8.1.1');
  139. \Locale::setDefault('bg');
  140. $transformer = new PercentToLocalizedStringTransformer(1, 'integer');
  141. // completely valid format
  142. $this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
  143. // accept commas
  144. $this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
  145. // omit group separator
  146. $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
  147. $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
  148. }
  149. /**
  150. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  151. */
  152. public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsComma()
  153. {
  154. IntlTestHelper::requireFullIntl($this, '4.8.1.1');
  155. $transformer = new PercentToLocalizedStringTransformer(1, 'integer');
  156. $transformer->reverseTransform('1,234,5');
  157. }
  158. /**
  159. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  160. */
  161. public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsCommaWithNoGroupSep()
  162. {
  163. IntlTestHelper::requireFullIntl($this, '4.8.1.1');
  164. $transformer = new PercentToLocalizedStringTransformer(1, 'integer');
  165. $transformer->reverseTransform('1234,5');
  166. }
  167. public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsCommaButNoGroupingUsed()
  168. {
  169. $formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL);
  170. $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, 1);
  171. $formatter->setAttribute(\NumberFormatter::GROUPING_USED, false);
  172. $transformer = $this->getMockBuilder('Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer')
  173. ->setMethods(array('getNumberFormatter'))
  174. ->setConstructorArgs(array(1, 'integer'))
  175. ->getMock();
  176. $transformer->expects($this->any())
  177. ->method('getNumberFormatter')
  178. ->willReturn($formatter);
  179. $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
  180. $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
  181. }
  182. /**
  183. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  184. */
  185. public function testReverseTransformDisallowsLeadingExtraCharacters()
  186. {
  187. $transformer = new PercentToLocalizedStringTransformer();
  188. $transformer->reverseTransform('foo123');
  189. }
  190. /**
  191. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  192. * @expectedExceptionMessage The number contains unrecognized characters: "foo3"
  193. */
  194. public function testReverseTransformDisallowsCenteredExtraCharacters()
  195. {
  196. $transformer = new PercentToLocalizedStringTransformer();
  197. $transformer->reverseTransform('12foo3');
  198. }
  199. /**
  200. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  201. * @expectedExceptionMessage The number contains unrecognized characters: "foo8"
  202. * @requires extension mbstring
  203. */
  204. public function testReverseTransformDisallowsCenteredExtraCharactersMultibyte()
  205. {
  206. // Since we test against other locales, we need the full implementation
  207. IntlTestHelper::requireFullIntl($this, false);
  208. \Locale::setDefault('ru');
  209. $transformer = new PercentToLocalizedStringTransformer();
  210. $transformer->reverseTransform("12\xc2\xa0345,67foo8");
  211. }
  212. /**
  213. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  214. * @expectedExceptionMessage The number contains unrecognized characters: "foo"
  215. */
  216. public function testReverseTransformDisallowsTrailingExtraCharacters()
  217. {
  218. $transformer = new PercentToLocalizedStringTransformer();
  219. $transformer->reverseTransform('123foo');
  220. }
  221. /**
  222. * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
  223. * @expectedExceptionMessage The number contains unrecognized characters: "foo"
  224. * @requires extension mbstring
  225. */
  226. public function testReverseTransformDisallowsTrailingExtraCharactersMultibyte()
  227. {
  228. // Since we test against other locales, we need the full implementation
  229. IntlTestHelper::requireFullIntl($this, false);
  230. \Locale::setDefault('ru');
  231. $transformer = new PercentToLocalizedStringTransformer();
  232. $transformer->reverseTransform("12\xc2\xa0345,678foo");
  233. }
  234. }