123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Bridge\Twig\Tests\Translation;
- use PHPUnit\Framework\TestCase;
- use Symfony\Bridge\Twig\Extension\TranslationExtension;
- use Symfony\Bridge\Twig\Translation\TwigExtractor;
- use Symfony\Component\Translation\MessageCatalogue;
- use Twig\Environment;
- use Twig\Error\Error;
- use Twig\Loader\ArrayLoader;
- class TwigExtractorTest extends TestCase
- {
- /**
- * @dataProvider getExtractData
- */
- public function testExtract($template, $messages)
- {
- $loader = $this->getMockBuilder('Twig\Loader\LoaderInterface')->getMock();
- $twig = new Environment($loader, array(
- 'strict_variables' => true,
- 'debug' => true,
- 'cache' => false,
- 'autoescape' => false,
- ));
- $twig->addExtension(new TranslationExtension($this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock()));
- $extractor = new TwigExtractor($twig);
- $extractor->setPrefix('prefix');
- $catalogue = new MessageCatalogue('en');
- $m = new \ReflectionMethod($extractor, 'extractTemplate');
- $m->setAccessible(true);
- $m->invoke($extractor, $template, $catalogue);
- foreach ($messages as $key => $domain) {
- $this->assertTrue($catalogue->has($key, $domain));
- $this->assertEquals('prefix'.$key, $catalogue->get($key, $domain));
- }
- }
- public function getExtractData()
- {
- return array(
- array('{{ "new key" | trans() }}', array('new key' => 'messages')),
- array('{{ "new key" | trans() | upper }}', array('new key' => 'messages')),
- array('{{ "new key" | trans({}, "domain") }}', array('new key' => 'domain')),
- array('{{ "new key" | transchoice(1) }}', array('new key' => 'messages')),
- array('{{ "new key" | transchoice(1) | upper }}', array('new key' => 'messages')),
- array('{{ "new key" | transchoice(1, {}, "domain") }}', array('new key' => 'domain')),
- array('{% trans %}new key{% endtrans %}', array('new key' => 'messages')),
- array('{% trans %} new key {% endtrans %}', array('new key' => 'messages')),
- array('{% trans from "domain" %}new key{% endtrans %}', array('new key' => 'domain')),
- array('{% set foo = "new key" | trans %}', array('new key' => 'messages')),
- array('{{ 1 ? "new key" | trans : "another key" | trans }}', array('new key' => 'messages', 'another key' => 'messages')),
- // make sure 'trans_default_domain' tag is supported
- array('{% trans_default_domain "domain" %}{{ "new key"|trans }}', array('new key' => 'domain')),
- array('{% trans_default_domain "domain" %}{{ "new key"|transchoice }}', array('new key' => 'domain')),
- array('{% trans_default_domain "domain" %}{% trans %}new key{% endtrans %}', array('new key' => 'domain')),
- // make sure this works with twig's named arguments
- array('{{ "new key" | trans(domain="domain") }}', array('new key' => 'domain')),
- array('{{ "new key" | transchoice(domain="domain", count=1) }}', array('new key' => 'domain')),
- );
- }
- /**
- * @expectedException \Twig\Error\Error
- * @dataProvider resourcesWithSyntaxErrorsProvider
- */
- public function testExtractSyntaxError($resources)
- {
- $twig = new Environment($this->getMockBuilder('Twig\Loader\LoaderInterface')->getMock());
- $twig->addExtension(new TranslationExtension($this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock()));
- $extractor = new TwigExtractor($twig);
- try {
- $extractor->extract($resources, new MessageCatalogue('en'));
- } catch (Error $e) {
- if (method_exists($e, 'getSourceContext')) {
- $this->assertSame(dirname(__DIR__).strtr('/Fixtures/extractor/syntax_error.twig', '/', DIRECTORY_SEPARATOR), $e->getFile());
- $this->assertSame(1, $e->getLine());
- $this->assertSame('Unclosed "block".', $e->getMessage());
- } else {
- $this->expectExceptionMessageRegExp('/Unclosed "block" in ".*extractor(\\/|\\\\)syntax_error\\.twig" at line 1/');
- }
- throw $e;
- }
- }
- /**
- * @return array
- */
- public function resourcesWithSyntaxErrorsProvider()
- {
- return array(
- array(__DIR__.'/../Fixtures'),
- array(__DIR__.'/../Fixtures/extractor/syntax_error.twig'),
- array(new \SplFileInfo(__DIR__.'/../Fixtures/extractor/syntax_error.twig')),
- );
- }
- /**
- * @dataProvider resourceProvider
- */
- public function testExtractWithFiles($resource)
- {
- $loader = new ArrayLoader(array());
- $twig = new Environment($loader, array(
- 'strict_variables' => true,
- 'debug' => true,
- 'cache' => false,
- 'autoescape' => false,
- ));
- $twig->addExtension(new TranslationExtension($this->getMockBuilder('Symfony\Component\Translation\TranslatorInterface')->getMock()));
- $extractor = new TwigExtractor($twig);
- $catalogue = new MessageCatalogue('en');
- $extractor->extract($resource, $catalogue);
- $this->assertTrue($catalogue->has('Hi!', 'messages'));
- $this->assertEquals('Hi!', $catalogue->get('Hi!', 'messages'));
- }
- /**
- * @return array
- */
- public function resourceProvider()
- {
- $directory = __DIR__.'/../Fixtures/extractor/';
- return array(
- array($directory.'with_translations.html.twig'),
- array(array($directory.'with_translations.html.twig')),
- array(array(new \SplFileInfo($directory.'with_translations.html.twig'))),
- array(new \ArrayObject(array($directory.'with_translations.html.twig'))),
- array(new \ArrayObject(array(new \SplFileInfo($directory.'with_translations.html.twig')))),
- );
- }
- }
|