package test; import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.testng.Assert; import org.testng.ITestNGMethod; import org.testng.annotations.Test; import org.testng.collections.ListMultiMap; import org.testng.collections.Lists; import org.testng.collections.Maps; import org.testng.internal.DynamicGraph; import org.testng.internal.DynamicGraph.Status; public class DynamicGraphTest extends SimpleBaseTest { private static class Node { private final String name; private Node(String name) { this.name = name; } @Override public String toString() { return name; } } private static void assertFreeNodesEquals(DynamicGraph<Node> graph, Node... expected) { assertThat(graph.getFreeNodes()).containsOnly(expected); } @Test public void test8() { /* digraph test8 { a1; a2; b1 -> {a1; a2;} b2 -> {a1; a2;} c1 -> {b1; b2;} x; y; } */ DynamicGraph<Node> dg = new DynamicGraph<>(); Node a1 = new Node("a1"); Node a2 = new Node("a2"); Node b1 = new Node("b1"); Node b2 = new Node("b2"); Node c1 = new Node("c1"); dg.addNode(a1); dg.addNode(a2); dg.addNode(b1); dg.addNode(b2); dg.addNode(c1); dg.addEdge(1, b1, a1, a2); dg.addEdge(1, b2, a1, a2); dg.addEdge(1, c1, b1, b2); dg.addEdge(0, a2, a1, b1, c1); dg.addEdge(0, b2, a1, b1, c1); Node x = new Node("x"); Node y = new Node("y"); dg.addNode(x); dg.addNode(y); dg.addEdge(0, a1, x, y); dg.addEdge(0, b1, x, y); dg.addEdge(0, c1, x, y); assertFreeNodesEquals(dg, y, x); dg.setStatus(dg.getFreeNodes(), Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(x, Status.FINISHED); dg.setStatus(y, Status.FINISHED); assertFreeNodesEquals(dg, a1); dg.setStatus(a1, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(a1, Status.FINISHED); assertFreeNodesEquals(dg, a2); dg.setStatus(a2, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(a2, Status.FINISHED); assertFreeNodesEquals(dg, b1); dg.setStatus(b1, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(b1, Status.FINISHED); assertFreeNodesEquals(dg, b2); dg.setStatus(b2, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(b2, Status.FINISHED); assertFreeNodesEquals(dg, c1); } @Test public void test2() { /* digraph test2 { a1; a2; b1 -> {a1; a2;} x; } */ DynamicGraph<Node> dg = new DynamicGraph<>(); Node a1 = new Node("a1"); Node a2 = new Node("a2"); Node b1 = new Node("b1"); dg.addNode(a1); dg.addNode(a2); dg.addNode(b1); dg.addEdge(1, b1, a1, a2); dg.addEdge(0, a2, a1, b1); Node x = new Node("x"); dg.addNode(x); dg.addEdge(0, a1, x); dg.addEdge(0, b1, x); assertFreeNodesEquals(dg, x); dg.setStatus(x, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(x, Status.FINISHED); assertFreeNodesEquals(dg, a1); dg.setStatus(a1, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(a1, Status.FINISHED); assertFreeNodesEquals(dg, a2); dg.setStatus(a2, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(a2, Status.FINISHED); assertFreeNodesEquals(dg, b1); Node b2 = new Node("b2"); // 2 dg.setStatus(b2, Status.RUNNING); dg.setStatus(b1, Status.FINISHED); assertFreeNodesEquals(dg); } @Test public void test3() { DynamicGraph<Node> dg = new DynamicGraph<>(); Node a = new Node("a"); Node b = new Node("b"); Node c = new Node("c"); dg.addNode(a); dg.addNode(b); dg.addNode(c); dg.addEdge(1, a, b); dg.addEdge(0, c, b); dg.addEdge(0, b, a); assertFreeNodesEquals(dg, b); dg.setStatus(b, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(b, Status.FINISHED); assertFreeNodesEquals(dg, a); dg.setStatus(a, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(a, Status.FINISHED); assertFreeNodesEquals(dg, c); dg.setStatus(c, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(c, Status.FINISHED); assertFreeNodesEquals(dg); } @Test public void test4() { DynamicGraph<Node> dg = new DynamicGraph<>(); Node a = new Node("a"); Node b = new Node("b"); dg.addNode(a); dg.addNode(b); dg.addEdge(0, b, a); assertFreeNodesEquals(dg, a); dg.setStatus(a, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(a, Status.FINISHED); assertFreeNodesEquals(dg, b); dg.setStatus(b, Status.RUNNING); assertFreeNodesEquals(dg); dg.setStatus(b, Status.FINISHED); assertFreeNodesEquals(dg); } @Test public void testOrderingOfEdgesWithSameWeight() { Class<?>[] classes = new Class[] { TestClassContainerForGitHubIssue1360.TestNG1.class, TestClassContainerForGitHubIssue1360.TestNG2.class, TestClassContainerForGitHubIssue1360.TestNG3.class }; List<ITestNGMethod> methods = extractTestNGMethods(classes); DynamicGraph<ITestNGMethod> graph = new DynamicGraph<>(); ListMultiMap<Integer, ITestNGMethod> methodsByPriority = Maps.newListMultiMap(); for (ITestNGMethod method : methods) { methodsByPriority.put(method.getPriority(), method); graph.addNode(method); } List<Integer> availablePriorities = Lists.newArrayList(methodsByPriority.keySet()); Collections.sort(availablePriorities); Integer previousPriority = methods.size() > 0 ? availablePriorities.get(0) : 0; for (int i = 1; i < availablePriorities.size(); i++) { Integer currentPriority = availablePriorities.get(i); for (ITestNGMethod p0Method : methodsByPriority.get(previousPriority)) { for (ITestNGMethod p1Method : methodsByPriority.get(currentPriority)) { graph.addEdge(1, p1Method, p0Method); } } previousPriority = currentPriority; } List<String> expected = Arrays.asList("TestNG1.test1TestNG1", "TestNG2.test1TestNG2", "TestNG3.test1TestNG3"); runAssertion(graph, expected); expected = Arrays.asList("TestNG1.test2TestNG1", "TestNG2.test2TestNG2", "TestNG3.test2TestNG3"); runAssertion(graph, expected); expected = Arrays.asList("TestNG1.test3TestNG1", "TestNG2.test3TestNG2", "TestNG3.test3TestNG3"); runAssertion(graph, expected); } private static void runAssertion(DynamicGraph<ITestNGMethod> graph, List<String> expected) { List<ITestNGMethod> p1Methods = graph.getFreeNodes(); Assert.assertEquals(p1Methods.size(), 3); graph.setStatus(p1Methods, Status.FINISHED); for (ITestNGMethod p1Method : p1Methods) { Assert.assertTrue(expected.contains(constructName(p1Method))); } } private static String constructName(ITestNGMethod method) { return method.getConstructorOrMethod().getDeclaringClass().getSimpleName() + "." + method.getMethodName(); } }