1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
<?php
declare(strict_types=1);
namespace PhpMyAdmin\MoTranslator\Tests;
use PhpMyAdmin\MoTranslator\Cache\InMemoryCache;
use PhpMyAdmin\MoTranslator\MoParser;
use PhpMyAdmin\MoTranslator\Translator;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use function basename;
use function glob;
use function strpos;
/**
* Test for MO files parsing.
*/
class MoFilesTest extends TestCase
{
#[DataProvider('provideMoFiles')]
public function testMoFileTranslate(string $filename): void
{
$parser = $this->getTranslator($filename);
self::assertSame('Pole', $parser->gettext('Column'));
// Non existing string
self::assertSame('Column parser', $parser->gettext('Column parser'));
}
#[DataProvider('provideMoFiles')]
public function testMoFilePlurals(string $filename): void
{
$parser = $this->getTranslator($filename);
$expected2 = '%d sekundy';
if (strpos($filename, 'invalid-formula.mo') !== false || strpos($filename, 'lessplurals.mo') !== false) {
$expected0 = '%d sekunda';
$expected2 = '%d sekunda';
} elseif (strpos($filename, 'plurals.mo') !== false || strpos($filename, 'noheader.mo') !== false) {
$expected0 = '%d sekundy';
} else {
$expected0 = '%d sekund';
}
self::assertSame($expected0, $parser->ngettext('%d second', '%d seconds', 0));
self::assertSame('%d sekunda', $parser->ngettext('%d second', '%d seconds', 1));
self::assertSame($expected2, $parser->ngettext('%d second', '%d seconds', 2));
self::assertSame($expected0, $parser->ngettext('%d second', '%d seconds', 5));
self::assertSame($expected0, $parser->ngettext('%d second', '%d seconds', 10));
// Non existing string
self::assertSame('"%d" seconds', $parser->ngettext('"%d" second', '"%d" seconds', 10));
}
#[DataProvider('provideMoFiles')]
public function testMoFileContext(string $filename): void
{
$parser = $this->getTranslator($filename);
self::assertSame('Tabulka', $parser->pgettext('Display format', 'Table'));
}
#[DataProvider('provideNotTranslatedFiles')]
public function testMoFileNotTranslated(string $filename): void
{
$parser = $this->getTranslator($filename);
self::assertSame('%d second', $parser->ngettext('%d second', '%d seconds', 1));
}
/**
* @return array[]
*/
public static function provideMoFiles(): array
{
return self::getFiles('./tests/data/*.mo');
}
/**
* @return array[]
*/
public static function provideErrorMoFiles(): array
{
return self::getFiles('./tests/data/error/*.mo');
}
/**
* @return array[]
*/
public static function provideNotTranslatedFiles(): array
{
return self::getFiles('./tests/data/not-translated/*.mo');
}
#[DataProvider('provideErrorMoFiles')]
public function testEmptyMoFile(string $file): void
{
$parser = new MoParser($file);
$translator = new Translator(new InMemoryCache($parser));
if (basename($file) === 'magic.mo') {
self::assertSame(Translator::ERROR_BAD_MAGIC, $parser->error);
} else {
self::assertSame(Translator::ERROR_READING, $parser->error);
}
self::assertSame('Table', $translator->pgettext('Display format', 'Table'));
self::assertSame('"%d" seconds', $translator->ngettext('"%d" second', '"%d" seconds', 10));
}
#[DataProvider('provideMoFiles')]
public function testExists(string $file): void
{
$parser = $this->getTranslator($file);
self::assertTrue($parser->exists('Column'));
self::assertFalse($parser->exists('Column parser'));
}
/**
* @param string $pattern path names pattern to match
*
* @return array[]
*/
private static function getFiles(string $pattern): array
{
$files = glob($pattern);
if ($files === false) {
return [];
}
$result = [];
foreach ($files as $file) {
$result[] = [$file];
}
return $result;
}
private function getTranslator(string $filename): Translator
{
return new Translator(new InMemoryCache(new MoParser($filename)));
}
}
|