4
0

PluralFormsCompilerTest.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. declare(strict_types=1);
  3. require_once dirname(__DIR__, 3) . '/cli/i18n/PluralFormsCompiler.php';
  4. final class PluralFormsCompilerTest extends \PHPUnit\Framework\TestCase {
  5. public function testCompileFormulaToLambda(): void {
  6. $compiler = new PluralFormsCompiler();
  7. $compiled = $compiler->compileFormula('nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;');
  8. self::assertSame('nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;', $compiled['formula']);
  9. self::assertSame(3, $compiled['nplurals']);
  10. self::assertSame(
  11. 'static fn (int $n): int => ($n === 1 ? 0 : ($n >= 2 && $n <= 4 ? 1 : 2))',
  12. $compiled['lambda']
  13. );
  14. $lambda = eval('return ' . $compiled['lambda'] . ';');
  15. self::assertInstanceOf(Closure::class, $lambda);
  16. self::assertSame(0, $lambda(1));
  17. self::assertSame(1, $lambda(3));
  18. self::assertSame(2, $lambda(5));
  19. }
  20. public function testCompileFormulaNormalisesPluralFormsComment(): void {
  21. $compiler = new PluralFormsCompiler();
  22. $compiled = $compiler->compileFormula('// Plural-Forms: nplurals=2; plural=(n != 1);');
  23. self::assertSame('nplurals=2; plural=(n != 1);', $compiled['formula']);
  24. self::assertSame('static fn (int $n): int => (($n !== 1) ? 1 : 0)', $compiled['lambda']);
  25. $lambda = eval('return ' . $compiled['lambda'] . ';');
  26. self::assertInstanceOf(Closure::class, $lambda);
  27. self::assertSame(0, $lambda(1));
  28. self::assertSame(1, $lambda(2));
  29. }
  30. public function testCompileFormulaHandlesModuloAndLogicalOperators(): void {
  31. $compiler = new PluralFormsCompiler();
  32. $compiled = $compiler->compileFormula(
  33. 'nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);'
  34. );
  35. $lambda = eval('return ' . $compiled['lambda'] . ';');
  36. self::assertInstanceOf(Closure::class, $lambda);
  37. self::assertSame(0, $lambda(1));
  38. self::assertSame(1, $lambda(2));
  39. self::assertSame(2, $lambda(5));
  40. self::assertSame(2, $lambda(11));
  41. }
  42. public function testCompileFileMigratesLegacyPluralFile(): void {
  43. $compiler = new PluralFormsCompiler();
  44. $tempFile = tempnam(sys_get_temp_dir(), 'plural-forms-');
  45. self::assertNotFalse($tempFile);
  46. try {
  47. file_put_contents($tempFile, <<<'PHP'
  48. <?php
  49. return array(
  50. 'plural-forms' => 'nplurals=2; plural=(n != 1);',
  51. );
  52. PHP);
  53. self::assertTrue($compiler->compileFile($tempFile));
  54. $fileContent = file_get_contents($tempFile);
  55. self::assertIsString($fileContent);
  56. self::assertStringContainsString('// Plural-Forms: nplurals=2; plural=(n != 1);', $fileContent);
  57. $pluralData = include $tempFile;
  58. self::assertIsArray($pluralData);
  59. self::assertSame(2, $pluralData['nplurals']);
  60. self::assertInstanceOf(Closure::class, $pluralData['plural']);
  61. self::assertSame(0, $pluralData['plural'](1));
  62. self::assertSame(1, $pluralData['plural'](2));
  63. } finally {
  64. @unlink($tempFile);
  65. }
  66. }
  67. }