diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-07-03 16:10:38 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2015-07-07 10:40:25 +0200 |
commit | fd0d17f3c68b342ba37c5875d200bf28d476432e (patch) | |
tree | f76022563b78edcd7d15090260c47966c7970746 | |
parent | 23254b9034fdbed29388a985cc9f501c44cb3e57 (diff) | |
download | sonarqube-fd0d17f3c68b342ba37c5875d200bf28d476432e.tar.gz sonarqube-fd0d17f3c68b342ba37c5875d200bf28d476432e.zip |
Fix visitors when there's many component types of max depth type
5 files changed, 175 insertions, 41 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java index 7ff708046b5..cf6277cd8dc 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DepthTraversalTypeAwareVisitor.java @@ -74,8 +74,8 @@ public abstract class DepthTraversalTypeAwareVisitor implements TypeAwareVisitor } private void visitChildren(Component component) { - if (component.getType() != maxDepth) { - for (Component child : component.getChildren()) { + for (Component child : component.getChildren()) { + if (!child.getType().isDeeperThan(maxDepth)) { visit(child); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java index b8114ca02cf..21e65c9eeea 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/PathAwareVisitor.java @@ -83,8 +83,8 @@ public abstract class PathAwareVisitor<T> implements ComponentVisitor { } private void visitChildren(Component component) { - if (component.getType() != maxDepth) { - for (Component child : component.getChildren()) { + for (Component child : component.getChildren()) { + if (!child.getType().isDeeperThan(maxDepth)) { visit(child); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java index 4130a79b850..2ee69e3d78c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PathAwareVisitorTest.java @@ -62,17 +62,20 @@ public class PathAwareVisitorTest { .build(), DumbComponent.builder(MODULE, 12) .addChildren( - DumbComponent.builder(DIRECTORY, 121) + DumbComponent.builder(MODULE, 121) .addChildren( - DumbComponent.builder(FILE, 1211).build() - ) - .build() + DumbComponent.builder(DIRECTORY, 1211) + .addChildren( + DumbComponent.builder(FILE, 12111).build() + ) + .build() + ).build() ).build() ).build(); @Test - public void verify_preOrder() { - TestPathAwareVisitor underTest = new TestPathAwareVisitor(PRE_ORDER); + public void verify_preOrder_visit_call_when_visit_tree_with_depth_FILE() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(FILE, PRE_ORDER); underTest.visit(SOME_TREE_ROOT); Iterator<CallRecord> expected = of( @@ -93,16 +96,72 @@ public class PathAwareVisitorTest { newCallRecord("visitAny", 12, 1, of(12, 1)), newCallRecord("visitModule", 12, 1, of(12, 1)), newCallRecord("visitAny", 121, 12, of(121, 12, 1)), - newCallRecord("visitDirectory", 121, 12, of(121, 12, 1)), + newCallRecord("visitModule", 121, 12, of(121, 12, 1)), newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)), - newCallRecord("visitFile", 1211, 121, of(1211, 121, 12, 1)) + newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1)), + newCallRecord("visitAny", 12111, 1211, of(12111, 1211, 121, 12, 1)), + newCallRecord("visitFile", 12111, 1211, of(12111, 1211, 121, 12, 1)) + ).iterator(); + verifyCallRecords(expected, underTest.callsRecords.iterator()); + } + + @Test + public void verify_preOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(DIRECTORY, PRE_ORDER); + underTest.visit(SOME_TREE_ROOT); + + Iterator<CallRecord> expected = of( + newCallRecord("visitAny", 1, null, of(1)), + newCallRecord("visitProject", 1, null, of(1)), + newCallRecord("visitAny", 11, 1, of(11, 1)), + newCallRecord("visitModule", 11, 1, of(11, 1)), + newCallRecord("visitAny", 111, 11, of(111, 11, 1)), + newCallRecord("visitDirectory", 111, 11, of(111, 11, 1)), + newCallRecord("visitAny", 112, 11, of(112, 11, 1)), + newCallRecord("visitDirectory", 112, 11, of(112, 11, 1)), + newCallRecord("visitAny", 12, 1, of(12, 1)), + newCallRecord("visitModule", 12, 1, of(12, 1)), + newCallRecord("visitAny", 121, 12, of(121, 12, 1)), + newCallRecord("visitModule", 121, 12, of(121, 12, 1)), + newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)), + newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1)) + ).iterator(); + verifyCallRecords(expected, underTest.callsRecords.iterator()); + } + + @Test + public void verify_preOrder_visit_call_when_visit_tree_with_depth_MODULE() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(MODULE, PRE_ORDER); + underTest.visit(SOME_TREE_ROOT); + + Iterator<CallRecord> expected = of( + newCallRecord("visitAny", 1, null, of(1)), + newCallRecord("visitProject", 1, null, of(1)), + newCallRecord("visitAny", 11, 1, of(11, 1)), + newCallRecord("visitModule", 11, 1, of(11, 1)), + newCallRecord("visitAny", 12, 1, of(12, 1)), + newCallRecord("visitModule", 12, 1, of(12, 1)), + newCallRecord("visitAny", 121, 12, of(121, 12, 1)), + newCallRecord("visitModule", 121, 12, of(121, 12, 1)) + ).iterator(); + verifyCallRecords(expected, underTest.callsRecords.iterator()); + } + + @Test + public void verify_preOrder_visit_call_when_visit_tree_with_depth_PROJECT() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(PROJECT, PRE_ORDER); + underTest.visit(SOME_TREE_ROOT); + + Iterator<CallRecord> expected = of( + newCallRecord("visitAny", 1, null, of(1)), + newCallRecord("visitProject", 1, null, of(1)) ).iterator(); verifyCallRecords(expected, underTest.callsRecords.iterator()); } @Test - public void verify_postOrder() { - TestPathAwareVisitor underTest = new TestPathAwareVisitor(POST_ORDER); + public void verify_postOrder_visit_call_when_visit_tree_with_depth_FILE() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(FILE, POST_ORDER); underTest.visit(SOME_TREE_ROOT); Iterator<CallRecord> expected = of( @@ -118,10 +177,12 @@ public class PathAwareVisitorTest { newCallRecord("visitDirectory", 112, 11, of(112, 11, 1)), newCallRecord("visitAny", 11, 1, of(11, 1)), newCallRecord("visitModule", 11, 1, of(11, 1)), + newCallRecord("visitAny", 12111, 1211, of(12111, 1211, 121, 12, 1)), + newCallRecord("visitFile", 12111, 1211, of(12111, 1211, 121, 12, 1)), newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)), - newCallRecord("visitFile", 1211, 121, of(1211, 121, 12, 1)), + newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1)), newCallRecord("visitAny", 121, 12, of(121, 12, 1)), - newCallRecord("visitDirectory", 121, 12, of(121, 12, 1)), + newCallRecord("visitModule", 121, 12, of(121, 12, 1)), newCallRecord("visitAny", 12, 1, of(12, 1)), newCallRecord("visitModule", 12, 1, of(12, 1)), newCallRecord("visitAny", 1, null, of(1)), @@ -130,6 +191,60 @@ public class PathAwareVisitorTest { verifyCallRecords(expected, underTest.callsRecords.iterator()); } + @Test + public void verify_postOrder_visit_call_when_visit_tree_with_depth_DIRECTORY() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(DIRECTORY, POST_ORDER); + underTest.visit(SOME_TREE_ROOT); + + Iterator<CallRecord> expected = of( + newCallRecord("visitAny", 111, 11, of(111, 11, 1)), + newCallRecord("visitDirectory", 111, 11, of(111, 11, 1)), + newCallRecord("visitAny", 112, 11, of(112, 11, 1)), + newCallRecord("visitDirectory", 112, 11, of(112, 11, 1)), + newCallRecord("visitAny", 11, 1, of(11, 1)), + newCallRecord("visitModule", 11, 1, of(11, 1)), + newCallRecord("visitAny", 1211, 121, of(1211, 121, 12, 1)), + newCallRecord("visitDirectory", 1211, 121, of(1211, 121, 12, 1)), + newCallRecord("visitAny", 121, 12, of(121, 12, 1)), + newCallRecord("visitModule", 121, 12, of(121, 12, 1)), + newCallRecord("visitAny", 12, 1, of(12, 1)), + newCallRecord("visitModule", 12, 1, of(12, 1)), + newCallRecord("visitAny", 1, null, of(1)), + newCallRecord("visitProject", 1, null, of(1)) + ).iterator(); + verifyCallRecords(expected, underTest.callsRecords.iterator()); + } + + @Test + public void verify_postOrder_visit_call_when_visit_tree_with_depth_MODULE() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(MODULE, POST_ORDER); + underTest.visit(SOME_TREE_ROOT); + + Iterator<CallRecord> expected = of( + newCallRecord("visitAny", 11, 1, of(11, 1)), + newCallRecord("visitModule", 11, 1, of(11, 1)), + newCallRecord("visitAny", 121, 12, of(121, 12, 1)), + newCallRecord("visitModule", 121, 12, of(121, 12, 1)), + newCallRecord("visitAny", 12, 1, of(12, 1)), + newCallRecord("visitModule", 12, 1, of(12, 1)), + newCallRecord("visitAny", 1, null, of(1)), + newCallRecord("visitProject", 1, null, of(1)) + ).iterator(); + verifyCallRecords(expected, underTest.callsRecords.iterator()); + } + + @Test + public void verify_postOrder_visit_call_when_visit_tree_with_depth_PROJECT() { + TestPathAwareVisitor underTest = new TestPathAwareVisitor(PROJECT, POST_ORDER); + underTest.visit(SOME_TREE_ROOT); + + Iterator<CallRecord> expected = of( + newCallRecord("visitAny", 1, null, of(1)), + newCallRecord("visitProject", 1, null, of(1)) + ).iterator(); + verifyCallRecords(expected, underTest.callsRecords.iterator()); + } + private static void verifyCallRecords(Iterator<CallRecord> expected, Iterator<CallRecord> actual) { while (expected.hasNext()) { assertThat(actual.next()).isEqualTo(expected.next()); @@ -143,8 +258,8 @@ public class PathAwareVisitorTest { private static class TestPathAwareVisitor extends PathAwareVisitor<Integer> { private final List<CallRecord> callsRecords = new ArrayList<>(); - public TestPathAwareVisitor(ComponentVisitor.Order order) { - super(FILE, order, new SimpleStackElementFactory<Integer>() { + public TestPathAwareVisitor(Component.Type maxDepth, ComponentVisitor.Order order) { + super(maxDepth, order, new SimpleStackElementFactory<Integer>() { @Override public Integer createForAny(Component component) { return component.getRef(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java index 3e3514b115b..94ebd8fa8b2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PostOrderDepthTraversalTypeAwareVisitorTest.java @@ -33,10 +33,11 @@ import static org.sonar.server.computation.component.ComponentVisitor.Order.POST public class PostOrderDepthTraversalTypeAwareVisitorTest { - private static final Component FILE_4 = component(FILE, 4); private static final Component FILE_5 = component(FILE, 5); - private static final Component DIRECTORY_3 = component(DIRECTORY, 3, FILE_4, FILE_5); - private static final Component MODULE_2 = component(MODULE, 2, DIRECTORY_3); + private static final Component FILE_6 = component(FILE, 6); + private static final Component DIRECTORY_4 = component(DIRECTORY, 4, FILE_5, FILE_6); + private static final Component MODULE_3 = component(MODULE, 3, DIRECTORY_4); + private static final Component MODULE_2 = component(MODULE, 2, MODULE_3); private static final Component COMPONENT_TREE = component(PROJECT, 1, MODULE_2); private final DepthTraversalTypeAwareVisitor spyProjectVisitor = spy(new DepthTraversalTypeAwareVisitor(PROJECT, POST_ORDER) { @@ -230,15 +231,18 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { inOrder.verify(spyFileVisitor).visit(COMPONENT_TREE); inOrder.verify(spyFileVisitor).visit(MODULE_2); - inOrder.verify(spyFileVisitor).visit(DIRECTORY_3); - inOrder.verify(spyFileVisitor).visit(FILE_4); - inOrder.verify(spyFileVisitor).visitAny(FILE_4); - inOrder.verify(spyFileVisitor).visitFile(FILE_4); + inOrder.verify(spyFileVisitor).visit(MODULE_3); + inOrder.verify(spyFileVisitor).visit(DIRECTORY_4); inOrder.verify(spyFileVisitor).visit(FILE_5); inOrder.verify(spyFileVisitor).visitAny(FILE_5); inOrder.verify(spyFileVisitor).visitFile(FILE_5); - inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_3); - inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_3); + inOrder.verify(spyFileVisitor).visit(FILE_6); + inOrder.verify(spyFileVisitor).visitAny(FILE_6); + inOrder.verify(spyFileVisitor).visitFile(FILE_6); + inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_4); + inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_4); + inOrder.verify(spyFileVisitor).visitAny(MODULE_3); + inOrder.verify(spyFileVisitor).visitModule(MODULE_3); inOrder.verify(spyFileVisitor).visitAny(MODULE_2); inOrder.verify(spyFileVisitor).visitModule(MODULE_2); inOrder.verify(spyFileVisitor).visitAny(COMPONENT_TREE); @@ -252,9 +256,12 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { inOrder.verify(spyDirectoryVisitor).visit(COMPONENT_TREE); inOrder.verify(spyDirectoryVisitor).visit(MODULE_2); - inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_3); - inOrder.verify(spyDirectoryVisitor).visitAny(DIRECTORY_3); - inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_3); + inOrder.verify(spyDirectoryVisitor).visit(MODULE_3); + inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_4); + inOrder.verify(spyDirectoryVisitor).visitAny(DIRECTORY_4); + inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_4); + inOrder.verify(spyDirectoryVisitor).visitAny(MODULE_3); + inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_3); inOrder.verify(spyDirectoryVisitor).visitAny(MODULE_2); inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_2); inOrder.verify(spyDirectoryVisitor).visitAny(COMPONENT_TREE); @@ -268,6 +275,9 @@ public class PostOrderDepthTraversalTypeAwareVisitorTest { inOrder.verify(spyModuleVisitor).visit(COMPONENT_TREE); inOrder.verify(spyModuleVisitor).visit(MODULE_2); + inOrder.verify(spyModuleVisitor).visit(MODULE_3); + inOrder.verify(spyModuleVisitor).visitAny(MODULE_3); + inOrder.verify(spyModuleVisitor).visitModule(MODULE_3); inOrder.verify(spyModuleVisitor).visitAny(MODULE_2); inOrder.verify(spyModuleVisitor).visitModule(MODULE_2); inOrder.verify(spyModuleVisitor).visitAny(COMPONENT_TREE); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java index f2129085694..8385d345cdd 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/PreOrderDepthTraversalTypeAwareVisitorTest.java @@ -33,10 +33,11 @@ import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ public class PreOrderDepthTraversalTypeAwareVisitorTest { - private static final Component FILE_4 = component(FILE, 4); private static final Component FILE_5 = component(FILE, 5); - private static final Component DIRECTORY_3 = component(DIRECTORY, 3, FILE_4, FILE_5); - private static final Component MODULE_2 = component(MODULE, 2, DIRECTORY_3); + private static final Component FILE_6 = component(FILE, 6); + private static final Component DIRECTORY_4 = component(DIRECTORY, 4, FILE_5, FILE_6); + private static final Component MODULE_3 = component(MODULE, 3, DIRECTORY_4); + private static final Component MODULE_2 = component(MODULE, 2, MODULE_3); private static final Component COMPONENT_TREE = component(PROJECT, 1, MODULE_2); private final DepthTraversalTypeAwareVisitor spyProjectVisitor = spy(new DepthTraversalTypeAwareVisitor(PROJECT, PRE_ORDER) { @@ -233,15 +234,18 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { inOrder.verify(spyFileVisitor).visit(MODULE_2); inOrder.verify(spyFileVisitor).visitAny(MODULE_2); inOrder.verify(spyFileVisitor).visitModule(MODULE_2); - inOrder.verify(spyFileVisitor).visit(DIRECTORY_3); - inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_3); - inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_3); - inOrder.verify(spyFileVisitor).visit(FILE_4); - inOrder.verify(spyFileVisitor).visitAny(FILE_4); - inOrder.verify(spyFileVisitor).visitFile(FILE_4); + inOrder.verify(spyFileVisitor).visit(MODULE_3); + inOrder.verify(spyFileVisitor).visitAny(MODULE_3); + inOrder.verify(spyFileVisitor).visitModule(MODULE_3); + inOrder.verify(spyFileVisitor).visit(DIRECTORY_4); + inOrder.verify(spyFileVisitor).visitAny(DIRECTORY_4); + inOrder.verify(spyFileVisitor).visitDirectory(DIRECTORY_4); inOrder.verify(spyFileVisitor).visit(FILE_5); inOrder.verify(spyFileVisitor).visitAny(FILE_5); inOrder.verify(spyFileVisitor).visitFile(FILE_5); + inOrder.verify(spyFileVisitor).visit(FILE_6); + inOrder.verify(spyFileVisitor).visitAny(FILE_6); + inOrder.verify(spyFileVisitor).visitFile(FILE_6); inOrder.verifyNoMoreInteractions(); } @@ -253,8 +257,10 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { inOrder.verify(spyDirectoryVisitor).visitProject(COMPONENT_TREE); inOrder.verify(spyDirectoryVisitor).visit(MODULE_2); inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_2); - inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_3); - inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_3); + inOrder.verify(spyDirectoryVisitor).visit(MODULE_3); + inOrder.verify(spyDirectoryVisitor).visitModule(MODULE_3); + inOrder.verify(spyDirectoryVisitor).visit(DIRECTORY_4); + inOrder.verify(spyDirectoryVisitor).visitDirectory(DIRECTORY_4); inOrder.verifyNoMoreInteractions(); } @@ -268,6 +274,9 @@ public class PreOrderDepthTraversalTypeAwareVisitorTest { inOrder.verify(spyModuleVisitor).visit(MODULE_2); inOrder.verify(spyModuleVisitor).visitAny(MODULE_2); inOrder.verify(spyModuleVisitor).visitModule(MODULE_2); + inOrder.verify(spyModuleVisitor).visit(MODULE_3); + inOrder.verify(spyModuleVisitor).visitAny(MODULE_3); + inOrder.verify(spyModuleVisitor).visitModule(MODULE_3); inOrder.verifyNoMoreInteractions(); } |