package fr.adrienbrault.idea.symfony2plugin.tests.doctrine.metadata.type; import com.intellij.patterns.PlatformPatterns; import com.jetbrains.php.lang.psi.elements.PhpClass; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import java.io.File; import java.util.ArrayList; import java.util.Collection; /** * @author Daniel Espendiller <daniel@espendiller.net> * * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.type.DoctrineTypeGotoCompletionRegistrar */ public class DoctrineTypeGotoCompletionRegistrarTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("classes.php")); } public String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } public void testXmlTypes() { for (String s : new String[]{"couchdb", "orm", "mongodb"}) { assertCompletionContains( "foo." + s + ".xml", "<doctrine-mapping><document><field type=\"<caret>\" /></document></doctrine-mapping>", "string", s + "_foo_bar" ); assertCompletionContains( "foo." + s + ".xml", "<doctrine-mapping><embedded-document><field type=\"<caret>\" /></embedded-document></doctrine-mapping>", "string", s + "_foo_bar" ); assertCompletionContains( "foo." + s + ".xml", "<doctrine-mapping><embedded><field type=\"<caret>\" /></embedded></doctrine-mapping>", "string", s + "_foo_bar" ); assertNavigationMatch( "foo." + s + ".xml", "<doctrine-mapping><document><field type=\"string<caret>\" /></document></doctrine-mapping>", PlatformPatterns.psiElement(PhpClass.class) ); assertNavigationMatch( "foo." + s + ".xml", "<doctrine-mapping><embedded-document><field type=\"string<caret>\" /></embedded-document></doctrine-mapping>", PlatformPatterns.psiElement(PhpClass.class) ); assertNavigationMatch( "foo." + s + ".xml", "<doctrine-mapping><embedded><field type=\"string<caret>\" /></embedded></doctrine-mapping>", PlatformPatterns.psiElement(PhpClass.class) ); assertCompletionNotContains( "foo." + s + ".xml", "<doctrine-mapping><document><field type=\"<caret>\" /></document></doctrine-mapping>", "foo" ); } } public void testThatOrmTypeFilledByStatic() { assertCompletionContains( "foo.orm.xml", "<doctrine-mapping><document><field type=\"<caret>\" /></document></doctrine-mapping>", "string", "orm_foo_bar", "smallint", "array" ); } public void testYamlTypes() { for (String s : new String[]{"couchdb", "orm", "mongodb"}) { assertCompletionContains("foo." + s + ".yml", "foo:\n" + " id:\n" + " field_1:\n" + " type: <caret>", "string", s + "_foo_bar" ); assertNavigationMatch("foo." + s + ".yml", "foo:\n" + " fields:\n" + " field_1:\n" + " type: stri<caret>ng", PlatformPatterns.psiElement(PhpClass.class) ); assertCompletionNotContains("foo." + s + ".yml", "foo:\n" + " id:\n" + " field_1:\n" + " type: <caret>", "string", s + "_foo_bar", "foo" ); } } public void testDocumentAndOdmFallback() { for (String s : new String[]{"document", "odm"}) { assertCompletionContains( "foo." + s + ".xml", "<doctrine-mapping><document><field type=\"<caret>\" /></document></doctrine-mapping>", "string", "couchdb_foo_bar" ); assertNavigationMatch( "foo." + s + ".xml", "<doctrine-mapping><document><field type=\"couchdb_foo_bar<caret>\" /></document></doctrine-mapping>", PlatformPatterns.psiElement(PhpClass.class) ); assertCompletionContains( "foo." + s + ".xml", "<doctrine-mapping><document><field type=\"<caret>\" /></document></doctrine-mapping>", "string", "mongodb_foo_bar" ); assertNavigationMatch( "foo." + s + ".xml", "<doctrine-mapping><document><field type=\"mongodb_foo_bar<caret>\" /></document></doctrine-mapping>", PlatformPatterns.psiElement(PhpClass.class) ); } } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.DoctrineMetadataPattern#getFieldName() */ public void testPropertyFieldName() { Collection<String[]> providers = new ArrayList<String[]>() {{ add(new String[] {"document", "document", "field"}); add(new String[] {"document", "embedded", "field"}); add(new String[] {"orm", "entity", "field"}); add(new String[] {"document", "document", "id"}); add(new String[] {"document", "embedded", "id"}); add(new String[] {"orm", "entity", "id"}); }}; for (String[] provider : providers) { assertCompletionContains( "foo." + provider[0] + ".xml", String.format("<doctrine-mapping><%s name=\"Doctrine\\Property\\Fields\"><%s name=\"<caret>\" /></%s></doctrine-mapping>\"", provider[1], provider[2], provider[1]), "id", "name" ); assertCompletionNotContains( "foo." + provider[0] + ".xml", String.format("<doctrine-mapping><%s name=\"Doctrine\\Property\\Fields\"><%s name=\"<caret>\" /></" + provider[1] + "></doctrine-mapping>\"", provider[1], provider[2], provider[1]), "const" ); assertNavigationMatch( "foo." + provider[0] + ".xml", String.format("<doctrine-mapping><%s name=\"Doctrine\\Property\\Fields\"><%s name=\"id<caret>\" /></" + provider[1] + "></doctrine-mapping>\"", provider[1], provider[2], provider[1]) ); } } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.DoctrineMetadataPattern#getFieldNameRelation() */ public void testPropertyRelations() { Collection<String[]> providers = new ArrayList<String[]>() {{ add(new String[] {"orm", "entity", "one-to-one"}); add(new String[] {"orm", "entity", "one-to-many"}); add(new String[] {"orm", "entity", "many-to-one"}); add(new String[] {"orm", "entity", "many-to-many"}); add(new String[] {"mongodb", "document", "reference-one"}); add(new String[] {"mongodb", "document", "reference-many"}); add(new String[] {"mongodb", "document", "embed-many"}); add(new String[] {"mongodb", "document", "embed-one"}); }}; for (String[] provider : providers) { assertCompletionContains( "foo." + provider[0] + ".xml", "<doctrine-mapping><" + provider[1] + " name=\"Doctrine\\Property\\Fields\"><" + provider[2] + " field=\"<caret>\" /></" + provider[1] + "></doctrine-mapping>\"", "id", "name" ); assertCompletionNotContains( "foo." + provider[0] + ".xml", "<doctrine-mapping><" + provider[1] + " name=\"Doctrine\\Property\\Fields\"><" + provider[2] + " field=\"<caret>\" /></" + provider[1] + "></doctrine-mapping>\"", "const" ); assertNavigationMatch( "foo." + provider[0] + ".xml", "<doctrine-mapping><" + provider[1] + " name=\"Doctrine\\Property\\Fields\"><" + provider[2] + " field=\"id<caret>\" /></" + provider[1] + "></doctrine-mapping>\"" ); } } /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.DoctrineMetadataPattern#getYamlFieldName() */ public void testYamlPropertyFieldNameNavigation() { Collection<String[]> providers = new ArrayList<String[]>() {{ add(new String[] {"orm", "id"}); add(new String[] {"orm", "fields"}); add(new String[] {"orm", "oneToOne"}); add(new String[] {"orm", "oneToMany"}); add(new String[] {"orm", "manyToOne"}); add(new String[] {"orm", "manyToMany"}); add(new String[] {"mondodb", "embedOne"}); add(new String[] {"mondodb", "embedMany"}); add(new String[] {"mondodb", "referenceOne"}); add(new String[] {"mondodb", "referenceMany"}); }}; for (String[] provider : providers) { assertNavigationMatch( "foo." + provider[0] + ".yml", "Doctrine\\Property\\Fields:\n" + " " + provider[1] + ":\n" + " i<caret>d:\n" + " type: string" ); assertNavigationMatch( "foo." + provider[0] + ".yml", "Doctrine\\Property\\Fields:\n" + " " + provider[1] + ":\n" + " i<caret>d:\n" + " type: string" ); } assertNavigationIsEmpty( "foo.orm.yml", "Doctrine\\Property\\Fields:\n" + " car:\n" + " i<caret>d:\n" + " type: string" ); } }