Skip to content

Commit

Permalink
visitor offers method to delete current element
Browse files Browse the repository at this point in the history
  • Loading branch information
jlink committed Nov 9, 2015
1 parent e79a619 commit 1d6a7d5
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 14 deletions.
Expand Up @@ -51,12 +51,13 @@ protected void removeChild(AbstractTestDescriptor abstractTestDescriptor) {
children.remove(abstractTestDescriptor); children.remove(abstractTestDescriptor);
} }


@Override protected void removeFromHierarchy() {
public void remove() { if (isRoot())
return;
if (parent instanceof AbstractTestDescriptor) if (parent instanceof AbstractTestDescriptor)
((AbstractTestDescriptor) parent).removeChild(this); ((AbstractTestDescriptor) parent).removeChild(this);
setParent(null); setParent(null);
children.clear(); //to prevent visiting children.clear();
} }


@Override @Override
Expand All @@ -74,7 +75,8 @@ public final Set<TestDescriptor> getChildren() {


@Override @Override
public void accept(Visitor visitor) { public void accept(Visitor visitor) {
visitor.visit(this); Runnable delete = () -> removeFromHierarchy();
visitor.visit(this, delete);
new LinkedHashSet<>(getChildren()).forEach(child -> child.accept(visitor)); new LinkedHashSet<>(getChildren()).forEach(child -> child.accept(visitor));
} }


Expand Down
Expand Up @@ -32,17 +32,19 @@ public interface TestDescriptor {


boolean isTest(); boolean isTest();


default boolean isRoot() {
return getParent() == null;
}

Set<TestTag> getTags(); Set<TestTag> getTags();


void addChild(TestDescriptor descriptor); void addChild(TestDescriptor descriptor);


void remove();

Set<TestDescriptor> getChildren(); Set<TestDescriptor> getChildren();


interface Visitor { interface Visitor {


void visit(TestDescriptor descriptor); void visit(TestDescriptor descriptor, Runnable deleteCurrent);
} }


void accept(Visitor visitor); void accept(Visitor visitor);
Expand Down
Expand Up @@ -61,21 +61,21 @@ public String getId() {
@Test @Test
public void visitAllNodes() { public void visitAllNodes() {
List<TestDescriptor> visited = new ArrayList<>(); List<TestDescriptor> visited = new ArrayList<>();
engineDescriptor.accept(visited::add); engineDescriptor.accept((descriptor, delete) -> visited.add(descriptor));


Assert.assertEquals(8, visited.size()); Assert.assertEquals(8, visited.size());
} }


@Test @Test
public void pruneLeaf() { public void pruneLeaf() {
TestDescriptor.Visitor visitor = (TestDescriptor descriptor) -> { TestDescriptor.Visitor visitor = (TestDescriptor descriptor, Runnable delete) -> {
if (descriptor.getUniqueId().equals("leaf1-1")) if (descriptor.getUniqueId().equals("leaf1-1"))
descriptor.remove(); delete.run();
}; };
engineDescriptor.accept(visitor); engineDescriptor.accept(visitor);


List<String> visited = new ArrayList<>(); List<String> visited = new ArrayList<>();
engineDescriptor.accept((descriptor) -> visited.add(descriptor.getUniqueId())); engineDescriptor.accept((descriptor, delete) -> visited.add(descriptor.getUniqueId()));


Assert.assertEquals(7, visited.size()); Assert.assertEquals(7, visited.size());
Assert.assertTrue(visited.contains("group1")); Assert.assertTrue(visited.contains("group1"));
Expand All @@ -85,17 +85,17 @@ public void pruneLeaf() {
@Test @Test
public void pruneGroup() { public void pruneGroup() {
final AtomicInteger countVisited = new AtomicInteger(); final AtomicInteger countVisited = new AtomicInteger();
TestDescriptor.Visitor visitor = (TestDescriptor descriptor) -> { TestDescriptor.Visitor visitor = (descriptor, delete) -> {
if (descriptor.getUniqueId().equals("group1")) if (descriptor.getUniqueId().equals("group1"))
descriptor.remove(); delete.run();
countVisited.incrementAndGet(); countVisited.incrementAndGet();
}; };
engineDescriptor.accept(visitor); engineDescriptor.accept(visitor);


Assert.assertEquals("Children of pruned element are not visited", 4, countVisited.get()); Assert.assertEquals("Children of pruned element are not visited", 4, countVisited.get());


List<String> visited = new ArrayList<>(); List<String> visited = new ArrayList<>();
engineDescriptor.accept((descriptor) -> visited.add(descriptor.getUniqueId())); engineDescriptor.accept((descriptor, delete) -> visited.add(descriptor.getUniqueId()));


Assert.assertEquals(3, visited.size()); Assert.assertEquals(3, visited.size());
Assert.assertFalse(visited.contains("group1")); Assert.assertFalse(visited.contains("group1"));
Expand Down

0 comments on commit 1d6a7d5

Please sign in to comment.