package fr.adrienbrault.idea.symfony2plugin.tests.dic.container.util; import com.google.gson.Gson; import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiFile; import com.intellij.util.containers.ContainerUtil; import fr.adrienbrault.idea.symfony2plugin.dic.container.ServiceInterface; import fr.adrienbrault.idea.symfony2plugin.dic.container.util.ServiceContainerUtil; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Daniel Espendiller <daniel@espendiller.net> * * @see fr.adrienbrault.idea.symfony2plugin.dic.container.util.ServiceContainerUtil */ public class ServiceContainerUtilTest extends SymfonyLightCodeInsightFixtureTestCase { private PsiFile xmlFile; private PsiFile ymlFile; public void setUp() throws Exception { super.setUp(); this.xmlFile = myFixture.configureByFile("services.xml"); this.ymlFile = myFixture.configureByFile("services.yml"); myFixture.configureByFile("usage.services.xml"); myFixture.configureByFile("usage1.services.xml"); } public String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } public void testDefaults() { for (PsiFile psiFile : new PsiFile[]{xmlFile, ymlFile}) { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("defaults")); assertEquals("defaults", bar.getId()); assertEquals("DateTime", bar.getClassName()); assertEquals(false, bar.isAbstract()); assertEquals(false, bar.isAutowire()); assertEquals(false, bar.isDeprecated()); assertEquals(false, bar.isLazy()); assertEquals(true, bar.isPublic()); assertNull(bar.getDecorates()); assertNull(bar.getDecorationInnerName()); assertNull(bar.getParent()); assertNull(bar.getAlias()); } } public void testDecoratorPatternCustomLanguageUnderscoreKeys() { for (PsiFile psiFile : new PsiFile[]{xmlFile, ymlFile}) { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("bar")); assertEquals("bar", bar.getId()); assertEquals("stdClass", bar.getClassName()); assertEquals("foo", bar.getDecorates()); assertEquals("bar.wooz", bar.getDecorationInnerName()); assertEquals(false, bar.isPublic()); } } public void testNonDefaults() { for (PsiFile psiFile : new PsiFile[]{xmlFile, ymlFile}) { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("non.defaults")); assertEquals(true, bar.isAbstract()); assertEquals(true, bar.isAutowire()); assertEquals(true, bar.isDeprecated()); assertEquals(true, bar.isLazy()); assertEquals(false, bar.isPublic()); assertEquals("foo", bar.getDecorates()); assertEquals("foo", bar.getDecorationInnerName()); assertEquals("foo", bar.getParent()); assertEquals("foo", bar.getAlias()); } } public void testUpperToLower() { for (PsiFile psiFile : new PsiFile[]{xmlFile, ymlFile}) { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), serviceInterface -> serviceInterface.getId().equalsIgnoreCase("bar.UPPER") ); assertEquals("bar.UPPER", bar.getId()); } } public void testNonDefaultValuesAreSerialized() { for (PsiFile psiFile : new PsiFile[]{xmlFile, ymlFile}) { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("non.defaults")); assertEquals( "{\"id\":\"non.defaults\",\"class\":\"DateTime\",\"public\":false,\"lazy\":true,\"abstract\":true,\"autowire\":true,\"deprecated\":true,\"alias\":\"foo\",\"decorates\":\"foo\",\"decoration_inner_name\":\"foo\",\"parent\":\"foo\"}", new Gson().toJson(bar) ); } } public void testThatDefaultValueAreNullAndNotSerialized() { for (PsiFile psiFile : new PsiFile[]{xmlFile, ymlFile}) { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("defaults")); assertEquals( "{\"id\":\"defaults\",\"class\":\"DateTime\"}", new Gson().toJson(bar) ); } } public void testYmlDeprecatedAsTilde() { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(ymlFile), MyStringServiceInterfaceCondition.create("bar.deprecated")); assertEquals(true, bar.isDeprecated()); } public void testYmlAliasDefinitionAsInline() { assertEquals("bar", ContainerUtil.find(ServiceContainerUtil.getServicesInFile(ymlFile), MyStringServiceInterfaceCondition.create("alias.inline_1")).getAlias()); assertEquals("bar", ContainerUtil.find(ServiceContainerUtil.getServicesInFile(ymlFile), MyStringServiceInterfaceCondition.create("alias.inline_2")).getAlias()); assertEquals("bar", ContainerUtil.find(ServiceContainerUtil.getServicesInFile(ymlFile), MyStringServiceInterfaceCondition.create("alias.inline_3")).getAlias()); assertNull(ContainerUtil.find(ServiceContainerUtil.getServicesInFile(ymlFile), MyStringServiceInterfaceCondition.create("alias.inline_4")).getAlias()); } public void testServiceWithoutClassMustUseIdAsClass() { for (PsiFile psiFile : new PsiFile[]{xmlFile, ymlFile}) { ServiceInterface bar = ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("My\\Class\\Id\\First")); assertEquals("My\\Class\\Id\\First", bar.getClassName()); assertNull(ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("my_abstract_without_class")).getClassName()); assertNull(ContainerUtil.find(ServiceContainerUtil.getServicesInFile(psiFile), MyStringServiceInterfaceCondition.create("my_alias_without_class")).getClassName()); } } public void testGetServiceUsage() { assertEquals(3, ServiceContainerUtil.getServiceUsage(getProject(), "usage_xml_foobar")); assertEquals(3, ServiceContainerUtil.getServiceUsage(getProject(), "usage_xml_foobar2")); assertEquals(1, ServiceContainerUtil.getServiceUsage(getProject(), "usage_xml_foobar3")); } public void testGetSortedServiceId() { List<String> sortedServiceId = ServiceContainerUtil.getSortedServiceId(getProject(), Arrays.asList("foobar.default", "foobar", "usage_xml_foobar")); assertEquals("usage_xml_foobar", sortedServiceId.get(0)); assertEquals("foobar", sortedServiceId.get(1)); assertEquals("foobar.default", sortedServiceId.get(2)); } public void testGetSortedServiceIdByUsage() { List<String> sortedServiceId = ServiceContainerUtil.getSortedServiceId(getProject(), Arrays.asList("foobar.default", "usage_xml_foobar3", "usage_xml_foobar2")); assertEquals("usage_xml_foobar2", sortedServiceId.get(0)); assertEquals("usage_xml_foobar3", sortedServiceId.get(1)); assertEquals("foobar.default", sortedServiceId.get(2)); } private static class MyStringServiceInterfaceCondition implements Condition<ServiceInterface> { @NotNull private final String id; private MyStringServiceInterfaceCondition(@NotNull String id) { this.id = id; } @Override public boolean value(ServiceInterface serviceInterface) { return serviceInterface.getId().equals(this.id); } public static MyStringServiceInterfaceCondition create(@NotNull String id) { return new MyStringServiceInterfaceCondition(id); } } }