org.testng.xml.internal.TestNamesMatcher Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of testng Show documentation
Show all versions of testng Show documentation
Testing framework for Java
package org.testng.xml.internal;
import java.util.List;
import org.testng.TestNGException;
import org.testng.collections.Lists;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
/** The class to work with "-testnames" */
public final class TestNamesMatcher {
private final List cloneSuites = Lists.newArrayList();
private final List matchedTestNames = Lists.newArrayList();
private final List matchedTests = Lists.newArrayList();
private final List testNames;
public TestNamesMatcher(XmlSuite xmlSuite, List testNames) {
this.testNames = testNames;
cloneIfContainsTestsWithNamesMatchingAny(xmlSuite, this.testNames);
}
/**
* Recursive search the given testNames from the current {@link XmlSuite} and its child suites.
*
* @param xmlSuite The {@link XmlSuite} to work with.
* @param testNames The list of testnames to iterate through
*/
private void cloneIfContainsTestsWithNamesMatchingAny(XmlSuite xmlSuite, List testNames) {
if (testNames == null || testNames.isEmpty()) {
throw new TestNGException("Please provide a valid list of names to check.");
}
// Start searching in the current suite.
addIfNotNull(cloneIfSuiteContainTestsWithNamesMatchingAny(xmlSuite));
// Search through all the child suites.
for (XmlSuite suite : xmlSuite.getChildSuites()) {
cloneIfContainsTestsWithNamesMatchingAny(suite, testNames);
}
}
public List getSuitesMatchingTestNames() {
return cloneSuites;
}
/** Getting miss-matched testNames */
public List getMissMatchedTestNames() {
List tmpTestNames = Lists.newArrayList();
tmpTestNames.addAll(testNames);
tmpTestNames.removeIf(matchedTestNames::contains);
return tmpTestNames;
}
public List getMatchedTests() {
return matchedTests;
}
private void addIfNotNull(XmlSuite xmlSuite) {
if (xmlSuite != null) {
cloneSuites.add(xmlSuite);
}
}
private XmlSuite cloneIfSuiteContainTestsWithNamesMatchingAny(XmlSuite suite) {
List tests = Lists.newLinkedList();
for (XmlTest xt : suite.getTests()) {
if (xt.nameMatchesAny(testNames)) {
tests.add(xt);
matchedTestNames.add(xt.getName());
matchedTests.add(xt);
}
}
if (tests.isEmpty()) {
return null;
}
return cleanClone(suite, tests);
}
private static XmlSuite cleanClone(XmlSuite xmlSuite, List tests) {
XmlSuite result = (XmlSuite) xmlSuite.clone();
result.getTests().clear();
result.getTests().addAll(tests);
return result;
}
}