package fr.adrienbrault.idea.symfony2plugin.tests.config;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementPresentation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.php.lang.PhpFileType;
import com.jetbrains.php.lang.psi.PhpPsiElementFactory;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import fr.adrienbrault.idea.symfony2plugin.config.EventDispatcherSubscriberUtil;
import fr.adrienbrault.idea.symfony2plugin.config.dic.EventDispatcherSubscribedEvent;
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import java.io.File;
import java.util.Collection;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class EventDispatcherSubscriberUtilTest extends SymfonyLightCodeInsightFixtureTestCase {
public void setUp() throws Exception {
super.setUp();
myFixture.copyFileToProject("EventSubscriber.php");
myFixture.copyFileToProject("EventSubscriberAnnotation.php");
myFixture.copyFileToProject("event.services.xml");
myFixture.copyFileToProject("event.services.yml");
}
public String getTestDataPath() {
return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath();
}
/**
* @see EventDispatcherSubscriberUtil#getSubscribedEvents
* @see EventDispatcherSubscriberUtil#attachSubscriberEventNames
*/
public void testGetSubscribedEvent() {
EventDispatcherSubscribedEvent event1 = EventDispatcherSubscriberUtil.getSubscribedEvent(getProject(), "pre.foo").iterator().next();
assertEquals("pre.foo", event1.getStringValue());
assertEquals("TestEventSubscriber", event1.getFqnClassName());
assertNull(event1.getSignature());
assertEquals("preFoo", event1.getMethodName());
EventDispatcherSubscribedEvent event2 = EventDispatcherSubscriberUtil.getSubscribedEvent(getProject(), "post.foo").iterator().next();
assertEquals("post.foo", event2.getStringValue());
assertEquals("TestEventSubscriber", event2.getFqnClassName());
assertEquals("#K#C\\Foo\\Bar.BAR", event2.getSignature());
assertEquals("postFoo", event2.getMethodName());
EventDispatcherSubscribedEvent event3 = EventDispatcherSubscriberUtil.getSubscribedEvent(getProject(), "pre.foo1").iterator().next();
assertEquals("pre.foo1", event3.getStringValue());
assertEquals("onStoreOrder", event3.getMethodName());
EventDispatcherSubscribedEvent event4 = EventDispatcherSubscriberUtil.getSubscribedEvent(getProject(), "pre.foo2").iterator().next();
assertEquals("pre.foo2", event4.getStringValue());
assertEquals("onKernelResponseMid", event4.getMethodName());
EventDispatcherSubscribedEvent event5 = EventDispatcherSubscriberUtil.getSubscribedEvent(getProject(), "pre.foo3").iterator().next();
assertEquals("pre.foo3", event5.getStringValue());
assertNull(event5.getMethodName());
EventDispatcherSubscribedEvent event6 = EventDispatcherSubscriberUtil.getSubscribedEvent(getProject(), "pre.foo4").iterator().next();
assertEquals("pre.foo4", event6.getStringValue());
assertNull( event6.getMethodName());
}
/**
* @see EventDispatcherSubscriberUtil#getEventNameLookupElements
*/
public void testGetEventNameLookupElementsForEventAnnotations() {
Collection<LookupElement> eventNameLookupElements = EventDispatcherSubscriberUtil.getEventNameLookupElements(getProject());
ContainerUtil.find(eventNameLookupElements, lookupElement ->
lookupElement.getLookupString().equals("bar.pre_bar")
);
ContainerUtil.find(eventNameLookupElements, lookupElement ->
lookupElement.getLookupString().equals("bar.post_bar")
);
ContainerUtil.find(eventNameLookupElements, lookupElement -> {
if(!"bar.post_bar".equals(lookupElement.getLookupString())) {
return false;
}
LookupElementPresentation lookupElementPresentation = new LookupElementPresentation();
lookupElement.renderElement(lookupElementPresentation);
return "My\\MyFooEvent".equals(lookupElementPresentation.getTypeText());
});
}
/**
* @see EventDispatcherSubscriberUtil#getEventPsiElements
*/
public void testGetEventTargetsElementsForTags() {
Collection<PsiElement> elements = EventDispatcherSubscriberUtil.getEventPsiElements(getProject(), "kernel.exception.xml");
assertNotNull(
ContainerUtil.find(elements, psiElement -> psiElement instanceof PhpClass && ((PhpClass) psiElement).getFQN().contains("MyDateTime"))
);
}
/**
* @see EventDispatcherSubscriberUtil#getEventPsiElements
*/
public void testGetEventTargetsElementsForEventAnnotations() {
Collection<PsiElement> elements = EventDispatcherSubscriberUtil.getEventPsiElements(getProject(), "bar.post_bar");
assertNotNull(
ContainerUtil.find(elements, psiElement -> psiElement instanceof PhpClass && ((PhpClass) psiElement).getFQN().contains("MyFooEvent"))
);
}
/**
* @see EventDispatcherSubscriberUtil#getEventNameLookupElements
*/
public void testGetEventNameLookupElementsForTaggedKernelListener() {
Collection<LookupElement> eventNameLookupElements = EventDispatcherSubscriberUtil.getEventNameLookupElements(getProject());
ContainerUtil.find(eventNameLookupElements, lookupElement ->
lookupElement.getLookupString().equals("kernel.exception.xml")
);
ContainerUtil.find(eventNameLookupElements, lookupElement ->
lookupElement.getLookupString().equals("kernel.exception.yml")
);
}
/**
* @see EventDispatcherSubscriberUtil#getEventNameFromScope
*/
public void testGetEventNameFromScope() {
PsiFile psiFile = myFixture.configureByText(PhpFileType.INSTANCE, "<?php ['foo' => 'foo<caret>bar']");
PsiElement psiElement = psiFile.findElementAt(myFixture.getCaretOffset());
assertEquals("foo", EventDispatcherSubscriberUtil.getEventNameFromScope(psiElement));
}
}