package fr.adrienbrault.idea.symfony2plugin.tests.util.yaml; import com.intellij.psi.PsiElement; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.jetbrains.php.lang.psi.elements.Parameter; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper; import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlPsiElementFactory; import fr.adrienbrault.idea.symfony2plugin.util.yaml.visitor.YamlServiceTag; import fr.adrienbrault.idea.symfony2plugin.util.yaml.visitor.YamlTagVisitor; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.YAMLFileType; import org.jetbrains.yaml.psi.YAMLCompoundValue; import org.jetbrains.yaml.psi.YAMLFile; import org.jetbrains.yaml.psi.YAMLKeyValue; import org.jetbrains.yaml.psi.YAMLScalar; import org.jetbrains.yaml.psi.impl.YAMLArrayImpl; import org.jetbrains.yaml.psi.impl.YAMLHashImpl; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class YamlHelperLightTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject("classes.php"); } public String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitTagsOnServiceDefinition */ public void testVisitTagsOnServiceDefinition() { YAMLKeyValue yamlKeyValue = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "foo:\n" + " tags:\n" + " - { name: kernel.event_listener, event: eventName, method: methodName }\n" + " - { name: kernel.event_listener2, event: eventName2, method: methodName2 }\n" ); ListYamlTagVisitor visitor = new ListYamlTagVisitor(); YamlHelper.visitTagsOnServiceDefinition(yamlKeyValue, visitor); assertEquals("kernel.event_listener", visitor.getItem(0).getName()); assertEquals("eventName", visitor.getItem(0).getAttribute("event")); assertEquals("methodName", visitor.getItem(0).getAttribute("method")); assertEquals("kernel.event_listener2", visitor.getItem(1).getName()); assertEquals("eventName2", visitor.getItem(1).getAttribute("event")); assertEquals("methodName2", visitor.getItem(1).getAttribute("method")); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitTagsOnServiceDefinition */ public void testVisitTagsOnServiceDefinitionForSymfony33TagsShortcut() { YAMLKeyValue yamlKeyValue = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "foo:\n" + " tags:\n" + " - kernel.event_listener\n" + " - kernel.event_listener2\n" ); ListYamlTagVisitor visitor = new ListYamlTagVisitor(); YamlHelper.visitTagsOnServiceDefinition(yamlKeyValue, visitor); assertEquals("kernel.event_listener", visitor.getItem(0).getName()); assertEquals("kernel.event_listener", visitor.getItem(0).getAttribute("name")); assertEquals("kernel.event_listener2", visitor.getItem(1).getName()); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitTagsOnServiceDefinition */ public void testVisitTagsOnServiceDefinitionWithQuote() { YAMLKeyValue yamlKeyValue = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "foo:\n" + " tags:\n" + " - { name: 'kernel.event_listener', event: 'eventName', method: 'methodName' }\n" ); ListYamlTagVisitor visitor = new ListYamlTagVisitor(); YamlHelper.visitTagsOnServiceDefinition(yamlKeyValue, visitor); assertEquals("kernel.event_listener", visitor.getItem().getName()); assertEquals("eventName", visitor.getItem().getAttribute("event")); assertEquals("methodName", visitor.getItem().getAttribute("method")); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitTagsOnServiceDefinition */ public void testVisitTagsOnServiceDefinitionWithDoubleQuote() { YAMLKeyValue yamlKeyValue = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "foo:\n" + " tags:\n" + " - { name: \"kernel.event_listener\", event: \"eventName\", method: \"methodName\" }\n" ); ListYamlTagVisitor visitor = new ListYamlTagVisitor(); YamlHelper.visitTagsOnServiceDefinition(yamlKeyValue, visitor); assertEquals("kernel.event_listener", visitor.getItem().getName()); assertEquals("eventName", visitor.getItem().getAttribute("event")); assertEquals("methodName", visitor.getItem().getAttribute("method")); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#findServiceInContext */ public void testFindServiceInContext() { assertEquals("foo", YamlHelper.findServiceInContext(myFixture.configureByText(YAMLFileType.YML, "" + "services:\n" + " foo:\n" + " tags:\n" + " - { name: fo<caret>o}\n" ).findElementAt(myFixture.getCaretOffset())).getKeyText()); assertEquals("foo", YamlHelper.findServiceInContext(myFixture.configureByText(YAMLFileType.YML, "" + "services:\n" + " foo:\n" + " class: fo<caret>o" ).findElementAt(myFixture.getCaretOffset())).getKeyText()); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#getYamlKeyValueAsString */ public void testGetYamlKeyValueAsString() { String[] strings = { "{ name: routing.loader, method: foo }", "{ name: routing.loader, method: 'foo' }", "{ name: routing.loader, method: \"foo\" }", }; for (String s : strings) { assertEquals("foo", YamlHelper.getYamlKeyValueAsString( YamlPsiElementFactory.createFromText(getProject(), YAMLHashImpl.class, s), "method" )); } } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#collectServiceTags */ public void testCollectServiceTags() { YAMLKeyValue fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "" + "foo:\n" + " tags:\n" + " - { name: routing.loader, method: crossHint }\n" + " - { name: routing.loader1, method: crossHint }\n" ); assertNotNull(fromText); assertContainsElements(YamlHelper.collectServiceTags(fromText), "routing.loader", "routing.loader1"); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#collectServiceTags */ public void testCollectServiceTagsForSymfony33TagsShortcut() { YAMLKeyValue fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "" + "foo:\n" + " tags:\n" + " - routing.loader_tags_1\n" + " - routing.loader_tags_2\n" ); assertNotNull(fromText); Set<String> collection = YamlHelper.collectServiceTags(fromText); assertContainsElements(collection, "routing.loader_tags_1"); assertContainsElements(collection, "routing.loader_tags_2"); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#collectServiceTags */ public void testCollectServiceTagsForSymfony33TagsShortcutInline() { YAMLKeyValue fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "" + "foo:\n" + " tags: [routing.loader_tags_3, routing.loader_tags_4]\n" ); assertNotNull(fromText); Set<String> collection = YamlHelper.collectServiceTags(fromText); assertContainsElements(collection, "routing.loader_tags_3"); assertContainsElements(collection, "routing.loader_tags_4"); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#getYamlArrayOnSequenceOrArrayElements */ public void testGetYamlArrayOnSequenceOrArrayElements() { String[] strings = { "calls: [@foo, @bar] \n", "calls:\n - @foo\n - @bar\n", }; for (String s : strings) { YAMLCompoundValue fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLCompoundValue.class, s); assertNotNull(fromText); List<PsiElement> elements = YamlHelper.getYamlArrayOnSequenceOrArrayElements(fromText); assertNotNull(elements); String join = StringUtils.join(ContainerUtil.map(elements, new Function<PsiElement, String>() { @Override public String fun(PsiElement psiElement) { return psiElement.getText(); } }), ","); assertTrue(join.contains("foo")); assertTrue(join.contains("bar")); } } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#getYamlArrayValues */ public void testGetYamlArrayValues() { YAMLArrayImpl fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLArrayImpl.class, "['@twig', @twig, @twig]"); assertEquals(3, YamlHelper.getYamlArrayValues(fromText).size()); fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLArrayImpl.class, "[@service, \"@service2\"]"); assertEquals(2, YamlHelper.getYamlArrayValues(fromText).size()); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#getYamlArrayOnSequenceOrArrayElements */ public void testGetYamlArrayOnSequenceOrArrayElementsForArray() { YAMLCompoundValue fromText = YamlPsiElementFactory.createFromText(getProject(), YAMLCompoundValue.class, "" + "calls: [@foo, @bar] \n" ); assertNotNull(fromText); String join = StringUtils.join(ContainerUtil.map(YamlHelper.getYamlArrayOnSequenceOrArrayElements(fromText), new Function<PsiElement, String>() { @Override public String fun(PsiElement psiElement) { return psiElement.getText(); } }), ","); assertTrue(join.contains("foo")); assertTrue(join.contains("bar")); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#insertKeyIntoFile */ public void testInsertKeyIntoFile() { YAMLFile yamlFile = (YAMLFile) myFixture.configureByText(YAMLFileType.YML, "" + "foo:\n" + " bar:\n" + " car: test" ); YamlHelper.insertKeyIntoFile(yamlFile, "value", "foo", "bar", "apple"); assertEquals("" + "foo:\n" + " bar:\n" + " car: test\n" + " apple: value", yamlFile.getText() ); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#insertKeyIntoFile */ public void testInsertKeyIntoFileOnRoot() { YAMLFile yamlFile = (YAMLFile) myFixture.configureByText(YAMLFileType.YML, "" + "foo:\n" + " bar:\n" + " car: test" ); YamlHelper.insertKeyIntoFile(yamlFile, "value", "car", "bar", "apple"); assertEquals("" + "foo:\n" + " bar:\n" + " car: test\n" + "car:\n" + " bar:\n" + " apple: value", yamlFile.getText() ); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#insertKeyIntoFile * TODO empty file */ public void skipTestInsertKeyIntoEmptyFile() { YAMLFile yamlFile = (YAMLFile) myFixture.configureByText(YAMLFileType.YML, ""); YamlHelper.insertKeyIntoFile(yamlFile, "value", "car", "bar", "apple"); assertEquals("" + "foo:\n" + " bar:\n" + " car: test\n" + "car:\n" + " bar:\n" + " apple: value", yamlFile.getText() ); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#insertKeyIntoFile */ public void testInsertKeyWithArrayValue() { YAMLFile yamlFile = (YAMLFile) myFixture.configureByText(YAMLFileType.YML, "" + "services:\n" + " foo:\n" + " car: test" ); YAMLKeyValue yamlKeyValue = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "" + "my_service:\n" + " class: foo\n" + " tag:\n" + " - foo\n" ); assertNotNull(yamlKeyValue); YamlHelper.insertKeyIntoFile(yamlFile, yamlKeyValue, "services"); assertEquals("" + "services:\n" + " foo:\n" + " car: test\n" + " my_service:\n" + " class: foo\n" + " tag:\n" + " - foo", yamlFile.getText() ); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#insertKeyIntoFile */ public void testInsertKeyValueWithMissingMainKeyInRoot() { YAMLFile yamlFile = (YAMLFile) myFixture.configureByText(YAMLFileType.YML, "foo: foo"); YAMLKeyValue yamlKeyValue = YamlPsiElementFactory.createFromText(getProject(), YAMLKeyValue.class, "" + "my_service:\n" + " class: foo\n" + " tag: foo" ); assertNotNull(yamlKeyValue); YamlHelper.insertKeyIntoFile(yamlFile, yamlKeyValue, "services"); assertEquals("" + "foo: foo\n" + "services:\n" + " my_service:\n" + " class: foo\n" + " tag: foo", yamlFile.getText() ); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitServiceCall */ public void testVisitServiceCall() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " foobar:\n" + " class: Foo\\Bar\n" + " calls:\n" + " - [ '<caret>' ]\n" ); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); YAMLScalar parent = (YAMLScalar) psiElement.getParent(); Collection<String> values = new ArrayList<>(); YamlHelper.visitServiceCall(parent, values::add); assertContainsElements(values, "Foo\\Bar"); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitServiceCall */ public void testVisitServiceCallForNamedServices() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " Foo\\Bar:\n" + " calls:\n" + " - [ '<caret>' ]\n" ); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); YAMLScalar parent = (YAMLScalar) psiElement.getParent(); Collection<String> values = new ArrayList<>(); YamlHelper.visitServiceCall(parent, values::add); assertContainsElements(values, "Foo\\Bar"); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitServiceCallArgument */ public void testVisitServiceCallArgument() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " foobar:\n" + " class: Foo\\Bar\n" + " calls:\n" + " - [ 'setBar', [@f<caret>oo] ]\n" ); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); YAMLScalar parent = (YAMLScalar) psiElement.getParent(); Collection<String> values = new ArrayList<>(); YamlHelper.visitServiceCallArgument(parent, parameterVisitor -> values.add(parameterVisitor.getClassName() + ":" + parameterVisitor.getMethod() + ":" + parameterVisitor.getParameterIndex()) ); assertContainsElements(values, "Foo\\Bar:setBar:0"); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitServiceCallArgument */ public void testVisitServiceCallArgumentAsNamedService() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " Foo\\Bar:\n" + " calls:\n" + " - [ 'setBar', [@f<caret>oo] ]\n" ); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); YAMLScalar parent = (YAMLScalar) psiElement.getParent(); Collection<String> values = new ArrayList<>(); YamlHelper.visitServiceCallArgument(parent, parameterVisitor -> values.add(parameterVisitor.getClassName() + ":" + parameterVisitor.getMethod() + ":" + parameterVisitor.getParameterIndex()) ); assertContainsElements(values, "Foo\\Bar:setBar:0"); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitServiceCallArgumentMethodIndex */ public void testVisitServiceCallArgumentMethodIndex() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " foobar:\n" + " class: Foo\\Bar\n" + " calls:\n" + " - [ 'setBar', [@f<caret>oo] ]\n" ); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); YAMLScalar parent = (YAMLScalar) psiElement.getParent(); Collection<Parameter> parameters = new ArrayList<>(); YamlHelper.visitServiceCallArgumentMethodIndex(parent, parameters::add); assertNotNull(ContainerUtil.find(parameters, parameter -> "arg1".equals(parameter.getName()))); } /** * @see fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper#visitServiceCallArgumentMethodIndex */ public void testVisitServiceCallArgumentMethodIndexForNamedServices() { myFixture.configureByText(YAMLFileType.YML, "services:\n" + " Foo\\Bar:\n" + " calls:\n" + " - [ 'setBar', ['@foo', @f<caret>oo] ]\n" ); PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); YAMLScalar parent = (YAMLScalar) psiElement.getParent(); Collection<Parameter> parameters = new ArrayList<>(); YamlHelper.visitServiceCallArgumentMethodIndex(parent, parameters::add); assertNotNull(ContainerUtil.find(parameters, parameter -> "arg2".equals(parameter.getName()))); } private static class ListYamlTagVisitor implements YamlTagVisitor { private List<YamlServiceTag> items = new ArrayList<YamlServiceTag>(); @Override public void visit(@NotNull YamlServiceTag args) { items.add(args); } public YamlServiceTag getItem(int pos) { return items.get(pos); } public YamlServiceTag getItem() { return items.get(0); } } }