package fr.adrienbrault.idea.symfony2plugin.tests.form; import com.intellij.patterns.PlatformPatterns; import com.jetbrains.php.lang.PhpFileType; import com.jetbrains.php.lang.psi.elements.PhpClass; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; import java.io.File; /** * @author Daniel Espendiller <daniel@espendiller.net> * * @see fr.adrienbrault.idea.symfony2plugin.form.FormGotoCompletionRegistrar */ public class FormGotoCompletionRegistrarTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject("classes.php"); myFixture.copyFileToProject("foo.de.xlf"); myFixture.copyFileToProject("messages.de.yml", "Resources/translations/messages.de.yml"); myFixture.copyFileToProject("foo.de.yml", "Resources/translations/foo.de.yml"); myFixture.copyFileToProject("FormOptionGotoCompletionRegistrar.php"); } protected String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } public void testFormTypeCompletion() { for (String clazz : new String[] {"Symfony\\Component\\Form\\FormBuilderInterface", "Symfony\\Component\\Form\\FormInterface"}) { for (String method : new String[]{"add", "create"}) { assertCompletionContains(PhpFileType.INSTANCE, "<?php\n" + String.format("/** @var $builder \\%s */\n", clazz) + String.format("$builder->%s('foo', '<caret>');", method), "foo_type" ); assertNavigationMatch(PhpFileType.INSTANCE, "<?php\n" + String.format("/** @var $builder \\%s */\n", clazz) + String.format("$builder->%s('foo', 'foo_type<caret>');", method), PlatformPatterns.psiElement(PhpClass.class).withName("Foo") ); } } } public void testFormOptionTranslationDomain() { for (String clazz : new String[] {"Symfony\\Component\\Form\\FormBuilderInterface", "Symfony\\Component\\Form\\FormInterface"}) { for (String method : new String[] {"add", "create"}) { assertCompletionContains(PhpFileType.INSTANCE, "<?php\n" + String.format("/** @var $builder \\%s */\n", clazz) + String.format("$builder->%s('foo', null, [\n", method) + " 'choice_translation_domain' => '<caret>'\n" + "]);", "foo" ); assertCompletionContains(PhpFileType.INSTANCE, "<?php\n" + String.format("/** @var $builder \\%s */\n", clazz) + String.format("$builder->%s('foo', null, [\n", method) + " 'translation_domain' => '<caret>'\n" + "]);", "foo" ); assertNavigationMatch(PhpFileType.INSTANCE, "<?php\n" + String.format("/** @var $builder \\%s */\n", clazz) + String.format("$builder->%s('foo', null, [\n", method) + " 'choice_translation_domain' => 'fo<caret>o'\n" + "]);", PlatformPatterns.psiFile().withName("foo.de.xlf") ); assertNavigationMatch(PhpFileType.INSTANCE, "<?php\n" + String.format("/** @var $builder \\%s */\n", clazz) + String.format("$builder->%s('foo', null, [\n", method) + " 'translation_domain' => 'fo<caret>o'\n" + "]);", PlatformPatterns.psiFile().withName("foo.de.xlf") ); } } } public void testFormChoicesTranslations() { String template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'choices' => [\n" + " '<caret>' => '',\n" + " ]" + "]);"; assertCompletionContains(PhpFileType.INSTANCE, template, "yaml_weak.symfony.great"); assertNavigationMatch(PhpFileType.INSTANCE, template.replace("<caret>", "yaml_<caret>weak.symfony.great")); } public void testFormChoicesTranslationsAsChoiceTranslationDomain() { String template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'choice_translation_domain' => 'foo',\n" + " 'choices' => [\n" + " '<caret>' => '',\n" + " ]" + "]);"; assertCompletionContains(PhpFileType.INSTANCE, template, "foo.symfony.great"); assertNavigationMatch(PhpFileType.INSTANCE, template.replace("<caret>", "foo<caret>.symfony.great")); } public void testFormChoicesTranslationsAsChoiceFormTranslationDomain() { String template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'translation_domain' => 'foo',\n" + " 'choices' => [\n" + " '<caret>' => '',\n" + " ]" + "]);"; assertCompletionContains(PhpFileType.INSTANCE, template, "foo.symfony.great"); assertNavigationMatch(PhpFileType.INSTANCE, template.replace("<caret>", "foo<caret>.symfony.great")); } public void testFormChoicesTranslationsAsChoiceFormTranslationDomainForChoicesAsValuesIsNull() { String template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'translation_domain' => 'foo',\n" + " 'choices_as_values' => false," + " 'choices' => [\n" + " '<caret>' => '',\n" + " ]" + "]);"; assertCompletionNotContains(PhpFileType.INSTANCE, template, "foo.symfony.great"); } public void testCompletionForChoicesAsValues() { String template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'choices_as_values' => true," + " 'choices' => [\n" + " '' => '<caret>',\n" + " ]" + "]);"; assertCompletionContains(PhpFileType.INSTANCE, template, "yaml_weak.symfony.great"); assertNavigationMatch(PhpFileType.INSTANCE, template.replace("<caret>", "yaml_<caret>weak.symfony.great")); } public void testCompletionForChoicesAsValuesForSymfonyVersions() { initVersion("2.7"); String template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'choices' => [\n" + " '' => '<caret>',\n" + " ]" + "]);"; assertCompletionContains("foo.php", template, "yaml_weak.symfony.great"); assertNavigationMatch("foo.php", template.replace("<caret>", "yaml_<caret>weak.symfony.great")); } public void testCompletionForChoicesAsValuesForSymfonyVersions2() { initVersion("2.8"); String template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'choices' => [\n" + " '<caret>' => '',\n" + " ]" + "]);"; assertCompletionContains("foo.php", template, "yaml_weak.symfony.great"); assertNavigationMatch("foo.php", template.replace("<caret>", "yaml_<caret>weak.symfony.great")); template = "<?php\n" + "/** @var $builder \\Symfony\\Component\\Form\\FormBuilderInterface\n */\n" + "$builder->add('foo', null, [\n" + " 'choices' => [\n" + " '' => '<caret>',\n" + " ]" + "]);"; assertCompletionNotContains("foo.php", template, "yaml_weak.symfony.great"); } public void testFormChoicesTranslationsAsChoiceTranslationDomainInsideDefaults() { String template = "<?php\n" + "\n" + "use Symfony\\Component\\Form\\AbstractType;\n" + "use Symfony\\Component\\Form\\FormBuilderInterface;\n" + "use Symfony\\Component\\OptionsResolver\\OptionsResolver;\n" + "\n" + "class FooType extends AbstractType\n" + "{\n" + " public function buildForm(FormBuilderInterface $builder, array $options)\n" + " {\n" + " $builder->add('foobar', null, [\n" + " 'choices' => [\n" + " '<caret>' => '',\n" + " ]\n" + " ]);\n" + " }\n" + "\n" + " public function configureOptions(OptionsResolver $resolver)\n" + " {\n" + " $resolver->setDefaults([\n" + " 'translation_domain' => 'foo',\n" + " ]);\n" + " }\n" + "}\n"; assertCompletionContains(PhpFileType.INSTANCE, template, "foo.symfony.great"); assertNavigationMatch(PhpFileType.INSTANCE, template.replace("<caret>", "foo.symfony<caret>.great")); } private void initVersion(@NotNull String version) { myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" + "namespace Symfony\\Component\\HttpKernel {\n" + " class Kernel {\n" + " const VERSION = '" + version + "';" + " }" + "}" ); } }