Skip to content

Commit a7a605f

Browse files
author
Vitaliy
authored
Merge pull request #477 from magento/40-linemarkers-for-test-fixtures
Added linemarkers for test fixtures
2 parents f79a8b9 + c12b417 commit a7a605f

File tree

8 files changed

+209
-0
lines changed

8 files changed

+209
-0
lines changed

resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
<codeInsight.lineMarkerProvider language="PHP" implementationClass="com.magento.idea.magento2plugin.linemarker.php.PluginTargetLineMarkerProvider"/>
144144
<codeInsight.lineMarkerProvider language="PHP" implementationClass="com.magento.idea.magento2plugin.linemarker.php.ClassConfigurationLineMarkerProvider"/>
145145
<codeInsight.lineMarkerProvider language="PHP" implementationClass="com.magento.idea.magento2plugin.linemarker.php.WebApiLineMarkerProvider"/>
146+
<codeInsight.lineMarkerProvider language="PHP" implementationClass="com.magento.idea.magento2plugin.linemarker.php.TestFixtureLineMarkerProvider"/>
146147

147148
<directoryProjectConfigurator implementation="com.magento.idea.magento2plugin.project.ProjectDetector"/>
148149

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.indexes;
7+
8+
import com.intellij.openapi.project.Project;
9+
import com.intellij.psi.PsiFile;
10+
import com.intellij.psi.search.FilenameIndex;
11+
import com.intellij.psi.search.GlobalSearchScope;
12+
import com.jetbrains.php.lang.psi.PhpFile;
13+
import com.magento.idea.magento2plugin.magento.files.TestFixture;
14+
import com.magento.idea.magento2plugin.magento.packages.File;
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
import org.jetbrains.annotations.NotNull;
18+
19+
public final class FixtureIndex {
20+
private final Project project;
21+
22+
public FixtureIndex(final Project project) {
23+
this.project = project;
24+
}
25+
26+
/**
27+
* Getter for data fixtures.
28+
*/
29+
public List<PhpFile> getDataFixtures(final String fixtureIdentifier) {
30+
final List<PhpFile> result = new ArrayList<>();
31+
32+
final String[] fixturePathParts = fixtureIdentifier.split(File.separator);
33+
final String fixtureName = fixturePathParts[fixturePathParts.length - 1];
34+
final String exactFilePath = TestFixture.FIXTURES_LOCATION.concat(fixtureIdentifier);
35+
36+
@NotNull final PsiFile[] psiFiles = FilenameIndex.getFilesByName(
37+
project,
38+
fixtureName,
39+
GlobalSearchScope.allScope(project)
40+
);
41+
42+
for (final PsiFile psiFile: psiFiles) {
43+
@NotNull final String filePath = psiFile.getVirtualFile().getPath();
44+
if (!filePath.contains(TestFixture.FIXTURES_EXCLUDE_PATH)
45+
&& filePath.contains(exactFilePath)) {
46+
result.add((PhpFile) psiFile);
47+
}
48+
}
49+
50+
return result;
51+
}
52+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.linemarker.php;
7+
8+
import com.intellij.codeInsight.daemon.LineMarkerInfo;
9+
import com.intellij.codeInsight.daemon.LineMarkerProvider;
10+
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
11+
import com.intellij.psi.PsiElement;
12+
import com.intellij.psi.util.PsiTreeUtil;
13+
import com.jetbrains.php.PhpIcons;
14+
import com.jetbrains.php.lang.documentation.phpdoc.psi.tags.PhpDocTag;
15+
import com.jetbrains.php.lang.psi.PhpFile;
16+
import com.magento.idea.magento2plugin.indexes.FixtureIndex;
17+
import com.magento.idea.magento2plugin.magento.files.TestFixture;
18+
import com.magento.idea.magento2plugin.project.Settings;
19+
import java.util.ArrayList;
20+
import java.util.Collection;
21+
import java.util.List;
22+
import org.jetbrains.annotations.NotNull;
23+
import org.jetbrains.annotations.Nullable;
24+
25+
public class TestFixtureLineMarkerProvider implements LineMarkerProvider {
26+
27+
@Nullable
28+
@Override
29+
public LineMarkerInfo getLineMarkerInfo(final @NotNull PsiElement psiElement) {
30+
return null;
31+
}
32+
33+
@Override
34+
public void collectSlowLineMarkers(
35+
final @NotNull List<? extends PsiElement> elements,
36+
final @NotNull Collection<? super LineMarkerInfo<?>> result
37+
) {
38+
if (elements.isEmpty() || !Settings.isEnabled(elements.get(0).getProject())) {
39+
return;
40+
}
41+
final FixtureIndex fixtureIndex = new FixtureIndex(elements.get(0).getProject());
42+
final List<PhpFile> results = new ArrayList();
43+
for (final PsiElement psiElement: elements) {
44+
if (psiElement instanceof PhpDocTag) {
45+
@NotNull final String tagName = ((PhpDocTag) psiElement).getName();
46+
if (!tagName.equals(TestFixture.PHP_DOC_TAG_NAME)
47+
&& !tagName.equals(TestFixture.PHP_DOC_TAG_NAME_API)) {
48+
continue;
49+
}
50+
@NotNull final String tagValue = ((PhpDocTag) psiElement).getTagValue();
51+
if (tagValue.isEmpty()) {
52+
continue;
53+
}
54+
55+
final List<PhpFile> dataFixtures = fixtureIndex.getDataFixtures(tagValue);
56+
57+
if (dataFixtures.isEmpty()) {
58+
continue;
59+
}
60+
61+
results.addAll(dataFixtures);
62+
63+
final String tooltipText = "Navigate to fixtures";
64+
final NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder
65+
.create(PhpIcons.PHP_FILE)
66+
.setTargets(results)
67+
.setTooltipText(tooltipText);
68+
69+
result.add(builder.createLineMarkerInfo(PsiTreeUtil.getDeepestFirst(psiElement)));
70+
}
71+
}
72+
}
73+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.magento.files;
7+
8+
@SuppressWarnings({
9+
"PMD.ClassNamingConventions"
10+
})
11+
public class TestFixture {
12+
public static final String PHP_DOC_TAG_NAME = "@magentoDataFixture";
13+
public static final String PHP_DOC_TAG_NAME_API = "@magentoApiDataFixture";
14+
public static final String FIXTURES_LOCATION = "dev/tests/integration/testsuite/";
15+
public static final String FIXTURES_EXCLUDE_PATH = "vendor";
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Catalog\Service;
8+
9+
class Test
10+
{
11+
/**
12+
* @magentoApiDataFixture Magento/Catalog/_files/test_fixture.php
13+
*/
14+
public function testFoo()
15+
{
16+
}
17+
}
18+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Catalog\Service;
8+
9+
class Test
10+
{
11+
/**
12+
* @magentoDataFixture Magento/Catalog/_files/test_fixture.php
13+
*/
14+
public function testFoo()
15+
{
16+
}
17+
}
18+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?php
2+
//test fixture
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.linemarker.php;
7+
8+
import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase;
9+
10+
public class TestFixtureLinemarkerRegistrarTest extends LinemarkerFixtureTestCase {
11+
12+
/**
13+
* Tests linemarkers for @magentoDataFixture tag.
14+
*/
15+
public void testMagentoDataFixtureHaveLinemarker() {
16+
myFixture.configureByFile(this.getFixturePath("Test.php", "php"));
17+
18+
assertHasLinemarkerWithTooltipAndIcon("Navigate to fixtures", "icons/php-icon.svg");
19+
}
20+
21+
/**
22+
* Tests linemarkers for @magentoApiDataFixture tag.
23+
*/
24+
public void testMagentoApiDataFixtureHaveLinemarker() {
25+
myFixture.configureByFile(this.getFixturePath("Test.php", "php"));
26+
27+
assertHasLinemarkerWithTooltipAndIcon("Navigate to fixtures", "icons/php-icon.svg");
28+
}
29+
}

0 commit comments

Comments
 (0)