/tests/Intl/Normalizer/NormalizerTest.php

https://github.com/symfony/polyfill · PHP · 153 lines · 104 code · 26 blank · 23 comment · 5 complexity · a1161f6da66298468922c22917f49482 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\Polyfill\Tests\Intl\Normalizer;
  11. use Normalizer as in;
  12. use PHPUnit\Framework\TestCase;
  13. use Symfony\Polyfill\Intl\Normalizer\Normalizer as pn;
  14. /**
  15. * @author Nicolas Grekas <p@tchwork.com>
  16. *
  17. * @covers \Symfony\Polyfill\Intl\Normalizer\Normalizer::<!public>
  18. * @requires extension intl
  19. */
  20. class NormalizerTest extends TestCase
  21. {
  22. public function testConstants()
  23. {
  24. $rpn = new \ReflectionClass('Symfony\Polyfill\Intl\Normalizer\Normalizer');
  25. $rin = new \ReflectionClass('Normalizer');
  26. $rpn = $rpn->getConstants();
  27. $rin = $rin->getConstants();
  28. unset($rin['NONE'], $rin['FORM_KC_CF'], $rin['NFKC_CF']);
  29. ksort($rpn);
  30. ksort($rin);
  31. $this->assertSame($rin, $rpn);
  32. }
  33. /**
  34. * @covers \Symfony\Polyfill\Intl\Normalizer\Normalizer::isNormalized
  35. */
  36. public function testIsNormalized()
  37. {
  38. $c = 'déjà';
  39. $d = in::normalize($c, pn::NFD);
  40. $this->assertTrue(normalizer_is_normalized(''));
  41. $this->assertTrue(normalizer_is_normalized('abc'));
  42. $this->assertTrue(normalizer_is_normalized($c));
  43. $this->assertTrue(normalizer_is_normalized($c, pn::NFC));
  44. $this->assertFalse(normalizer_is_normalized($c, pn::NFD));
  45. $this->assertFalse(normalizer_is_normalized($d, pn::NFC));
  46. $this->assertFalse(normalizer_is_normalized("\xFF"));
  47. $this->assertTrue(pn::isNormalized($d, pn::NFD));
  48. $this->assertFalse(pn::isNormalized('', 42));
  49. }
  50. /**
  51. * @covers \Symfony\Polyfill\Intl\Normalizer\Normalizer::normalize
  52. */
  53. public function testNormalize()
  54. {
  55. $c = in::normalize('déjà', pn::NFC).in::normalize('훈쇼™', pn::NFD);
  56. if (\PHP_VERSION_ID < 70300) {
  57. $this->assertSame($c, normalizer_normalize($c, \Normalizer::NONE));
  58. }
  59. $c = 'déjà 훈쇼™';
  60. $d = in::normalize($c, pn::NFD);
  61. $kc = in::normalize($c, pn::NFKC);
  62. $kd = in::normalize($c, pn::NFKD);
  63. $this->assertSame('', normalizer_normalize(''));
  64. $this->assertSame($c, normalizer_normalize($d));
  65. $this->assertSame($c, normalizer_normalize($d, pn::NFC));
  66. $this->assertSame($d, normalizer_normalize($c, pn::NFD));
  67. $this->assertSame($kc, normalizer_normalize($d, pn::NFKC));
  68. $this->assertSame($kd, normalizer_normalize($c, pn::NFKD));
  69. $this->assertFalse(normalizer_normalize($c, -1));
  70. $this->assertFalse(normalizer_normalize("\xFF"));
  71. $this->assertSame("\xcc\x83\xc3\x92\xd5\x9b", normalizer_normalize("\xcc\x83\xc3\x92\xd5\x9b"));
  72. $this->assertSame("\xe0\xbe\xb2\xe0\xbd\xb1\xe0\xbe\x80\xe0\xbe\x80", normalizer_normalize("\xe0\xbd\xb6\xe0\xbe\x81", pn::NFD));
  73. }
  74. /**
  75. * @covers \Symfony\Polyfill\Intl\Normalizer\Normalizer::normalize
  76. */
  77. public function testNormalizeConformance()
  78. {
  79. $t = file(__DIR__.'/NormalizationTest.txt');
  80. $c = array();
  81. foreach ($t as $s) {
  82. $t = explode('#', $s);
  83. $t = explode(';', $t[0]);
  84. if (6 === \count($t)) {
  85. foreach ($t as $k => $s) {
  86. $t = explode(' ', $s);
  87. $t = array_map('hexdec', $t);
  88. $t = array_map(__CLASS__.'::chr', $t);
  89. $c[$k] = implode('', $t);
  90. }
  91. $this->assertSame($c[1], normalizer_normalize($c[0], pn::NFC));
  92. $this->assertSame($c[1], normalizer_normalize($c[1], pn::NFC));
  93. $this->assertSame($c[1], normalizer_normalize($c[2], pn::NFC));
  94. $this->assertSame($c[3], normalizer_normalize($c[3], pn::NFC));
  95. $this->assertSame($c[3], normalizer_normalize($c[4], pn::NFC));
  96. $this->assertSame($c[2], normalizer_normalize($c[0], pn::NFD));
  97. $this->assertSame($c[2], normalizer_normalize($c[1], pn::NFD));
  98. $this->assertSame($c[2], normalizer_normalize($c[2], pn::NFD));
  99. $this->assertSame($c[4], normalizer_normalize($c[3], pn::NFD));
  100. $this->assertSame($c[4], normalizer_normalize($c[4], pn::NFD));
  101. $this->assertSame($c[3], normalizer_normalize($c[0], pn::NFKC));
  102. $this->assertSame($c[3], normalizer_normalize($c[1], pn::NFKC));
  103. $this->assertSame($c[3], normalizer_normalize($c[2], pn::NFKC));
  104. $this->assertSame($c[3], normalizer_normalize($c[3], pn::NFKC));
  105. $this->assertSame($c[3], normalizer_normalize($c[4], pn::NFKC));
  106. $this->assertSame($c[4], normalizer_normalize($c[0], pn::NFKD));
  107. $this->assertSame($c[4], normalizer_normalize($c[1], pn::NFKD));
  108. $this->assertSame($c[4], normalizer_normalize($c[2], pn::NFKD));
  109. $this->assertSame($c[4], normalizer_normalize($c[3], pn::NFKD));
  110. $this->assertSame($c[4], normalizer_normalize($c[4], pn::NFKD));
  111. }
  112. }
  113. }
  114. private static function chr($c)
  115. {
  116. if (0x80 > $c %= 0x200000) {
  117. return \chr($c);
  118. }
  119. if (0x800 > $c) {
  120. return \chr(0xC0 | $c >> 6).\chr(0x80 | $c & 0x3F);
  121. }
  122. if (0x10000 > $c) {
  123. return \chr(0xE0 | $c >> 12).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
  124. }
  125. return \chr(0xF0 | $c >> 18).\chr(0x80 | $c >> 12 & 0x3F).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
  126. }
  127. }