Skip to content

Commit 752f64b

Browse files
committed
implement testing infrastructure on some basic test cases #405
1 parent b0321ea commit 752f64b

6 files changed

+386
-2
lines changed

symfony2-plugin.iml

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
<orderEntry type="library" scope="PROVIDED" name="php-openapi" level="project" />
1414
<orderEntry type="library" scope="PROVIDED" name="php" level="project" />
1515
<orderEntry type="library" scope="TEST" name="junit:junit:4.9" level="project" />
16+
<orderEntry type="library" scope="TEST" name="css-openapi" level="project" />
17+
<orderEntry type="library" scope="TEST" name="css" level="project" />
18+
<orderEntry type="library" scope="TEST" name="java-i18n" level="project" />
19+
<orderEntry type="library" scope="TEST" name="properties" level="project" />
1620
</component>
17-
</module>
18-
21+
</module>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package fr.adrienbrault.idea.symfony2plugin.tests;
2+
3+
import com.intellij.codeInsight.lookup.LookupElement;
4+
import com.intellij.codeInsight.lookup.LookupElementPresentation;
5+
import com.intellij.codeInsight.navigation.actions.GotoDeclarationHandler;
6+
import com.intellij.openapi.extensions.Extensions;
7+
import com.intellij.openapi.fileTypes.LanguageFileType;
8+
import com.intellij.psi.PsiElement;
9+
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
10+
import com.jetbrains.php.lang.psi.elements.Function;
11+
import com.jetbrains.php.lang.psi.elements.Method;
12+
import com.jetbrains.twig.TwigFileType;
13+
import fr.adrienbrault.idea.symfony2plugin.Settings;
14+
15+
import java.util.Arrays;
16+
import java.util.HashSet;
17+
import java.util.Set;
18+
19+
public abstract class SymfonyLightCodeInsightFixtureTestCase extends LightCodeInsightFixtureTestCase {
20+
21+
@Override
22+
public void setUp() throws Exception {
23+
super.setUp();
24+
Settings.getInstance(myFixture.getProject()).pluginEnabled = true;
25+
}
26+
27+
public void assertCompletionContains(LanguageFileType languageFileType, String configureByText, String... lookupStrings) {
28+
29+
myFixture.configureByText(languageFileType, configureByText);
30+
myFixture.completeBasic();
31+
32+
assertTrue(myFixture.getLookupElementStrings().containsAll(Arrays.asList(lookupStrings)));
33+
}
34+
35+
public void assertCompletionContains(String filename, String configureByText, String... lookupStrings) {
36+
37+
myFixture.configureByText(filename, configureByText);
38+
myFixture.completeBasic();
39+
40+
assertTrue(myFixture.getLookupElementStrings().containsAll(Arrays.asList(lookupStrings)));
41+
}
42+
43+
public void assertNavigationContains(LanguageFileType languageFileType, String configureByText, String targetShortcut) {
44+
myFixture.configureByText(languageFileType, configureByText);
45+
PsiElement psiElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
46+
assertNavigationContains(psiElement, targetShortcut);
47+
}
48+
49+
public void assertNavigationContains(PsiElement psiElement, String targetShortcut) {
50+
51+
if(!targetShortcut.startsWith("\\")) {
52+
targetShortcut = "\\" + targetShortcut;
53+
}
54+
55+
Set<String> classTargets = new HashSet<String>();
56+
57+
for (GotoDeclarationHandler gotoDeclarationHandler : Extensions.getExtensions(GotoDeclarationHandler.EP_NAME)) {
58+
PsiElement[] gotoDeclarationTargets = gotoDeclarationHandler.getGotoDeclarationTargets(psiElement, 0, myFixture.getEditor());
59+
if(gotoDeclarationTargets != null && gotoDeclarationTargets.length > 0) {
60+
61+
for (PsiElement gotoDeclarationTarget : gotoDeclarationTargets) {
62+
if(gotoDeclarationTarget instanceof Method) {
63+
64+
String meName = ((Method) gotoDeclarationTarget).getName();
65+
66+
String clName = ((Method) gotoDeclarationTarget).getContainingClass().getPresentableFQN();
67+
if(!clName.startsWith("\\")) {
68+
clName = "\\" + clName;
69+
}
70+
71+
classTargets.add(clName + "::" + meName);
72+
} else if(gotoDeclarationTarget instanceof Function) {
73+
classTargets.add("\\" + ((Function) gotoDeclarationTarget).getName());
74+
}
75+
}
76+
77+
}
78+
}
79+
80+
if(!classTargets.contains(targetShortcut)) {
81+
fail(String.format("failed that PsiElement (%s) navigate to %s", psiElement.toString(), targetShortcut));
82+
}
83+
84+
}
85+
86+
public void assertCompletionLookupTailIsEqual(LanguageFileType languageFileType, String configureByText, String lookupString, String tailText) {
87+
88+
myFixture.configureByText(languageFileType, configureByText);
89+
myFixture.completeBasic();
90+
91+
for (LookupElement lookupElement : myFixture.getLookupElements()) {
92+
93+
if(!lookupElement.getLookupString().equals(lookupString)) {
94+
continue;
95+
}
96+
97+
LookupElementPresentation presentation = new LookupElementPresentation();
98+
lookupElement.renderElement(presentation);
99+
100+
if(presentation.getTailText() == null) {
101+
fail(String.format("failed to check '%s'", lookupString));
102+
}
103+
104+
if(!presentation.getTailText().equals(tailText)) {
105+
fail(String.format("failed that on '%s' '%s' is equal '%s'", lookupString, tailText, presentation.getTailText()));
106+
}
107+
108+
return;
109+
110+
}
111+
112+
fail(String.format("failed to check '%s' because it's unknown", lookupString));
113+
}
114+
115+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package fr.adrienbrault.idea.symfony2plugin.tests.dic.xml;
2+
3+
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
4+
5+
import java.io.File;
6+
7+
/**
8+
* @author Daniel Espendiller <daniel@espendiller.net>
9+
* @see fr.adrienbrault.idea.symfony2plugin.config.xml.XmlCompletionContributor
10+
*/
11+
public class XmlDicCompletionContributorTest extends SymfonyLightCodeInsightFixtureTestCase {
12+
13+
public void setUp() throws Exception {
14+
super.setUp();
15+
myFixture.copyFileToProject("appDevDebugProjectContainer.xml");
16+
17+
myFixture.configureByText("classes.php", "<?php\n" +
18+
"namespace Foo\\Name;\n" +
19+
"class FooClass {}"
20+
);
21+
22+
}
23+
24+
public String getTestDataPath() {
25+
return new File(this.getClass().getResource("..").getFile()).getAbsolutePath();
26+
}
27+
28+
public void testServiceCompletion() {
29+
30+
assertCompletionContains("service.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
31+
"<container>\n" +
32+
" <services>\n" +
33+
" <argument type=\"service\" id=\"<caret>\"/>\n" +
34+
" </services>\n" +
35+
"</container>"
36+
, "data_collector.router"
37+
);
38+
39+
assertCompletionContains("service.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
40+
"<container>\n" +
41+
" <services>\n" +
42+
" <service factory-service=\"<caret>\"/>" +
43+
" </services>\n" +
44+
"</container>"
45+
, "data_collector.router"
46+
);
47+
48+
assertCompletionContains("service.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
49+
"<container>\n" +
50+
" <services>\n" +
51+
" <service parent=\"<caret>\"/>" +
52+
" </services>\n" +
53+
"</container>"
54+
, "data_collector.router"
55+
);
56+
57+
}
58+
59+
public void testClassCompletion() {
60+
61+
assertCompletionContains("service.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
62+
"<container>\n" +
63+
" <services>\n" +
64+
" <service id=\"genemu.twig.extension.form\" class=\"<caret>\"/>\n" +
65+
" </services>\n" +
66+
"</container>"
67+
, "FooClass"
68+
);
69+
70+
assertCompletionContains("service.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
71+
"<container>\n" +
72+
" <services>\n" +
73+
" <service factory-class=\"<caret>\"/>" +
74+
" </services>\n" +
75+
"</container>"
76+
, "FooClass"
77+
);
78+
79+
}
80+
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package fr.adrienbrault.idea.symfony2plugin.tests.dic.yaml;
2+
3+
import com.intellij.codeInsight.completion.CompletionType;
4+
import com.intellij.psi.search.GlobalSearchScope;
5+
import com.intellij.util.indexing.FileBasedIndexImpl;
6+
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.ServicesDefinitionStubIndex;
7+
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
8+
import org.jetbrains.yaml.YAMLFileType;
9+
10+
import java.io.File;
11+
import java.util.List;
12+
13+
/**
14+
* @author Daniel Espendiller <daniel@espendiller.net>
15+
* @see fr.adrienbrault.idea.symfony2plugin.config.yaml.YamlCompletionContributor
16+
*/
17+
public class YamlDicCompletionContributorTest extends SymfonyLightCodeInsightFixtureTestCase {
18+
19+
public void setUp() throws Exception {
20+
super.setUp();
21+
myFixture.copyFileToProject("appDevDebugProjectContainer.xml");
22+
23+
myFixture.configureByText("classes.php", "<?php\n" +
24+
"namespace Foo\\Name;\n" +
25+
"class FooClass {}"
26+
);
27+
28+
}
29+
30+
public String getTestDataPath() {
31+
return new File(this.getClass().getResource("..").getFile()).getAbsolutePath();
32+
}
33+
34+
public void testServiceCompletion() {
35+
36+
assertCompletionContains(YAMLFileType.YML, "@<caret>", "data_collector.router");
37+
38+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
39+
" foo:\n" +
40+
" arguments: [\"@<caret>\"] "
41+
, "data_collector.router"
42+
);
43+
44+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
45+
" foo:\n" +
46+
" arguments: ['@<caret>'] "
47+
, "data_collector.router"
48+
);
49+
50+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
51+
" foo:\n" +
52+
" arguments: [@<caret>] "
53+
, "data_collector.router"
54+
);
55+
56+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
57+
" my_service:\n" +
58+
" factory_service: <caret>\n"
59+
, "data_collector.router"
60+
);
61+
62+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
63+
" newsletter_manager:\n" +
64+
" parent: @<caret>\n"
65+
, "data_collector.router"
66+
);
67+
68+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
69+
" newsletter_manager:\n" +
70+
" parent: @<caret>\n"
71+
, "data_collector.router"
72+
);
73+
74+
}
75+
76+
public void testServiceStaticCompletion() {
77+
78+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
79+
" newsletter_manager:\n" +
80+
" @<caret>\n"
81+
, "arguments", "calls"
82+
);
83+
84+
}
85+
86+
public void testClassesCompletion() {
87+
88+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
89+
" espend_container_service.yaml:\n" +
90+
" class: <caret>\n"
91+
, "FooClass"
92+
);
93+
94+
assertCompletionLookupTailIsEqual(YAMLFileType.YML, "services:\n" +
95+
" espend_container_service.yaml:\n" +
96+
" class: <caret>\n"
97+
, "FooClass", " (Foo\\Name)"
98+
);
99+
100+
assertCompletionContains(YAMLFileType.YML, "services:\n" +
101+
" newsletter_manager:\n" +
102+
" factory_class: <caret>\n"
103+
, "FooClass"
104+
);
105+
106+
}
107+
108+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package fr.adrienbrault.idea.symfony2plugin.tests.templating;
2+
3+
import com.jetbrains.twig.TwigFileType;
4+
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
5+
6+
import java.io.File;
7+
8+
/**
9+
* @author Daniel Espendiller <daniel@espendiller.net>
10+
* @see com.jetbrains.twig.completion.TwigCompletionContributor
11+
*/
12+
public class TwigFilterCompletionContributorTest extends SymfonyLightCodeInsightFixtureTestCase {
13+
14+
public void setUp() throws Exception {
15+
super.setUp();
16+
myFixture.copyFileToProject("TwigFilterExtension.php");
17+
}
18+
19+
public String getTestDataPath() {
20+
return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath();
21+
}
22+
23+
public void testTwigExtensionFilterCompletion() {
24+
assertCompletionContains(TwigFileType.INSTANCE, "{{ 'test'|<caret> }}", "doctrine_minify_query", "doctrine_pretty_query");
25+
assertCompletionContains(TwigFileType.INSTANCE, "{{ 'test' | <caret> }}", "doctrine_minify_query", "doctrine_pretty_query");
26+
assertCompletionContains(TwigFileType.INSTANCE, "{{ 'test' | <caret> }}", "doctrine_minify_query", "doctrine_pretty_query");
27+
}
28+
29+
public void testTwigExtensionFilterNavigation() {
30+
assertNavigationContains(TwigFileType.INSTANCE, "{{ 'test'|<caret>doctrine_minify_query }}", "Doctrine\\Bundle\\DoctrineBundle\\Twig\\DoctrineExtension::minifyQuery");
31+
assertNavigationContains(TwigFileType.INSTANCE, "{{ 'test'|<caret>doctrine_pretty_query }}", "SqlFormatter::format");
32+
assertNavigationContains(TwigFileType.INSTANCE, "{{ 'test'|<caret>json_decode }}", "json_decode");
33+
}
34+
35+
public void testTwigExtensionLookupElementPresentable() {
36+
assertCompletionLookupTailIsEqual(TwigFileType.INSTANCE, "{{ 'test'|<caret> }}", "doctrine_minify_query", "(query)");
37+
assertCompletionLookupTailIsEqual(TwigFileType.INSTANCE, "{{ 'test'|<caret> }}", "doctrine_pretty_query", "()");
38+
39+
// test parameter strip
40+
assertCompletionLookupTailIsEqual(TwigFileType.INSTANCE, "{{ 'test'|<caret> }}", "contextAndEnvironment", "()");
41+
assertCompletionLookupTailIsEqual(TwigFileType.INSTANCE, "{{ 'test'|<caret> }}", "contextWithoutEnvironment", "()");
42+
}
43+
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace{
4+
interface Twig_ExtensionInterface {}
5+
interface Twig_Environment {}
6+
abstract class Twig_Extension implements Twig_ExtensionInterface {}
7+
class Twig_SimpleFilter {}
8+
class SqlFormatter {
9+
public function format() {}
10+
}
11+
}
12+
13+
namespace Doctrine\Bundle\DoctrineBundle\Twig;
14+
15+
class DoctrineExtension extends \Twig_Extension
16+
{
17+
18+
public function getFilters()
19+
{
20+
return array(
21+
new \Twig_SimpleFilter('doctrine_minify_query', array($this, 'minifyQuery')),
22+
new \Twig_SimpleFilter('doctrine_pretty_query', 'SqlFormatter::format'),
23+
new \Twig_SimpleFilter('contextAndEnvironment', array($this, 'minifyQuery'), array('needs_context' => true, 'needs_environment' => true)),
24+
new \Twig_SimpleFilter('contextWithoutEnvironment', array($this, 'minifyQuery'), array('needs_environment' => true)),
25+
new \Twig_SimpleFilter('json_decode', 'json_decode'),
26+
);
27+
}
28+
29+
public function minifyQuery($query) {}
30+
public function contextAndEnvironment(\Twig_Environment $env, $context, $string) {}
31+
public function contextWithoutEnvironment($context, $string) {}
32+
33+
}

0 commit comments

Comments
 (0)