package fr.adrienbrault.idea.symfony2plugin.tests.config; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.ide.plugins.PluginManager; import com.intellij.openapi.extensions.PluginId; import com.intellij.patterns.PatternCondition; import com.intellij.patterns.PlatformPatterns; import com.intellij.patterns.XmlPatterns; import com.intellij.psi.PsiFile; import com.intellij.util.ProcessingContext; import com.jetbrains.php.lang.PhpFileType; import com.jetbrains.php.lang.psi.PhpPsiElementFactory; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.YAMLFileType; import org.jetbrains.yaml.psi.YAMLKeyValue; import java.io.File; import java.util.ArrayList; import java.util.Collection; /** * @author Daniel Espendiller <daniel@espendiller.net> * * @see fr.adrienbrault.idea.symfony2plugin.config.ServiceLineMarkerProvider */ public class ServiceLineMarkerProviderTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("ServiceLineMarkerProvider.php")); myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("SymfonyPhpReferenceContributor.php")); } public String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } public void testDoctrineModelLineMarker() { myFixture.configureByText(XmlFileType.INSTANCE, "" + "<doctrine-mapping>\n" + " <document name=\"Foo\\Car\"/>\n" + "</doctrine-mapping>" ); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Foo{\n" + " class Car{}\n" + "}" ), new LineMarker.ToolTipEqualsAssert("Navigate to model")); } public void testThatDoctrineAnnotationMetadataNotProvidesSelfLineMarker() { assertLineMarkerIsEmpty(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Foo{\n" + " class Bar{}\n" + "}" )); } public void testDoctrineRepositoryDefinitionLineMarker() { myFixture.configureByText(XmlFileType.INSTANCE, "" + "<doctrine-mapping>\n" + " <document name=\"Foo\" repository-class=\"Entity\\Bar\"/>\n" + "</doctrine-mapping>" ); myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" + "namespace Entity{\n" + " class Bar{}\n" + "}" ); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Entity{\n" + " class Bar{}\n" + "}" ), new LineMarker.ToolTipEqualsAssert("Navigate to metadata")); } public void testThatResourceProvidesLineMarker() { myFixture.copyFileToProject("BundleScopeLineMarkerProvider.php"); Collection<String[]> providers = new ArrayList<String[]>() {{ add(new String[] {"@FooBundle/foo.php"}); add(new String[] {"@FooBundle"}); add(new String[] {"@FooBundle/"}); }}; for (String[] provider : providers) { myFixture.configureByText( XmlFileType.INSTANCE, String.format("<routes><import resource=\"%s\" /></routes>", provider[0] ) ); PsiFile psiFile = myFixture.configureByText("foo.php", ""); assertLineMarker( psiFile, new LineMarker.ToolTipEqualsAssert("Navigate to resource") ); assertLineMarker( psiFile, new LineMarker.TargetAcceptsPattern("Navigate to resource", XmlPatterns.xmlTag().withName("import").withAttributeValue("resource", provider[0])) ); } } public void testXmlServiceLineMarker() { myFixture.configureByText(XmlFileType.INSTANCE, "<container>\n" + " <services>\n" + " <service class=\"Service\\Bar\" id=\"service_bar\"/>\n" + " </services>\n" + "</container>" ); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Service{\n" + " class Bar{}\n" + "}" ), new LineMarker.ToolTipEqualsAssert("Navigate to definition")); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Service{\n" + " class Bar{}\n" + "}" ), new LineMarker.TargetAcceptsPattern("Navigate to definition", XmlPatterns.xmlTag().withName("service").withAttributeValue("id", "service_bar"))); } public void testXmlServiceLineMarkerForClassName() { myFixture.configureByText(XmlFileType.INSTANCE, "<container>\n" + " <services>\n" + " <service id=\"Service\\Bar\"/>\n" + " </services>\n" + "</container>" ); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Service{\n" + " class Bar{}\n" + "}" ), new LineMarker.ToolTipEqualsAssert("Navigate to definition")); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Service{\n" + " class Bar{}\n" + "}" ), new LineMarker.TargetAcceptsPattern("Navigate to definition", XmlPatterns.xmlTag().withName("service").withAttributeValue("id", "Service\\Bar"))); } public void testYamlServiceLineMarker() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " foo:\n" + " class: Service\\YamlBar" ); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Service{\n" + " class YamlBar{}\n" + "}" ), new LineMarker.TargetAcceptsPattern("Navigate to definition", PlatformPatterns.psiElement(YAMLKeyValue.class).with(new PatternCondition<YAMLKeyValue>("KeyText") { @Override public boolean accepts(@NotNull YAMLKeyValue yamlKeyValue, ProcessingContext processingContext) { return yamlKeyValue.getKeyText().equals("foo"); } }))); } public void testYamlServiceLineMarkerForClassName() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " Service\\YamlBar: ~\n" ); assertLineMarker(PhpPsiElementFactory.createPsiFileFromText(getProject(), "<?php\n" + "namespace Service{\n" + " class YamlBar{}\n" + "}" ), new LineMarker.TargetAcceptsPattern("Navigate to definition", PlatformPatterns.psiElement(YAMLKeyValue.class).with(new PatternCondition<YAMLKeyValue>("KeyText") { @Override public boolean accepts(@NotNull YAMLKeyValue yamlKeyValue, ProcessingContext processingContext) { return yamlKeyValue.getKeyText().equals("Service\\YamlBar"); } }))); } public void testConstraintAndValidateClassLineMarker() { if("162.1121.34".equals(PluginManager.getPlugin(PluginId.getId("com.jetbrains.php")).getVersion())) { System.out.println("Skipping ServiceLineMarkerProviderTest.ServiceLineMarkerProviderTest for PhpStorm 2016.2 (162.1121.34) inconsistently behavior fixed in 2016.2.1"); return; } myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("Validation.php")); assertLineMarker(myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" + "namespace Foo\\Validation {\n" + " class Bar extends \\Symfony\\Component\\Validator\\Constraint {}\n" + "}" ), new LineMarker.ToolTipEqualsAssert("Navigate to validator")); myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" + "namespace Foo\\Validation\n" + "{\n" + " class Bar{}\n" + "}" ); assertLineMarker(myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" + "namespace Foo\\Validation {\n" + " class BarValidator implements \\Symfony\\Component\\Validator\\ConstraintValidatorInterface {}\n" + "}" ), new LineMarker.ToolTipEqualsAssert("Navigate to constraint")); } }