package fr.adrienbrault.idea.symfony2plugin.tests.form.util; import com.jetbrains.php.lang.psi.PhpPsiElementFactory; import com.jetbrains.php.lang.psi.elements.PhpClass; import com.jetbrains.php.lang.psi.elements.impl.ClassConstantReferenceImpl; import com.jetbrains.php.lang.psi.elements.impl.PhpTypedElementImpl; import com.jetbrains.php.lang.psi.elements.impl.StringLiteralExpressionImpl; import fr.adrienbrault.idea.symfony2plugin.form.dict.FormTypeClass; import fr.adrienbrault.idea.symfony2plugin.form.util.FormUtil; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Map; /** * @author Daniel Espendiller <daniel@espendiller.net> * * @see fr.adrienbrault.idea.symfony2plugin.form.util.FormUtil */ public class FormUtilTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject("classes.php"); } protected String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } @SuppressWarnings({"ConstantConditions"}) public void testGetFormTypeClassOnParameter() { assertEquals("\\Form\\FormType\\Foo", FormUtil.getFormTypeClassOnParameter( PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpTypedElementImpl.class, "<?php new \\Form\\FormType\\Foo();") ).getFQN()); assertEquals("\\Form\\FormType\\Foo", FormUtil.getFormTypeClassOnParameter( PhpPsiElementFactory.createPhpPsiFromText(getProject(), StringLiteralExpressionImpl.class, "<?php '\\Form\\FormType\\Foo'") ).getFQN()); assertEquals("\\Form\\FormType\\Foo", FormUtil.getFormTypeClassOnParameter( PhpPsiElementFactory.createPhpPsiFromText(getProject(), StringLiteralExpressionImpl.class, "<?php 'Form\\FormType\\Foo'") ).getFQN()); assertEquals("\\Form\\FormType\\Foo", FormUtil.getFormTypeClassOnParameter( PhpPsiElementFactory.createPhpPsiFromText(getProject(), ClassConstantReferenceImpl.class, "<?php Form\\FormType\\Foo::class") ).getFQN()); } @SuppressWarnings({"ConstantConditions"}) public void testGetFormTypeClasses() { Map<String, FormTypeClass> formTypeClasses = FormUtil.getFormTypeClasses(getProject()); assertNotNull(formTypeClasses.get("foo_type")); assertEquals(formTypeClasses.get("foo_type").getPhpClass().getFQN(), "\\Form\\FormType\\Foo"); assertNotNull(formTypeClasses.get("foo_bar")); assertEquals(formTypeClasses.get("foo_bar").getPhpClass().getFQN(), "\\Form\\FormType\\FooBar"); } public void testGetFormAliases() { PhpClass phpClass = PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "class Foo implements \\Symfony\\Component\\Form\\FormTypeInterface {\n" + " public function getName()" + " {\n" + " return 'bar';\n" + " return 'foo';\n" + " }\n" + "}" ); assertContainsElements(Arrays.asList("bar", "foo"), FormUtil.getFormAliases(phpClass)); } public void testGetFormAliasesPhpClassNotImplementsInterfaceAndShouldBeEmpty() { PhpClass phpClass = PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "class Foo {\n" + " public function getName()" + " {\n" + " return 'bar';\n" + " }\n" + "}" ); assertSize(0, FormUtil.getFormAliases(phpClass)); } public void testGetFormParentOfPhpClass() { PhpClass phpClass = PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "class Foo {\n" + " public function getParent()" + " {\n" + " return 'bar';\n" + " }\n" + "}" ); assertEquals("bar", FormUtil.getFormParentOfPhpClass(phpClass)); phpClass = PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "namespace My\\Bar {\n" + " class Foo {\n" + " public function getParent()" + " {\n" + " return __NAMESPACE__ . '\\Foo';\n" + " }\n" + " }\n" + "}" ); assertEquals("My\\Bar\\Foo", FormUtil.getFormParentOfPhpClass(phpClass)); phpClass = PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "namespace My\\Bar {\n" + " class Bar() {}\n" + " class Foo {\n" + " public function getParent()" + " {\n" + " return Bar::class;\n" + " }\n" + " }\n" + "}" ); assertEquals("My\\Bar\\Bar", FormUtil.getFormParentOfPhpClass(phpClass)); } public void testGetFormNameOfPhpClass() { // Symfony < 2.8 assertEquals("datetime", FormUtil.getFormNameOfPhpClass(PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "namespace My\\Bar {\n" + " class Foo {\n" + " public function getName()\n" + " {\n" + " return 'datetime';\n" + " }\n" + " }\n" + "}" ))); // Symfony 2.8+ // getBlockPrefix for bc assertEquals("datetime", FormUtil.getFormNameOfPhpClass(PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "namespace My\\Bar {\n" + " class Foo {\n" + " public function getName()\n" + " {\n" + " return $this->getBlockPrefix();\n" + " }\n" + " public function getBlockPrefix()\n" + " {\n" + " return 'datetime';\n" + " }\n" + " }\n" + "}" ))); // invalid method logic assertNull(FormUtil.getFormNameOfPhpClass(PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "namespace My\\Bar {\n" + " class Foo {\n" + " public function getName()\n" + " {\n" + " return $this->foo();\n" + " }\n" + " public function foo()\n" + " {\n" + " return 'datetime';\n" + " }\n" + " }\n" + "}" ))); // Symfony 2.8 // class name as type but stripped Type Collection<String[]> providers = new ArrayList<String[]>() {{ add(new String[] {"foo", "Foo"}); add(new String[] {"foo", "FooType"}); add(new String[] {"foo_bar", "FooBar"}); add(new String[] {"foo_bar", "fooBar"}); add(new String[] {"foo", "footype"}); add(new String[] {"type", "type"}); }}; for (String[] provider : providers) { assertEquals(provider[0], FormUtil.getFormNameOfPhpClass(PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "namespace My\\Bar {\n" + " class Foo {\n" + " public function getBlockPrefix()\n" + " {\n" + " return 'datetime';\n" + " }\n" + "}\n" + String.format(" class %s extends Foo {", provider[1]) + " public function getName()\n" + " {\n" + " return $this->getBlockPrefix();\n" + " }\n" + " }\n" + "}" ))); } // Symfony 3 // class name if no "getName" method found assertEquals("My\\Bar\\Foo", FormUtil.getFormNameOfPhpClass(PhpPsiElementFactory.createPhpPsiFromText(getProject(), PhpClass.class, "<?php\n" + "namespace My\\Bar {\n" + " class Foo {}\n" + "}" ))); } }