package fr.adrienbrault.idea.symfony2plugin.tests.stubs; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.xml.XmlTag; import com.intellij.util.containers.ContainerUtil; import fr.adrienbrault.idea.symfony2plugin.stubs.ServiceIndexUtil; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.psi.YAMLKeyValue; import java.io.File; /** * @author Daniel Espendiller <daniel@espendiller.net> * @see fr.adrienbrault.idea.symfony2plugin.stubs.ServiceIndexUtil */ public class ServiceIndexUtilTest extends SymfonyLightCodeInsightFixtureTestCase { private VirtualFile ymlVirtualFile; private VirtualFile xmlVirtualFile; public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject("classes.php"); ymlVirtualFile = myFixture.copyFileToProject("services.yml"); xmlVirtualFile = myFixture.copyFileToProject("services.xml"); } public String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } public void testFindServiceDefinitionsForStringInsideYaml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findServiceDefinitions(getProject(), "foo.yml_id"), new MyYamlKeyValueCondition("foo.yml_id") )); } public void testFindServiceDefinitionsForStringInsideXml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findServiceDefinitions(getProject(), "foo.xml_id"), new MyXmlTagCondition("foo.xml_id") )); } public void testFindServiceDefinitionsForStringInsideXmlUpperCase() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findServiceDefinitions(getProject(), "foo.xml_id.upper"), new MyXmlTagCondition("foo.xml_id.UPPER") )); } public void testFindServiceDefinitionsForPhpClassInsideYaml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findServiceDefinitions(PhpElementsUtil.getClass(getProject(), "My\\Foo\\Service\\Targets")), new MyYamlKeyValueCondition("foo.yml_id") )); } public void testFindServiceDefinitionsForPhpClassInsideXml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findServiceDefinitions(PhpElementsUtil.getClass(getProject(), "My\\Foo\\Service\\Targets")), new MyXmlTagCondition("foo.xml_id") )); } public void testFindServiceDefinitionsForPhpClassAsLazyInsideYml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findServiceDefinitionsLazy(PhpElementsUtil.getClass(getProject(),"My\\Foo\\Service\\Targets")).getValue(), new MyYamlKeyValueCondition("foo.yml_id")) ); } public void testFindServiceDefinitionsForPhpClassAsLazyInsideXml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findServiceDefinitionsLazy(PhpElementsUtil.getClass(getProject(),"My\\Foo\\Service\\Targets")).getValue(), new MyXmlTagCondition("foo.xml_id")) ); } public void testFindParameterDefinitionsInsideYml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findParameterDefinitions(PsiManager.getInstance(getProject()).findFile(ymlVirtualFile), "foo_yaml_parameter"), new MyYamlKeyValueCondition("foo_yaml_parameter")) ); } public void testFindParameterDefinitionsInsideXml() { assertNotNull(ContainerUtil.find( ServiceIndexUtil.findParameterDefinitions(PsiManager.getInstance(getProject()).findFile(xmlVirtualFile), "foo_xml_parameter"), new MyXmlTagCondition("foo_xml_parameter", "key")) ); } private static class MyYamlKeyValueCondition implements Condition<PsiElement> { @NotNull private final String key; public MyYamlKeyValueCondition(@NotNull String key) { this.key = key; } @Override public boolean value(PsiElement psiElement) { return psiElement instanceof YAMLKeyValue && ((YAMLKeyValue) psiElement).getKeyText().equals(this.key); } } private static class MyXmlTagCondition implements Condition<PsiElement> { @NotNull private final String key; @NotNull private final String attr; public MyXmlTagCondition(@NotNull String key) { this(key, "id"); } public MyXmlTagCondition(@NotNull String key, @NotNull String attr) { this.key = key; this.attr = attr; } @Override public boolean value(PsiElement psiElement) { return psiElement instanceof XmlTag && this.key.equals(((XmlTag) psiElement).getAttributeValue(this.attr)); } } }