testng: allow suites to be defined in yaml (IDEA-94400)

This commit is contained in:
Anna.Kozlova
2018-07-19 10:01:31 +02:00
parent 11c5595382
commit d6f2e3841f
5 changed files with 28 additions and 23 deletions
@@ -43,7 +43,7 @@ public abstract class AbstractTestNGSuiteConfigurationProducer extends TestNGCon
if (containingFile == null) return false;
final VirtualFile virtualFile = containingFile.getVirtualFile();
if (virtualFile == null || !virtualFile.isValid()) return false;
if (!TestNGUtil.isTestngXML(virtualFile)) return false;
if (!TestNGUtil.isTestngSuiteFile(virtualFile)) return false;
RunnerAndConfigurationSettings settings = cloneTemplateConfiguration(context);
setupConfigurationModule(context, configuration);
final Module originalModule = configuration.getConfigurationModule().getModule();
@@ -15,11 +15,11 @@
*/
package com.theoryinpractice.testng.configuration.browser;
import com.intellij.openapi.project.Project;
import com.intellij.execution.configuration.BrowseModuleValueActionListener;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.execution.configuration.BrowseModuleValueActionListener;
/**
* @author Hani Suleiman
@@ -36,12 +36,12 @@ public class SuiteBrowser extends BrowseModuleValueActionListener
@Override
public boolean isFileVisible(VirtualFile virtualFile, boolean showHidden) {
if(!showHidden && virtualFile.getName().charAt(0) == '.') return false;
return virtualFile.isDirectory() || "xml".equals(virtualFile.getExtension());
return virtualFile.isDirectory() || "xml".equals(virtualFile.getExtension()) || "yaml".equals(virtualFile.getExtension());
}
};
descriptor.setDescription("Please select the testng.xml suite file");
descriptor.setDescription("Please select the xml or yaml suite file");
descriptor.setTitle("Select Suite");
VirtualFile file = FileChooser.chooseFile(descriptor, getProject(), null);
VirtualFile file = FileChooser.chooseFile(descriptor, getProject(), null);
return file != null ? file.getPath() : null;
}
@@ -34,7 +34,7 @@ public class TestNGSearchScope extends GlobalSearchScope {
@Override
public boolean contains(@NotNull VirtualFile file) {
return myFileIndex.isInContent(file) && TestNGUtil.isTestngXML(file);
return myFileIndex.isInContent(file) && TestNGUtil.isTestngSuiteFile(file);
}
@Override
@@ -21,10 +21,8 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.xml.XmlFile;
import com.theoryinpractice.testng.configuration.TestNGConfiguration;
import org.testng.xml.Parser;
@@ -52,26 +50,27 @@ public class TestNGTestSuite extends TestNGTestObject {
@Override
public void checkConfiguration() throws RuntimeConfigurationException {
final TestData data = myConfig.getPersistantData();
String suiteName = myConfig.getPersistantData().getSuiteName();
try {
final Parser parser = new Parser(data.getSuiteName());
final Parser parser = new Parser(suiteName);
parser.setLoadClasses(false);
synchronized (PARSE_LOCK) {
parser.parse();//try to parse suite.xml
}
}
catch (Exception e) {
throw new RuntimeConfigurationException("Unable to parse '" + data.getSuiteName() + "' specified");
catch (Throwable e) {
//there is no appropriate snakeyaml in the classpath (one compatible with bundled testng version),
// but yaml parser tries to load classes despite loadClasses = false here and thus it will fail anyway
//no validation for yaml suites possible
if (!suiteName.endsWith(".yaml")) {
throw new RuntimeConfigurationException("Unable to parse '" + suiteName + "' specified");
}
}
}
@Override
public boolean isConfiguredByElement(PsiElement element) {
final PsiFile containingFile = element.getContainingFile();
if (containingFile instanceof XmlFile) {
final VirtualFile virtualFile = PsiUtilCore.getVirtualFile(containingFile);
return virtualFile != null && Comparing.strEqual(myConfig.getPersistantData().getSuiteName(), virtualFile.getPath());
}
return false;
final VirtualFile virtualFile = PsiUtilCore.getVirtualFile(element);
return virtualFile != null && Comparing.strEqual(myConfig.getPersistantData().getSuiteName(), virtualFile.getPath());
}
}
@@ -444,10 +444,16 @@ public class TestNGUtil {
return aListenerClass != null && psiClass.isInheritor(aListenerClass, true);
}
public static boolean isTestngXML(final VirtualFile virtualFile) {
if ("xml".equalsIgnoreCase(virtualFile.getExtension()) && virtualFile.isInLocalFileSystem() && virtualFile.isValid()) {
final String result = NanoXmlUtil.parseHeader(virtualFile).getRootTagLocalName();
if (result != null && result.equals(SUITE_TAG_NAME)) {
public static boolean isTestngSuiteFile(final VirtualFile virtualFile) {
if (virtualFile.isInLocalFileSystem() && virtualFile.isValid()) {
String extension = virtualFile.getExtension();
if ("xml".equalsIgnoreCase(extension)) {
final String result = NanoXmlUtil.parseHeader(virtualFile).getRootTagLocalName();
if (result != null && result.equals(SUITE_TAG_NAME)) {
return true;
}
}
else if ("yaml".equals(extension)) {
return true;
}
}