package fr.adrienbrault.idea.symfony2plugin.tests.templating; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.patterns.PlatformPatterns; import com.jetbrains.twig.TwigFileType; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; /** * @author Daniel Espendiller <daniel@espendiller.net> * @see fr.adrienbrault.idea.symfony2plugin.templating.TwigTemplateCompletionContributor */ public class TwigTemplateCompletionContributorTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject("classes.php"); myFixture.copyFileToProject("TwigTemplateCompletionContributorTest.php"); myFixture.copyFileToProject("routing.xml"); } public String getTestDataPath() { return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath(); } /** * @see fr.adrienbrault.idea.symfony2plugin.templating.TwigTemplateCompletionContributor */ public void testBlockCompletion() { if(System.getenv("PHPSTORM_ENV") != null) return; createWorkaroundFile("app/Resources/views/block.html.twig", "{% block foo %}{% endblock %}"); assertCompletionContains(TwigFileType.INSTANCE, "{% extends '::block.html.twig' %}{% block <caret> %}", "foo"); assertCompletionContains(TwigFileType.INSTANCE, "{% extends '::block.html.twig' %}{% block \"<caret>\" %}", "foo"); assertCompletionContains(TwigFileType.INSTANCE, "{% extends '::block.html.twig' %}{% block '<caret>' %}", "foo"); assertCompletionNotContains(TwigFileType.INSTANCE, "" + "{% extends '::block.html.twig' %}\n" + "{% embed '::foobar.html.twig' %}\n" + " {% block '<caret>' %}\n" + "{% endembed %}\n", "foo" ); } public void testBlockCompletionForEmbed() { if(System.getenv("PHPSTORM_ENV") != null) return; createWorkaroundFile("app/Resources/views/embed.html.twig", "{% block foo_embed %}{% endblock %}"); assertCompletionContains(TwigFileType.INSTANCE, "" + "{% embed '::embed.html.twig' %}\n" + " {% block '<caret>' %}\n" + "{% endembed %}\n", "foo_embed" ); assertCompletionNotContains(TwigFileType.INSTANCE, "" + "{% block content %}{% endblock %}" + "{% embed '::embed.html.twig' %}\n" + " {% block '<caret>' %}" + "{% endembed %}", "content" ); } public void testThatInlineVarProvidesClassCompletion() { assertCompletionContains(TwigFileType.INSTANCE, "{# @var bar <caret> #}", "DateTime"); } public void testThatInlineVarProvidesClassCompletionDeprecated() { assertCompletionContains(TwigFileType.INSTANCE, "{# bar <caret> #}", "DateTime"); } public void testThatConstantProvidesCompletionForClassAndDefine() { assertCompletionContains(TwigFileType.INSTANCE, "{{ constant('<caret>') }}", "CONST_FOO"); } public void testCompletionForRoutingParameter() { assertCompletionContains(TwigFileType.INSTANCE, "{{ path('xml_route', {'<caret>']) }}", "slug"); assertNavigationMatch(TwigFileType.INSTANCE, "{{ path('xml_route', {'sl<caret>ug']) }}", PlatformPatterns.psiElement()); } public void testInsertHandlerForTwigFunctionWithStringParameter() { assertCompletionResultEquals(TwigFileType.INSTANCE, "{{ a_test<caret> }}", "{{ a_test('') }}"); assertCompletionResultEquals(TwigFileType.INSTANCE, "{{ b_test<caret> }}", "{{ b_test('') }}"); assertCompletionResultEquals(TwigFileType.INSTANCE, "{{ c_test<caret> }}", "{{ c_test('') }}"); assertCompletionResultEquals(TwigFileType.INSTANCE, "{{ d_test<caret> }}", "{{ d_test() }}"); } public void testThatMacroSelfImportProvidesCompletion() { // skip for _self resolving issue if(true) return; assertCompletionContains(TwigFileType.INSTANCE, "" + "{% from _self import <caret> %}\n" + "{% macro foobar(foobar) %}{% endmacro %}\n", "foobar" ); } public void testThatMacroImportProvidesCompletion() { assertCompletionContains(TwigFileType.INSTANCE, "" + "{% import _self as foobar1 %}\n" + "{% macro foobar(foobar) %}{% endmacro %}\n" + "{{ foobar1.<caret> }}\n", "foobar" ); } private void createWorkaroundFile(@NotNull String file, @NotNull String content) { try { createDummyFiles(file); } catch (Exception e) { e.printStackTrace(); } // build pseudo file with block final VirtualFile relativeFile = VfsUtil.findRelativeFile(getProject().getBaseDir(), file.split("/")); ApplicationManager.getApplication().runWriteAction(() -> { try { relativeFile.setBinaryContent(content.getBytes()); } catch (IOException e2) { e2.printStackTrace(); } relativeFile.refresh(false, false); }); } }