From 95eb40c488391c93eea202eee3061d0b628d9679 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 7 Feb 2005 22:33:54 +0300 Subject: [PATCH] cyclic dependencies tests --- .../cycle/packageScope1/com/a/A.java | 5 + .../cycle/packageScope1/com/b/B.java | 5 + .../packageScope2/com/subscope1/a/A.java | 5 + .../packageScope2/com/subscope1/b/B.java | 5 + .../packageScope2/com/subscope2/c/C.java | 5 + .../packageScope2/com/subscope2/d/D.java | 5 + testData/dependencies/cycle/t1/com/a/A.java | 5 + testData/dependencies/cycle/t1/com/b/B.java | 5 + testData/dependencies/cycle/t2/com/a/A.java | 5 + testData/dependencies/cycle/t2/com/b/B.java | 5 + testData/dependencies/cycle/t2/com/c/C.java | 5 + testData/dependencies/cycle/t2/com/d/D.java | 5 + testData/dependencies/cycle/t3/com/a/A.java | 5 + testData/dependencies/cycle/t3/com/b/B.java | 7 + testData/dependencies/cycle/t3/com/c/C.java | 5 + testData/dependencies/cycle/t3/com/d/D.java | 5 + testData/dependencies/cycle/t4/com/a/A.java | 7 + testData/dependencies/cycle/t4/com/b/B.java | 5 + testData/dependencies/cycle/t4/com/c/C.java | 5 + testData/dependencies/cycle/t4/com/d/D.java | 5 + testData/dependencies/cycle/t5/com/a/A.java | 5 + testData/dependencies/cycle/t5/com/b/B.java | 7 + testData/dependencies/cycle/t5/com/c/C.java | 5 + testData/dependencies/cycle/t5/com/d/D.java | 5 + .../dependencies/CyclicDependenciesTest.java | 196 ++++++++++++++++++ 25 files changed, 322 insertions(+) create mode 100644 testData/dependencies/cycle/packageScope1/com/a/A.java create mode 100644 testData/dependencies/cycle/packageScope1/com/b/B.java create mode 100644 testData/dependencies/cycle/packageScope2/com/subscope1/a/A.java create mode 100644 testData/dependencies/cycle/packageScope2/com/subscope1/b/B.java create mode 100644 testData/dependencies/cycle/packageScope2/com/subscope2/c/C.java create mode 100644 testData/dependencies/cycle/packageScope2/com/subscope2/d/D.java create mode 100644 testData/dependencies/cycle/t1/com/a/A.java create mode 100644 testData/dependencies/cycle/t1/com/b/B.java create mode 100644 testData/dependencies/cycle/t2/com/a/A.java create mode 100644 testData/dependencies/cycle/t2/com/b/B.java create mode 100644 testData/dependencies/cycle/t2/com/c/C.java create mode 100644 testData/dependencies/cycle/t2/com/d/D.java create mode 100644 testData/dependencies/cycle/t3/com/a/A.java create mode 100644 testData/dependencies/cycle/t3/com/b/B.java create mode 100644 testData/dependencies/cycle/t3/com/c/C.java create mode 100644 testData/dependencies/cycle/t3/com/d/D.java create mode 100644 testData/dependencies/cycle/t4/com/a/A.java create mode 100644 testData/dependencies/cycle/t4/com/b/B.java create mode 100644 testData/dependencies/cycle/t4/com/c/C.java create mode 100644 testData/dependencies/cycle/t4/com/d/D.java create mode 100644 testData/dependencies/cycle/t5/com/a/A.java create mode 100644 testData/dependencies/cycle/t5/com/b/B.java create mode 100644 testData/dependencies/cycle/t5/com/c/C.java create mode 100644 testData/dependencies/cycle/t5/com/d/D.java create mode 100644 testSource/com/intellij/dependencies/CyclicDependenciesTest.java diff --git a/testData/dependencies/cycle/packageScope1/com/a/A.java b/testData/dependencies/cycle/packageScope1/com/a/A.java new file mode 100644 index 000000000000..5d58c53cc0cd --- /dev/null +++ b/testData/dependencies/cycle/packageScope1/com/a/A.java @@ -0,0 +1,5 @@ +package com.a; +import com.b.B; +public class A{ + B b = new B(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/packageScope1/com/b/B.java b/testData/dependencies/cycle/packageScope1/com/b/B.java new file mode 100644 index 000000000000..549a0a3a7947 --- /dev/null +++ b/testData/dependencies/cycle/packageScope1/com/b/B.java @@ -0,0 +1,5 @@ +package com.b; +import com.a.A; +public class B{ + A a = new A(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/packageScope2/com/subscope1/a/A.java b/testData/dependencies/cycle/packageScope2/com/subscope1/a/A.java new file mode 100644 index 000000000000..f58a98ae18e0 --- /dev/null +++ b/testData/dependencies/cycle/packageScope2/com/subscope1/a/A.java @@ -0,0 +1,5 @@ +package com.subscope1.a; +import com.subscope1.b.B; +public class A{ +B b = new B(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/packageScope2/com/subscope1/b/B.java b/testData/dependencies/cycle/packageScope2/com/subscope1/b/B.java new file mode 100644 index 000000000000..b1cb3e0faef4 --- /dev/null +++ b/testData/dependencies/cycle/packageScope2/com/subscope1/b/B.java @@ -0,0 +1,5 @@ +package com.subscope1.b; +import com.subscope1.a.A; +public class B{ +A a = new A(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/packageScope2/com/subscope2/c/C.java b/testData/dependencies/cycle/packageScope2/com/subscope2/c/C.java new file mode 100644 index 000000000000..aed4907dfada --- /dev/null +++ b/testData/dependencies/cycle/packageScope2/com/subscope2/c/C.java @@ -0,0 +1,5 @@ +package com.subscope2.c; +import com.subscope2.d.D; +public class C{ +D d = new D(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/packageScope2/com/subscope2/d/D.java b/testData/dependencies/cycle/packageScope2/com/subscope2/d/D.java new file mode 100644 index 000000000000..8be83261730e --- /dev/null +++ b/testData/dependencies/cycle/packageScope2/com/subscope2/d/D.java @@ -0,0 +1,5 @@ +package com.subscope2.d; +import com.subscope2.c.C; +public class D{ +C c = new C(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t1/com/a/A.java b/testData/dependencies/cycle/t1/com/a/A.java new file mode 100644 index 000000000000..5d58c53cc0cd --- /dev/null +++ b/testData/dependencies/cycle/t1/com/a/A.java @@ -0,0 +1,5 @@ +package com.a; +import com.b.B; +public class A{ + B b = new B(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t1/com/b/B.java b/testData/dependencies/cycle/t1/com/b/B.java new file mode 100644 index 000000000000..549a0a3a7947 --- /dev/null +++ b/testData/dependencies/cycle/t1/com/b/B.java @@ -0,0 +1,5 @@ +package com.b; +import com.a.A; +public class B{ + A a = new A(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t2/com/a/A.java b/testData/dependencies/cycle/t2/com/a/A.java new file mode 100644 index 000000000000..b24a2f0f3ce5 --- /dev/null +++ b/testData/dependencies/cycle/t2/com/a/A.java @@ -0,0 +1,5 @@ +package com.a; +import com.b.B; +public class A{ +B b = new B(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t2/com/b/B.java b/testData/dependencies/cycle/t2/com/b/B.java new file mode 100644 index 000000000000..789344180ee7 --- /dev/null +++ b/testData/dependencies/cycle/t2/com/b/B.java @@ -0,0 +1,5 @@ +package com.b; +import com.a.A; +public class B{ +A a = new A(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t2/com/c/C.java b/testData/dependencies/cycle/t2/com/c/C.java new file mode 100644 index 000000000000..2fd0eba6ec59 --- /dev/null +++ b/testData/dependencies/cycle/t2/com/c/C.java @@ -0,0 +1,5 @@ +package com.c; +import com.d.D; +public class C{ +D d = new D(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t2/com/d/D.java b/testData/dependencies/cycle/t2/com/d/D.java new file mode 100644 index 000000000000..a3298412a76d --- /dev/null +++ b/testData/dependencies/cycle/t2/com/d/D.java @@ -0,0 +1,5 @@ +package com.d; +import com.c.C; +public class D{ +C c = new C(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t3/com/a/A.java b/testData/dependencies/cycle/t3/com/a/A.java new file mode 100644 index 000000000000..dde7447b20f9 --- /dev/null +++ b/testData/dependencies/cycle/t3/com/a/A.java @@ -0,0 +1,5 @@ +package com.a; +import com.c.C; +public class A{ +C c = new C(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t3/com/b/B.java b/testData/dependencies/cycle/t3/com/b/B.java new file mode 100644 index 000000000000..afa6a3f04c92 --- /dev/null +++ b/testData/dependencies/cycle/t3/com/b/B.java @@ -0,0 +1,7 @@ +package com.b; +import com.a.A; +import com.d.D; +public class B{ +A a = new A(); +D d = new D(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t3/com/c/C.java b/testData/dependencies/cycle/t3/com/c/C.java new file mode 100644 index 000000000000..2ae8c0cf90a2 --- /dev/null +++ b/testData/dependencies/cycle/t3/com/c/C.java @@ -0,0 +1,5 @@ +package com.c; +import com.b.B; +public class C{ +B b = new B(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t3/com/d/D.java b/testData/dependencies/cycle/t3/com/d/D.java new file mode 100644 index 000000000000..b0f9716ac5ec --- /dev/null +++ b/testData/dependencies/cycle/t3/com/d/D.java @@ -0,0 +1,5 @@ +package com.d; +import com.b.B; +public class D{ +B b = new B(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t4/com/a/A.java b/testData/dependencies/cycle/t4/com/a/A.java new file mode 100644 index 000000000000..f24b779585a6 --- /dev/null +++ b/testData/dependencies/cycle/t4/com/a/A.java @@ -0,0 +1,7 @@ +package com.a; +import com.b.B; +import com.c.C; +public class A{ +B b = new B(); +C c = new C(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t4/com/b/B.java b/testData/dependencies/cycle/t4/com/b/B.java new file mode 100644 index 000000000000..789344180ee7 --- /dev/null +++ b/testData/dependencies/cycle/t4/com/b/B.java @@ -0,0 +1,5 @@ +package com.b; +import com.a.A; +public class B{ +A a = new A(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t4/com/c/C.java b/testData/dependencies/cycle/t4/com/c/C.java new file mode 100644 index 000000000000..2fd0eba6ec59 --- /dev/null +++ b/testData/dependencies/cycle/t4/com/c/C.java @@ -0,0 +1,5 @@ +package com.c; +import com.d.D; +public class C{ +D d = new D(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t4/com/d/D.java b/testData/dependencies/cycle/t4/com/d/D.java new file mode 100644 index 000000000000..f07a92058603 --- /dev/null +++ b/testData/dependencies/cycle/t4/com/d/D.java @@ -0,0 +1,5 @@ +package com.d; +import com.a.A; +public class D{ +A a = new A(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t5/com/a/A.java b/testData/dependencies/cycle/t5/com/a/A.java new file mode 100644 index 000000000000..dde7447b20f9 --- /dev/null +++ b/testData/dependencies/cycle/t5/com/a/A.java @@ -0,0 +1,5 @@ +package com.a; +import com.c.C; +public class A{ +C c = new C(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t5/com/b/B.java b/testData/dependencies/cycle/t5/com/b/B.java new file mode 100644 index 000000000000..afa6a3f04c92 --- /dev/null +++ b/testData/dependencies/cycle/t5/com/b/B.java @@ -0,0 +1,7 @@ +package com.b; +import com.a.A; +import com.d.D; +public class B{ +A a = new A(); +D d = new D(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t5/com/c/C.java b/testData/dependencies/cycle/t5/com/c/C.java new file mode 100644 index 000000000000..2ae8c0cf90a2 --- /dev/null +++ b/testData/dependencies/cycle/t5/com/c/C.java @@ -0,0 +1,5 @@ +package com.c; +import com.b.B; +public class C{ +B b = new B(); +} \ No newline at end of file diff --git a/testData/dependencies/cycle/t5/com/d/D.java b/testData/dependencies/cycle/t5/com/d/D.java new file mode 100644 index 000000000000..b0f9716ac5ec --- /dev/null +++ b/testData/dependencies/cycle/t5/com/d/D.java @@ -0,0 +1,5 @@ +package com.d; +import com.b.B; +public class D{ +B b = new B(); +} \ No newline at end of file diff --git a/testSource/com/intellij/dependencies/CyclicDependenciesTest.java b/testSource/com/intellij/dependencies/CyclicDependenciesTest.java new file mode 100644 index 000000000000..52014b0d2890 --- /dev/null +++ b/testSource/com/intellij/dependencies/CyclicDependenciesTest.java @@ -0,0 +1,196 @@ +package com.intellij.dependencies; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; +import com.intellij.openapi.module.Module; +import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.PsiTestCase; +import com.intellij.cyclicDependencies.CyclicDependenciesBuilder; +import com.intellij.analysis.AnalysisScope; +import com.intellij.psi.PsiPackage; + +import java.util.*; + +/** + * User: anna + * Date: Feb 2, 2005 + */ +public class CyclicDependenciesTest extends PsiTestCase { + protected void setUp() throws Exception { + super.setUp(); + + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + try { + String root = PathManagerEx.getTestDataPath() + "/dependencies/cycle/" + getTestName(true); + PsiTestUtil.removeAllRoots(myModule, JavaSdkImpl.getMockJdk("java 1.4")); + PsiTestUtil.createTestProjectStructure(myProject, myModule, root, myFilesToDelete); + } + catch (Exception e) { + LOG.error(e); + } + } + }); + } + + public void testT1() { + // com.a<->com.b + final CyclicDependenciesBuilder builder = new CyclicDependenciesBuilder(myProject, + new AnalysisScope(myProject, AnalysisScope.SOURCE_JAVA_FILES), + 1); + builder.analyze(); + final HashMap>> cyclicDependencies = builder.getCyclicDependencies(); + HashMap expected = new HashMap(); + expected.put("com.b", new String[][]{{"com.b", "com.a"}}); + expected.put("com.a", new String[][]{{"com.a", "com.b"}}); + checkResult(expected, cyclicDependencies); + } + + public void testPackageScope1(){ + // com.a<->com.b + final CyclicDependenciesBuilder builder = new CyclicDependenciesBuilder(myProject, + new AnalysisScope(myPsiManager.findPackage("com"), AnalysisScope.SOURCE_JAVA_FILES), + 1); + builder.analyze(); + final HashMap>> cyclicDependencies = builder.getCyclicDependencies(); + HashMap expected = new HashMap(); + expected.put("com.b", new String[][]{{"com.b", "com.a"}}); + expected.put("com.a", new String[][]{{"com.a", "com.b"}}); + checkResult(expected, cyclicDependencies); + } + + public void testT2() { + //com.b<->com.a + //com.c<->com.d + final CyclicDependenciesBuilder builder = new CyclicDependenciesBuilder(myProject, + new AnalysisScope(myProject, AnalysisScope.SOURCE_JAVA_FILES), + 1); + builder.analyze(); + final HashMap>> cyclicDependencies = builder.getCyclicDependencies(); + HashMap expected = new HashMap(); + expected.put("com.b", new String[][]{{"com.b", "com.a"}}); + expected.put("com.d", new String[][]{{"com.d", "com.c"}}); + expected.put("com.c", new String[][]{{"com.c", "com.d"}}); + expected.put("com.a", new String[][]{{"com.a", "com.b"}}); + checkResult(expected, cyclicDependencies); + } + + public void testPackageScope2() { + //com.b<->com.a - find + //com.c<->com.d - not in scope + final CyclicDependenciesBuilder builder = new CyclicDependenciesBuilder(myProject, + new AnalysisScope(myPsiManager.findPackage("com.subscope1"), AnalysisScope.SOURCE_JAVA_FILES), + 1); + builder.analyze(); + final HashMap>> cyclicDependencies = builder.getCyclicDependencies(); + HashMap expected = new HashMap(); + expected.put("com.subscope1.b", new String[][]{{"com.subscope1.b", "com.subscope1.a"}}); + expected.put("com.subscope1.a", new String[][]{{"com.subscope1.a", "com.subscope1.b"}}); + checkResult(expected, cyclicDependencies); + } + + public void testT3() { + //com.b<->com.d + //com.b->com.a->com.c->com.b + final CyclicDependenciesBuilder builder = new CyclicDependenciesBuilder(myProject, + new AnalysisScope(myProject, AnalysisScope.SOURCE_JAVA_FILES), + 1); + builder.analyze(); + final HashMap>> cyclicDependencies = builder.getCyclicDependencies(); + HashMap expected = new HashMap(); + expected.put("com.b", new String[][]{{"com.b", "com.d"}}); + expected.put("com.d", new String[][]{{"com.d", "com.b"}}); + expected.put("com.c", new String[][]{{"com.c", "com.b", "com.a"}}); + expected.put("com.a", new String[][]{{"com.a", "com.c", "com.b"}}); + checkResult(expected, cyclicDependencies, true); + } + + public void testT4() { + //com.a<->com.b + //com.a->com.c->com.d->com.a + final CyclicDependenciesBuilder builder = new CyclicDependenciesBuilder(myProject, + new AnalysisScope(myProject, AnalysisScope.SOURCE_JAVA_FILES), + 1); + builder.analyze(); + final HashMap>> cyclicDependencies = builder.getCyclicDependencies(); + HashMap expected = new HashMap(); + expected.put("com.b", new String[][]{{"com.b", "com.a"}}); + expected.put("com.d", new String[][]{{"com.d", "com.a", "com.c"}}); + expected.put("com.c", new String[][]{{"com.c", "com.d", "com.a"}}); + expected.put("com.a", new String[][]{{"com.a", "com.b"}}); + checkResult(expected, cyclicDependencies); + } + + public void testT5() { + //com.b<->com.d + //com.b->com.a->com.c->com.b + final CyclicDependenciesBuilder builder = new CyclicDependenciesBuilder(myProject, + new AnalysisScope(myProject, AnalysisScope.SOURCE_JAVA_FILES), + 10); + builder.analyze(); + final HashMap>> cyclicDependencies = builder.getCyclicDependencies(); + HashMap expected = new HashMap(); + expected.put("com.b", new String[][]{{"com.b", "com.d"}, {"com.b", "com.a", "com.c"}}); + expected.put("com.d", new String[][]{{"com.d", "com.b"}, {"com.d", "com.b", "com.a", "com.c", "com.b"}}); + expected.put("com.c", new String[][]{{"com.c", "com.b", "com.a"}, {"com.c", "com.b", "com.d", "com.b", "com.a"}}); + expected.put("com.a", new String[][]{{"com.a", "com.c", "com.b"}, {"com.a", "com.c", "com.b", "com.d", "com.b"}}); + checkResult(expected, cyclicDependencies, true); + } + + private void checkResult(HashMap expected, HashMap>> cycles) { + assertEquals(expected.size(), cycles.size()); + Iterator it = cycles.keySet().iterator(); + for (Iterator iterator = expected.keySet().iterator(); iterator.hasNext();) { + final String packs = iterator.next(); + final PsiPackage psiPackage = it.next(); + assertEquals(packs, psiPackage.getQualifiedName()); + assertEquals(expected.get(packs).length, cycles.get(psiPackage).size()); + Iterator> iC = cycles.get(psiPackage).iterator(); + for (int i = 0; i < expected.get(packs).length; i++) { + final String[] expectedCycle = expected.get(packs)[i]; + final ArrayList cycle = iC.next(); + assertEquals(expectedCycle.length, cycle.size()); + Iterator iCycle = cycle.iterator(); + for (int j = 0; j < expectedCycle.length; j++) { + final String expectedInCycle = expectedCycle[j]; + final PsiPackage packageInCycle = iCycle.next(); + assertEquals(expectedInCycle, packageInCycle.getQualifiedName()); + } + } + } + } + + private void checkResult(HashMap expected, HashMap>> cycles, boolean forceContains){ + assertEquals(expected.size(), cycles.size()); + for (Iterator iterator = cycles.keySet().iterator(); iterator.hasNext();) { + final PsiPackage psiPackage = iterator.next(); + assertTrue(expected.containsKey(psiPackage.getQualifiedName())); + final String packs = psiPackage.getQualifiedName(); + if (forceContains){ + assertEquals(expected.get(packs).length, cycles.get(psiPackage).size()); + } + for (Iterator> iC = cycles.get(psiPackage).iterator(); iC.hasNext();) { + final ArrayList cycle = iC.next(); + final String[][] expectedCycles = expected.get(packs); + final String [] string = new String[cycle.size()]; + int i = 0; + for (Iterator iCycle = cycle.iterator(); iCycle.hasNext();) { + final PsiPackage packageInCycle = iCycle.next(); + string[i++] = packageInCycle.getQualifiedName(); + } + assertTrue(findInMatrix(expectedCycles, string) > -1); + } + } + } + + private static int findInMatrix(String [][] matrix, String [] string){ + for (int i = 0; i < matrix.length; i++) { + String[] strings = matrix[i]; + if (Arrays.equals(strings, string)){ + return i; + } + } + return -1; + } +}