Skip to content

Improve atoum test detection in file #82

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jan 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
sudo: false
language: java
dist: precise
dist: trusty
Copy link
Member Author

@vdechenaux vdechenaux Sep 25, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le build passait pas sur precise, y avait un probleme avec Ant

jdk:
- oraclejdk8

Expand Down
4 changes: 1 addition & 3 deletions src/org/atoum/intellij/plugin/atoum/AtoumIconProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@
import com.jetbrains.php.lang.psi.PhpFile;
import javax.swing.Icon;

import com.jetbrains.php.lang.psi.elements.PhpClass;
import org.jetbrains.annotations.NotNull;

public class AtoumIconProvider extends IconProvider {

public Icon getIcon(@NotNull PsiElement element, @IconFlags int flags) {
if (element instanceof PhpFile) {
PhpClass firstClass = Utils.getFirstClassFromFile((PhpFile) element);
if (firstClass != null && Utils.isClassAtoumTest(firstClass)) {
if (Utils.getFirstTestClassFromFile((PhpFile) element) != null) {
return Icons.ATOUM_FILE;
}
}
Expand Down
47 changes: 46 additions & 1 deletion src/org/atoum/intellij/plugin/atoum/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.psi.PhpFile;
import com.jetbrains.php.lang.psi.elements.ClassReference;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.Nullable;
Expand All @@ -17,7 +18,38 @@ public class Utils {

public static Boolean isClassAtoumTest(PhpClass checkedClass)
{
return checkedClass.getNamespaceName().toLowerCase().contains(getTestsNamespaceSuffix().toLowerCase());
// First, we check if the class is in the units tests namespace
if (!checkedClass.getNamespaceName().toLowerCase().contains(getTestsNamespaceSuffix().toLowerCase())) {
return false;
}

if (checkedClass.isAbstract() || checkedClass.isInterface()) {
return false;
}

// We also check if the class extends atoum
PhpClass loopCheckedClass = checkedClass;
while (loopCheckedClass.getSuperClass() != null) {
PhpClass parent = loopCheckedClass.getSuperClass();
if (parent.getFQN().equals("\\atoum")) {
return true;
}
loopCheckedClass = parent;
}

// We try with another method to check, if the project does not have atoum/stubs
do {
List<ClassReference> extendsList = checkedClass.getExtendsList().getReferenceElements();
if (extendsList.iterator().hasNext()) {
ClassReference ref = extendsList.iterator().next();
if (ref.getFQN() != null && ref.getFQN().equals("\\atoum")) {
return true;
}
}
checkedClass = checkedClass.getSuperClass();
} while (checkedClass != null);

return false;
}

@Nullable
Expand Down Expand Up @@ -98,4 +130,17 @@ public static PhpClass getFirstClassFromFile(PhpFile phpFile) {
Collection<PhpClass> phpClasses = PsiTreeUtil.collectElementsOfType(phpFile, PhpClass.class);
return phpClasses.size() == 0 ? null : phpClasses.iterator().next();
}

@Nullable
public static PhpClass getFirstTestClassFromFile(PhpFile phpFile) {
Collection<PhpClass> phpClasses = PsiTreeUtil.collectElementsOfType(phpFile, PhpClass.class);

for (PhpClass phpClass:phpClasses) {
if (isClassAtoumTest(phpClass)) {
return phpClass;
}
}

return null;
}
}
17 changes: 11 additions & 6 deletions src/org/atoum/intellij/plugin/atoum/actions/Run.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,16 +126,21 @@ protected PhpClass getCurrentTestClass(AnActionEvent e) {
}
PhpFile phpFile = ((PhpFile) psiFile);

PhpClass currentClass = Utils.getFirstClassFromFile(phpFile);
if (null == currentClass) {
return null;
PhpClass currentClass = Utils.getFirstTestClassFromFile(phpFile);

if (currentClass != null) {
// The file contains a test class, use it
return currentClass;
}

if (!Utils.isClassAtoumTest(currentClass)) {
return Utils.locateTestClass(e.getProject(), currentClass);
// There is no tests in this file, maybe this is a php class
currentClass = Utils.getFirstClassFromFile(phpFile);
if (null == currentClass) {
return null;
}

return currentClass;
// This is a PHP class, find its test
return Utils.locateTestClass(e.getProject(), currentClass);
}

@Nullable
Expand Down
15 changes: 9 additions & 6 deletions src/org/atoum/intellij/plugin/atoum/actions/SwitchContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,18 @@ protected PhpClass getSwitchClass(final AnActionEvent e) {

@Nullable
protected PhpClass getSwitchClass(Project project, PhpFile phpFile) {
PhpClass currentClass = Utils.getFirstClassFromFile(phpFile);
if (null == currentClass) {
return null;
PhpClass currentClass = Utils.getFirstTestClassFromFile(phpFile);
if (currentClass != null) {
// The file contains a test class, switch to the tested class
return Utils.locateTestedClass(project, currentClass);
}

if (Utils.isClassAtoumTest(currentClass)) {
return Utils.locateTestedClass(project, currentClass);
currentClass = Utils.getFirstClassFromFile(phpFile);
if (currentClass != null) {
// The file contains a class, switch to the test class if it exists
return Utils.locateTestClass(project, currentClass);
}

return Utils.locateTestClass(project, currentClass);
return null;
}
}
96 changes: 83 additions & 13 deletions tests/org/atoum/intellij/plugin/atoum/tests/UtilsTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.atoum.intellij.plugin.atoum.tests;

import com.intellij.psi.PsiFile;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import com.jetbrains.php.lang.psi.PhpFile;
import com.jetbrains.php.lang.psi.elements.PhpClass;
Expand All @@ -9,25 +8,96 @@
import java.io.File;

public class UtilsTest extends LightCodeInsightFixtureTestCase {
@Override
public void setUp() throws Exception {
super.setUp();

// Add Fixtures
myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("TestA.php"));
}

protected String getTestDataPath() {
return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath();
}

public void testGetFirstClassFromFile() throws Exception {
PsiFile psiElement = myFixture.getFile();
PhpClass phpClass = Utils.getFirstClassFromFile((PhpFile) psiElement);
public void testGetFirstClassFromFile() {
PhpClass phpClass = Utils.getFirstClassFromFile((PhpFile) myFixture.configureByFile(
"TestSimpleClass.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClass", phpClass.getFQN());

phpClass = Utils.getFirstClassFromFile((PhpFile) myFixture.configureByFile(
"TestMultipleClassNotFirst.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\AnotherClassDefinedBeforeTheTest", phpClass.getFQN());
}

public void testGetFirstTestClassFromFile() {
// Include stubs
myFixture.copyFileToProject("atoum.php");

assertEquals("\\PhpStormPlugin\\tests\\units\\TestA", phpClass.getFQN());
PhpClass phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestSimpleClass.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClass", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestMultipleClassNotFirst.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestMultipleClassNotFirst", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestSimpleClassWithoutUse.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClassWithoutUse", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestWithParentClass.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestWithParentClass", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestWrongExtends.php"
));
assertNull(phpClass);

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestWrongNamespace.php"
));
assertNull(phpClass);
}

public void testGetFirstTestClassFromFileWithoutStubs() {
PhpClass phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestSimpleClass.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClass", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestMultipleClassNotFirst.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestMultipleClassNotFirst", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestSimpleClassWithoutUse.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestSimpleClassWithoutUse", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestWithParentClass.php"
));
assertNotNull(phpClass);
assertEquals("\\PhpStormPlugin\\tests\\units\\TestWithParentClass", phpClass.getFQN());

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestWrongExtends.php"
));
assertNull(phpClass);

phpClass = Utils.getFirstTestClassFromFile((PhpFile) myFixture.configureByFile(
"TestWrongNamespace.php"
));
assertNull(phpClass);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace PhpStormPlugin\tests\units;

use \atoum;

class AnotherClassDefinedBeforeTheTest
{

}

class TestMultipleClassNotFirst extends atoum
{

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use \atoum;

class TestA extends atoum
class TestSimpleClass extends atoum
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace PhpStormPlugin\tests\units;

class TestSimpleClassWithoutUse extends \atoum
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace PhpStormPlugin\tests\units;

abstract class DatabaseTest extends \atoum
{

}

abstract class ApiTest extends DatabaseTest
{

}

class TestWithParentClass extends ApiTest
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace PhpStormPlugin\tests\units;

class TestWrongExtends extends \test
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace PhpStormPlugin\units\tests;

use \atoum;

class TestWrongNamespace extends atoum
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?php

class atoum
{

}