* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Translation\Tests\Extractor; use PHPUnit\Framework\TestCase; use Symfony\Component\Translation\Extractor\PhpExtractor; use Symfony\Component\Translation\MessageCatalogue; class PhpExtractorTest extends TestCase { /** * @dataProvider resourcesProvider * * @param array|string $resource */ public function testExtraction($resource) { // Arrange $extractor = new PhpExtractor(); $extractor->setPrefix('prefix'); $catalogue = new MessageCatalogue('en'); // Act $extractor->extract($resource, $catalogue); $expectedHeredoc = << [ 'single-quoted key' => 'prefixsingle-quoted key', 'double-quoted key' => 'prefixdouble-quoted key', 'heredoc key' => 'prefixheredoc key', 'nowdoc key' => 'prefixnowdoc key', "double-quoted key with whitespace and escaped \$\n\" sequences" => "prefixdouble-quoted key with whitespace and escaped \$\n\" sequences", 'single-quoted key with whitespace and nonescaped \$\n\' sequences' => 'prefixsingle-quoted key with whitespace and nonescaped \$\n\' sequences', 'single-quoted key with "quote mark at the end"' => 'prefixsingle-quoted key with "quote mark at the end"', $expectedHeredoc => 'prefix'.$expectedHeredoc, $expectedNowdoc => 'prefix'.$expectedNowdoc, '{0} There is no apples|{1} There is one apple|]1,Inf[ There are %count% apples' => 'prefix{0} There is no apples|{1} There is one apple|]1,Inf[ There are %count% apples', 'concatenated message with heredoc and nowdoc' => 'prefixconcatenated message with heredoc and nowdoc', 'default domain' => 'prefixdefault domain', ], 'not_messages' => [ 'other-domain-test-no-params-short-array' => 'prefixother-domain-test-no-params-short-array', 'other-domain-test-no-params-long-array' => 'prefixother-domain-test-no-params-long-array', 'other-domain-test-params-short-array' => 'prefixother-domain-test-params-short-array', 'other-domain-test-params-long-array' => 'prefixother-domain-test-params-long-array', 'other-domain-test-trans-choice-short-array-%count%' => 'prefixother-domain-test-trans-choice-short-array-%count%', 'other-domain-test-trans-choice-long-array-%count%' => 'prefixother-domain-test-trans-choice-long-array-%count%', 'typecast' => 'prefixtypecast', 'msg1' => 'prefixmsg1', 'msg2' => 'prefixmsg2', ], ]; $actualCatalogue = $catalogue->all(); $this->assertEquals($expectedCatalogue, $actualCatalogue); $filename = str_replace(\DIRECTORY_SEPARATOR, '/', __DIR__).'/../fixtures/extractor/translation.html.php'; $this->assertEquals(['sources' => [$filename.':2']], $catalogue->getMetadata('single-quoted key')); $this->assertEquals(['sources' => [$filename.':43']], $catalogue->getMetadata('other-domain-test-no-params-short-array', 'not_messages')); } public function resourcesProvider() { $directory = __DIR__.'/../fixtures/extractor/'; $splFiles = []; foreach (new \DirectoryIterator($directory) as $fileInfo) { if ($fileInfo->isDot()) { continue; } if ('translation.html.php' === $fileInfo->getBasename()) { $phpFile = $fileInfo->getPathname(); } $splFiles[] = $fileInfo->getFileInfo(); } return [ [$directory], [$phpFile], [glob($directory.'*')], [$splFiles], [new \ArrayObject(glob($directory.'*'))], [new \ArrayObject($splFiles)], ]; } }