package fr.adrienbrault.idea.symfony2plugin.tests;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.twig.TwigFile;
import com.jetbrains.twig.TwigFileType;
import com.jetbrains.twig.TwigLanguage;
import com.jetbrains.twig.elements.*;
import fr.adrienbrault.idea.symfony2plugin.TwigHelper;
import fr.adrienbrault.idea.symfony2plugin.templating.dict.TwigBlock;
import fr.adrienbrault.idea.symfony2plugin.templating.dict.TwigMacroTagInterface;
import fr.adrienbrault.idea.symfony2plugin.templating.path.TwigPath;
import fr.adrienbrault.idea.symfony2plugin.templating.path.TwigPathIndex;
import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.yaml.YAMLFileType;
import org.jetbrains.yaml.psi.YAMLFile;
import java.util.Arrays;
import java.util.Collection;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*
* @see fr.adrienbrault.idea.symfony2plugin.TwigHelper#getIncludeTagStrings
* @see fr.adrienbrault.idea.symfony2plugin.TwigHelper#getBlocksInFile
*/
public class TwigHelperTest extends SymfonyLightCodeInsightFixtureTestCase {
public void testSingleExtends() {
assertEquals("::base.html.twig", buildExtendsTagList("{% extends '::base.html.twig' %}").iterator().next());
assertEquals("::base.html.twig", buildExtendsTagList("{% extends \"::base.html.twig\" %}").iterator().next());
assertEquals("::base.html.twig", buildExtendsTagList("{%extends \"::base.html.twig\"%}").iterator().next());
}
public void testSingleExtendsInvalid() {
assertSize(0, buildExtendsTagList("{% extends ~ '::base.html.twig' %}"));
assertSize(0, buildExtendsTagList("{% extends foo ~ '::base.html.twig' %}"));
}
public void testSingleBlank() {
assertSize(0, buildExtendsTagList("{% extends '' %}"));
assertSize(0, buildExtendsTagList("{% extends \"\" %}"));
}
public void testConditional() {
Collection<String> twigExtendsValues = buildExtendsTagList("{% extends request.ajax ? \"base_ajax.html\" : \"base.html\" %}");
assertTrue(twigExtendsValues.contains("base_ajax.html"));
assertTrue(twigExtendsValues.contains("base.html"));
twigExtendsValues = buildExtendsTagList("{% extends request.ajax ? 'base_ajax.html' : 'base.html' %}");
assertTrue(twigExtendsValues.contains("base_ajax.html"));
assertTrue(twigExtendsValues.contains("base.html"));
twigExtendsValues = buildExtendsTagList("{%extends request.ajax?'base_ajax.html':'base.html'%}");
assertTrue(twigExtendsValues.contains("base_ajax.html"));
assertTrue(twigExtendsValues.contains("base.html"));
}
public void testConditionalBlank() {
assertSize(0, buildExtendsTagList("{% extends ? '' : '' %}"));
assertSize(0, buildExtendsTagList("{% extends ? \"\" : \"\" %}"));
}
public void testConditionalInvalidGiveBestPossibleStrings() {
Collection<String> twigExtendsValues = buildExtendsTagList("{% extends request.ajax ? foo ~ \"base_ajax.html\" : \"base.html\" %}");
assertFalse(twigExtendsValues.contains("base_ajax.html"));
assertTrue(twigExtendsValues.contains("base.html"));
twigExtendsValues = buildExtendsTagList("{% extends request.ajax ? \"base_ajax.html\" ~ test : \"base.html\" %}");
assertFalse(twigExtendsValues.contains("base_ajax.html"));
assertTrue(twigExtendsValues.contains("base.html"));
twigExtendsValues = buildExtendsTagList("{% extends request.ajax ? foo ~ \"base_ajax.html\" : ~ \"base.html\" %}");
assertFalse(twigExtendsValues.contains("base_ajax.html"));
assertFalse(twigExtendsValues.contains("base.html"));
twigExtendsValues = buildExtendsTagList("{% extends request.ajax ? \"base_ajax.html\" : ~ \"base.html\" %}");
assertTrue(twigExtendsValues.contains("base_ajax.html"));
assertFalse(twigExtendsValues.contains("base.html"));
}
public void testBlocksInFileCollector() {
assertEquals("foo", buildBlocks("{% block foo %}").iterator().next().getName());
assertEquals("foo", buildBlocks("{% block \"foo\" %}").iterator().next().getName());
assertEquals("foo", buildBlocks("{% block 'foo' %}").iterator().next().getName());
assertEquals("foo", buildBlocks("{%- block foo -%}").iterator().next().getName());
assertEquals("foo", buildBlocks("{%- block \"foo\" -%}").iterator().next().getName());
assertEquals("foo", buildBlocks("{%- block 'foo' -%}").iterator().next().getName());
assertNotNull(buildBlocks("{%- block 'foo' -%}").iterator().next().getPsiFile());
assertSize(1, buildBlocks("{%- block 'foo' -%}").iterator().next().getBlock());
}
/**
* @see TwigHelper#getIncludeTagStrings
*/
public void testIncludeTagStrings() {
assertEqual(getIncludeTemplates("{% include 'foo.html.twig' %}"), "foo.html.twig");
assertSize(0, getIncludeTemplates("{% include '' %}"));
assertEqual(getIncludeTemplates("{% include ['foo.html.twig'] %}"), "foo.html.twig");
assertEqual(getIncludeTemplates("{% include ['foo.html.twig',''] %}"), "foo.html.twig");
assertEqual(getIncludeTemplates(
"{% include ['foo.html.twig', 'foo_1.html.twig', , ~ 'foo_2.html.twig', 'foo_3.html.twig' ~, 'foo' ~ 'foo_4.html.twig', 'end.html.twig'] %}"),
"foo.html.twig", "foo_1.html.twig", "end.html.twig"
);
}
/**
* @see TwigHelper#getIncludeTagStrings
*/
public void testIncludeTagStringsTernary() {
assertEqual(getIncludeTemplates("{% include ajax ? 'include_statement_0.html.twig' : \"include_statement_1.html.twig\" %}"), "include_statement_0.html.twig", "include_statement_1.html.twig");
assertEqual(getIncludeTemplates("{% include ajax ? 'include_statem' ~ 'aa' ~ 'ent_0.html.twig' : 'include_statement_1.html.twig' %}"), "include_statement_1.html.twig");
assertEqual(getIncludeTemplates("{% include ajax ? 'include_statement_0.html.twig' : ~ 'include_statement_1.html.twig' %}"), "include_statement_0.html.twig");
assertSize(0, getIncludeTemplates("{% include ajax ? 'include_statement_0.html.twig' ~ : ~ 'include_statement_1.html.twig' %}"));
}
/**
* @see TwigHelper#getIncludeTagStrings
*/
public void testIncludeTagNonAllowedTags() {
assertSize(0, getIncludeTemplates("{% from 'foo.html.twig' %}", TwigElementTypes.IMPORT_TAG));
assertSize(0, getIncludeTemplates("{% import 'foo.html.twig' %}", TwigElementTypes.IMPORT_TAG));
}
/**
* @see TwigHelper#getTwigPathFromYamlConfig
*/
public void testGetTwigPathFromYamlConfig() {
String content = "twig:\n" +
" paths:\n" +
" \"%kernel.root_dir%/../src/views\": core\n" +
" \"%kernel.root_dir%/../src/views2\": 'core2'\n" +
" \"%kernel.root_dir%/../src/views3\": \"core3\"\n" +
" \"%kernel.root_dir%/../src/views4\": ~\n" +
" \"%kernel.root_dir%/../src/views5\": \n" +
" \"%kernel.root_dir%/..//src/views\": core8\n" +
" \"%kernel.root_dir%/..\\src/views\": core9\n"
;
YAMLFile fileFromText = (YAMLFile) PsiFileFactory.getInstance(getProject())
.createFileFromText("DUMMY__." + YAMLFileType.YML.getDefaultExtension(), YAMLFileType.YML, content, System.currentTimeMillis(), false);
Collection<Pair<String, String>> map = TwigHelper.getTwigPathFromYamlConfig(fileFromText);
assertNotNull(ContainerUtil.find(map, pair ->
pair.getFirst().equals("core") && pair.getSecond().equals("%kernel.root_dir%/../src/views")
));
assertNotNull(ContainerUtil.find(map, pair ->
pair.getFirst().equals("core2") && pair.getSecond().equals("%kernel.root_dir%/../src/views2")
));
assertNotNull(ContainerUtil.find(map, pair ->
pair.getFirst().equals("core3") && pair.getSecond().equals("%kernel.root_dir%/../src/views3")
));
assertNotNull(ContainerUtil.find(map, pair ->
pair.getFirst().equals("") && pair.getSecond().equals("%kernel.root_dir%/../src/views4")
));
assertNotNull(ContainerUtil.find(map, pair ->
pair.getFirst().equals("") && pair.getSecond().equals("%kernel.root_dir%/../src/views5")
));
assertNotNull(ContainerUtil.find(map, pair ->
pair.getFirst().equals("core8") && pair.getSecond().equals("%kernel.root_dir%/../src/views")
));
assertNotNull(ContainerUtil.find(map, pair ->
pair.getFirst().equals("core9") && pair.getSecond().equals("%kernel.root_dir%/../src/views")
));
}
/**
* @see TwigHelper#getBlockTagPattern
*/
public void testGetBlockTagPattern() {
String[] blocks = {
"{% block 'a<caret>a' %}",
"{% block \"a<caret>a\" %}",
"{% block a<caret>a %}"
};
for (String s : blocks) {
myFixture.configureByText(TwigFileType.INSTANCE, s);
assertTrue(TwigHelper.getBlockTagPattern().accepts(
myFixture.getFile().findElementAt(myFixture.getCaretOffset()))
);
}
}
/**
* @see TwigHelper#getBlockTagPattern
*/
public void testGetAutocompletableAssetPattern() {
myFixture.configureByText(TwigFileType.INSTANCE, "{{ asset('bundles/<caret>test/img/' ~ entity.img ~ '.png') }}");
assertFalse(TwigHelper.getAutocompletableAssetPattern().accepts(
myFixture.getFile().findElementAt(myFixture.getCaretOffset()
)));
myFixture.configureByText(TwigFileType.INSTANCE, "{{ asset('bundles/<caret>test/img/') }}");
assertTrue(TwigHelper.getAutocompletableAssetPattern().accepts(
myFixture.getFile().findElementAt(myFixture.getCaretOffset())
));
}
/**
* @see TwigHelper#getUniqueTwigTemplatesList
*/
public void testGetUniqueTwigTemplatesList() {
assertSize(1, TwigHelper.getUniqueTwigTemplatesList(Arrays.asList(
new TwigPath("path/", "path"),
new TwigPath("path\\", "path")
)));
assertSize(1, TwigHelper.getUniqueTwigTemplatesList(Arrays.asList(
new TwigPath("path", "path"),
new TwigPath("path", "path")
)));
assertSize(2, TwigHelper.getUniqueTwigTemplatesList(Arrays.asList(
new TwigPath("path/a", "path"),
new TwigPath("foobar", "path")
)));
assertSize(2, TwigHelper.getUniqueTwigTemplatesList(Arrays.asList(
new TwigPath("path", "path", TwigPathIndex.NamespaceType.BUNDLE),
new TwigPath("path", "path")
)));
}
/**
* @see TwigHelper#getPrintBlockOrTagFunctionPattern
*/
public void testGetPrintBlockOrTagFunctionPattern() {
assertTrue(TwigHelper.getPrintBlockOrTagFunctionPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar('f<caret>o') }}")
));
assertTrue(TwigHelper.getPrintBlockOrTagFunctionPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{% if foobar('f<caret>o') %}")
));
assertTrue(TwigHelper.getPrintBlockOrTagFunctionPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{% set foo = foobar('f<caret>o') %}")
));
assertTrue(TwigHelper.getPrintBlockOrTagFunctionPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{% elseif foobar('f<caret>o') %}")
));
assertTrue(TwigHelper.getPrintBlockOrTagFunctionPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{% else foobar('f<caret>o') %}")
));
}
/**
* @see TwigHelper#getFunctionWithFirstParameterAsArrayPattern
*/
public void testGetFunctionWithFirstParameterAsArrayPattern() {
assertTrue(TwigHelper.getFunctionWithFirstParameterAsArrayPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar(['fo<caret>o']) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsArrayPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar(['foo', 'fo<caret>o']) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsArrayPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar([\"foo\", \"fo<caret>o\"]) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsArrayPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar ( [ 'foo' , 'fo<caret>o']) }}")
));
}
/**
* @see TwigHelper#getFunctionWithFirstParameterAsLiteralPattern
*/
public void testFunctionWithFirstParameterAsLiteralPattern() {
assertTrue(TwigHelper.getFunctionWithFirstParameterAsLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({'f<caret>o'}) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar ( { 'f<caret>o'}) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({'foo', 'f<caret>o'}) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({\"f<caret>o\"}) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({\"foo\", \"f<caret>o\"}) }}")
));
}
/**
* @see TwigHelper#getFunctionWithFirstParameterAsKeyLiteralPattern
*/
public void testGetFunctionWithFirstParameterAsKeyLiteralPattern() {
assertTrue(TwigHelper.getFunctionWithFirstParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({'foo': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({'foo': 'foobar', 'fo': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithFirstParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({'foo': 'foobar' ~ 'foobar' , 'f<caret>o': 'foobar'}) }}")
));
assertFalse(TwigHelper.getFunctionWithFirstParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({'fo': 'f<caret>d'}) }}")
));
assertFalse(TwigHelper.getFunctionWithFirstParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar({}, 'a<caret>a'}")
));
assertFalse(TwigHelper.getFunctionWithFirstParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar( {foo({}, 'a<caret>a'}} )")
));
}
/**
* @see TwigHelper#getFunctionWithSecondParameterAsKeyLiteralPattern
*/
public void testGetFunctionWithSecondParameterAsKeyLiteralPattern() {
assertTrue(TwigHelper.getFunctionWithSecondParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar(12, {'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithSecondParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar(12, {'foobar': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithSecondParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar(foo.foo, {'foobar': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithSecondParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar('foo', {'foobar': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithSecondParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar(\"foo\", {'foobar': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getFunctionWithSecondParameterAsKeyLiteralPattern("foobar").accepts(
findElementAt(TwigFileType.INSTANCE, "{{ foobar('f' ~ 'oo', {'foobar': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
}
/**
* @see TwigHelper#getPathAfterLeafPattern
*/
public void testGetPathAfterLeafPattern() {
assertTrue(TwigHelper.getPathAfterLeafPattern().accepts(
findElementAt(TwigFileType.INSTANCE, "{{ path('foo', {'f<caret>o'}) }}")
));
assertTrue(TwigHelper.getPathAfterLeafPattern().accepts(
findElementAt(TwigFileType.INSTANCE, "{{ path('foo', {'foobar': 'foobar', 'f<caret>o': 'foobar'}) }}")
));
assertTrue(TwigHelper.getPathAfterLeafPattern().accepts(
findElementAt(TwigFileType.INSTANCE, "{{ path('foo', {'f': 'f', 'f': 'f', 'f<caret>a': 'f'}) }}")
));
}
/**
* @see TwigHelper#getMatchingRouteNameOnParameter
*/
public void testGetMatchingRouteNameOnParameter() {
assertEquals(
"foo",
TwigHelper.getMatchingRouteNameOnParameter(findElementAt(TwigFileType.INSTANCE, "{{ path('foo', {'f<caret>o'}) }}"))
);
assertEquals(
"foo",
TwigHelper.getMatchingRouteNameOnParameter(findElementAt(TwigFileType.INSTANCE, "{{ path('foo', {'f': 'f', 'f': 'f', 'f<caret>a': 'f'}) }}"))
);
assertNull(
TwigHelper.getMatchingRouteNameOnParameter(findElementAt(TwigFileType.INSTANCE, "{{ path('foo' ~ 'foo', {'f<caret>o'}) }}"))
);
}
/**
* @see TwigHelper#getParameterAsStringPattern
*/
public void testGetParameterAsStringPattern() {
assertTrue(
TwigHelper.getParameterAsStringPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ path('foo', 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getParameterAsStringPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ path('foo', 'f<caret>o', null) }}"))
);
assertFalse(
TwigHelper.getParameterAsStringPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ path('f<caret>o') }}"))
);
}
/**
* @see TwigHelper#getTransDomainPattern
*/
public void testGetTransDomainPattern() {
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|trans({}, 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|trans([], 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|trans(null, 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|transchoice(2, {}, 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|transchoice(2, null, 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|transchoice(2, [], 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|transchoice(test.test, [], 'f<caret>o') }}"))
);
assertTrue(
TwigHelper.getTransDomainPattern().accepts(findElementAt(TwigFileType.INSTANCE, "{{ ''|transchoice(test ~ 'test', [], 'f<caret>o') }}"))
);
}
/**
* @see TwigHelper#normalizeTemplateName
*/
public void testNormalizeTemplateName() {
assertEquals("BarBundle:Foo/steps:step_finish.html.twig", TwigHelper.normalizeTemplateName("BarBundle:Foo:steps/step_finish.html.twig"));
assertEquals("BarBundle:Foo/steps:step_finish.html.twig", TwigHelper.normalizeTemplateName("BarBundle:Foo/steps:step_finish.html.twig"));
assertEquals("BarBundle:Foo/steps:step_finish.html.twig", TwigHelper.normalizeTemplateName("BarBundle::Foo/steps/step_finish.html.twig"));
assertEquals("@BarBundle/Foo/steps:step_finish.html.twig", TwigHelper.normalizeTemplateName("@BarBundle/Foo/steps:step_finish.html.twig"));
assertEquals("step_finish.html.twig", TwigHelper.normalizeTemplateName("step_finish.html.twig"));
assertEquals("BarBundle:Foo/steps:step_finish.html.twig", TwigHelper.normalizeTemplateName("BarBundle:Foo:steps\\step_finish.html.twig"));
assertEquals("@BarBundle/Foo/steps:step_finish.html.twig", TwigHelper.normalizeTemplateName("@BarBundle\\Foo/steps:step_finish.html.twig"));
}
/**
* @see TwigHelper#getDomainFromTranslationTag
*/
public void testGetDomainFromTranslationTag() {
assertEquals("app", TwigHelper.getDomainFromTranslationTag(
(TwigCompositeElement) TwigElementFactory.createPsiElement(getProject(), "{% trans with {'%name%': 'Fabien'} from \"app\" %}", TwigElementTypes.TAG)
));
assertEquals("app", TwigHelper.getDomainFromTranslationTag(
(TwigCompositeElement) TwigElementFactory.createPsiElement(getProject(), "{% transchoice count with {'%name%': 'Fabien'} from 'app' %}", TwigElementTypes.TAG)
));
}
public void testGetMacros() {
PsiFile psiFile = myFixture.configureByText(TwigFileType.INSTANCE, "" +
"{% macro input(name, value, type, size) %}{% endmacro %}\n" +
"{% macro foobar %}{% endmacro %}\n" +
"{% if foobar %}{% macro foobar_if %}{% endmacro %}{% endif %}"
);
Collection<TwigMacroTagInterface> macros = TwigUtil.getMacros(psiFile);
assertEquals(
"(name, value, type, size)",
macros.stream().filter(twigMacroTag -> "input".equals(twigMacroTag.getName())).findFirst().get().getParameters()
);
assertNull(
macros.stream().filter(twigMacroTag -> "foobar".equals(twigMacroTag.getName())).findFirst().get().getParameters()
);
assertNull(
macros.stream().filter(twigMacroTag -> "foobar_if".equals(twigMacroTag.getName())).findFirst().get().getParameters()
);
}
private void assertEqual(Collection<String> c, String... values) {
if(!StringUtils.join(c, ",").equals(StringUtils.join(Arrays.asList(values), ","))) {
fail(String.format("Fail that '%s' is equal '%s'", StringUtils.join(c, ","), StringUtils.join(Arrays.asList(values), ",")));
}
}
private Collection<String> buildExtendsTagList(String string) {
return TwigHelper.getTwigExtendsTagTemplates((TwigExtendsTag) TwigElementFactory.createPsiElement(getProject(), string, TwigElementTypes.EXTENDS_TAG));
}
private Collection<TwigBlock> buildBlocks(String content) {
return TwigHelper.getBlocksInFile((TwigFile) PsiFileFactory.getInstance(getProject()).createFileFromText("DUMMY__." + TwigFileType.INSTANCE.getDefaultExtension(), TwigFileType.INSTANCE, content, System.currentTimeMillis(), false));
}
private Collection<String> getIncludeTemplates(@NotNull String content) {
return getIncludeTemplates(content, TwigElementTypes.INCLUDE_TAG);
}
private Collection<String> getIncludeTemplates(@NotNull String content, @NotNull final IElementType type) {
return TwigHelper.getIncludeTagStrings((TwigTagWithFileReference) TwigElementFactory.createPsiElement(getProject(), content, type));
}
}