package test.groupinvocation;
import com.google.common.base.Joiner;
import org.testng.ITestNGListener;
import org.testng.TestNG;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import test.InvokedMethodNameListener;
import test.SimpleBaseTest;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Test that <suite> tags can have g.
*/
public class GroupSuiteTest extends SimpleBaseTest {
private static final File PARENT = new File(getPathToResource("groupinvocation"));
@DataProvider
private static Object[][] dp() {
return new Object[][]{
{new String[]{"suiteA.xml", "suiteB.xml"}, /* Group in xml */ true},
{new String[]{"suiteA.xml", "suiteB.xml"}, /* Group in TestNG */ false},
{new String[]{"parent-suiteA.xml", "parent-suiteB.xml"}, /* Group in xml */ true},
{new String[]{"parent-suiteA.xml", "parent-suiteB.xml"}, /* Group in TestNG */ false},
{new String[0], /* Group in xml */ true},
{new String[0], /* Group in TestNG */ false}
};
}
@Test(dataProvider = "dp")
public void includeFromSuite0(String[] withSuiteFiles, boolean excludeWithXml) {
runWithSuite(withSuiteFiles, excludeWithXml, "a", "b", "c", "a2", "b2", "c2");
}
@Test(dataProvider = "dp")
public void includeFromSuite1(String[] withSuiteFiles, boolean excludeWithXml) {
runWithSuite(withSuiteFiles, excludeWithXml, g("a"), g(), "a", "a2");
}
@Test(dataProvider = "dp")
public void includeFromSuite2(String[] withSuiteFiles, boolean excludeWithXml) {
runWithSuite(withSuiteFiles, excludeWithXml, g("a", "b"), g(), "a", "b", "a2", "b2");
}
@Test(dataProvider = "dp")
public void excludeFromSuite1(String[] withSuiteFiles, boolean excludeWithXml) {
runWithSuite(withSuiteFiles, excludeWithXml, g(), g("a"), "b", "c", "b2", "c2");
}
@Test(dataProvider = "dp")
public void excludeFromSuite2(String[] withSuiteFiles, boolean excludeWithXml) {
runWithSuite(withSuiteFiles, excludeWithXml, g(), g("a", "b"), "c", "c2");
}
@Test(description = "Include in both suite and test")
public void includeTestAndSuite1Xml() {
runWithSuite(g("a"), g(), g("b"), g(), true, "a", "b", "a2", "b2");
}
@Test(description = "Include in both suite and test")
public void includeTestAndSuite1Cli() {
runWithSuite(g("a"), g(), g("b"), g(), false, "a", "b", "a2", "b2");
}
@Test(description = "Include in suite, exclude in test")
public void excludeTestAndSuite2Xml() {
runWithSuite(g("a", "b"), g(), g(), g("a"), true, "b", "b2");
}
@Test(description = "Include in suite, exclude in test")
public void excludeTestAndSuite2Cli() {
runWithSuite(g("a", "b"), g(), g(), g("a"), false, "b", "b2");
}
private void runWithSuite(String[] withSuiteFiles, boolean excludeWithXml, String... methods) {
runWithSuite(withSuiteFiles, excludeWithXml, g(), g(), g(), g(), methods);
}
private void runWithSuite(String[] withSuiteFiles, boolean excludeWithXml, List<String> suiteGroups, List<String> excludedSuiteGroups,
String... methods) {
runWithSuite(withSuiteFiles, excludeWithXml, suiteGroups, excludedSuiteGroups, g(), g(), methods);
}
private void runWithSuite(List<String> suiteGroups, List<String> excludedSuiteGroups,
List<String> testGroups, List<String> excludedTestGroups,
boolean groupsWithXml, String... methods) {
runWithSuite(new String[0], groupsWithXml, suiteGroups, excludedSuiteGroups, testGroups, excludedTestGroups, methods);
}
private void runWithSuite(String[] withSuiteFiles, boolean groupsWithXml, List<String> suiteGroups, List<String> excludedSuiteGroups,
List<String> testGroups, List<String> excludedTestGroups,
String... methods) {
TestNG tng = create();
XmlSuite suite = createXmlSuite("Groups");
if (groupsWithXml) {
suite.setIncludedGroups(suiteGroups);
suite.setExcludedGroups(excludedSuiteGroups);
} else {
tng.setGroups(Joiner.on(',').join(suiteGroups));
tng.setExcludedGroups(Joiner.on(',').join(excludedSuiteGroups));
}
if (withSuiteFiles.length != 0) {
List<String> suiteFiles = new ArrayList<>(withSuiteFiles.length);
for (String suiteFile : withSuiteFiles) {
suiteFiles.add(new File(PARENT, suiteFile).getAbsolutePath());
}
suite.setSuiteFiles(suiteFiles);
createXmlTest(suite, "Groups-test");
} else {
XmlTest test = createXmlTest(suite, "Groups-test", GroupSuiteSampleTest.class, GroupSuiteSampleTest2.class);
test.setIncludedGroups(testGroups);
test.setExcludedGroups(excludedTestGroups);
}
tng.setXmlSuites(Arrays.asList(suite));
InvokedMethodNameListener listener = new InvokedMethodNameListener();
tng.addListener((ITestNGListener) listener);
tng.run();
assertThat(listener.getInvokedMethodNames()).containsExactly(methods);
}
private static List<String> g(String... groups) {
return Arrays.asList(groups);
}
}