Skip to content

Commit

Permalink
getFirstCyclicUID now returns optional
Browse files Browse the repository at this point in the history
ramp up tests for it
  • Loading branch information
tribbloid committed Oct 6, 2022
1 parent b529e9c commit c0baf2d
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@

import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.Optional;
import java.util.Queue;
import java.util.Set;
import java.util.ArrayList;

import org.junit.platform.commons.util.Preconditions;
import org.junit.platform.engine.TestDescriptor;
Expand All @@ -38,8 +38,8 @@ void validate(TestEngine testEngine, TestDescriptor root) {
() -> String.format(
"The discover() method for TestEngine with ID '%s' must return a non-null root TestDescriptor.",
testEngine.getId()));
ArrayList<UniqueId> cyclicUIDs = getCyclicUIDs(root);
Preconditions.condition(cyclicUIDs.isEmpty(),
Optional<UniqueId> cyclicUIDs = getFirstCyclicUID(root);
Preconditions.condition(!cyclicUIDs.isPresent(),
() -> String.format("The discover() method for TestEngine with ID '%s' returned a cyclic graph: "
+ "Unique ID(s) '%s' enter a cycle",
testEngine.getId(), cyclicUIDs));
Expand All @@ -49,20 +49,20 @@ void validate(TestEngine testEngine, TestDescriptor root) {
* @return {@code true} if the tree does <em>not</em> contain a cycle; else {@code false}.
*/
boolean isAcyclic(TestDescriptor root) {
return getCyclicUIDs(root).isEmpty();
return !getFirstCyclicUID(root).isPresent();
}

ArrayList<UniqueId> getCyclicUIDs(TestDescriptor root) {
Optional<UniqueId> getFirstCyclicUID(TestDescriptor root) {
Set<UniqueId> visited = new HashSet<>();
ArrayList<UniqueId> cyclic = new ArrayList<>();
Optional<UniqueId> cyclic = Optional.empty();
visited.add(root.getUniqueId());
Queue<TestDescriptor> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
for (TestDescriptor child : queue.remove().getChildren()) {
UniqueId uid = child.getUniqueId();
if (!visited.add(uid)) {
cyclic.add(uid);
cyclic = Optional.of(uid);
return cyclic; // id already known: cycle detected!
}
if (child.isContainer()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

package org.junit.platform.launcher.core;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

Expand All @@ -32,6 +33,7 @@ void detectCycleWithDoubleRoot() {

root.addChild(root);
assertFalse(validator.isAcyclic(root));
assertEquals(validator.getFirstCyclicUID(root).get(), UniqueId.forEngine("root"));
}

@Test
Expand All @@ -46,6 +48,7 @@ void detectCycleWithDoubleGroup() {

group2.addChild(group1);
assertFalse(validator.isAcyclic(root));
assertEquals(validator.getFirstCyclicUID(root).get(), UniqueId.forEngine("root").append("group", "1"));
}

@Test
Expand All @@ -64,6 +67,7 @@ void detectCycleWithDoubleTest() {

group2.addChild(test1);
assertFalse(validator.isAcyclic(root));
assertEquals(validator.getFirstCyclicUID(root).get(), UniqueId.forEngine("root").append("test", "1"));
}

}

0 comments on commit c0baf2d

Please sign in to comment.