From 90cbbde2f38aa2de5a2d8f5b5a36dccd04c1d8f6 Mon Sep 17 00:00:00 2001 From: Wim Tibackx Date: Wed, 18 Oct 2017 15:59:26 +0700 Subject: [PATCH] Add extra tests regarding solving of symbols in JavassistClassDeclarations. --- .../SymbolSolverWithJavassistClassTest.java | 103 ++++++++++++++++-- .../resources/javassist_symbols/README.md | 22 +++- .../excluded_jar/excluded_jar.jar | Bin 0 -> 2183 bytes .../excluded_jar/result/doNotDelete.md | 0 .../excluded_jar/InterfaceExcludedJar.java | 5 + .../excluded_jar/SuperClassExcludedJar.java | 5 + .../included_jar/included_jar.jar | Bin 0 -> 2183 bytes .../included_jar/result/doNotDelete.md | 0 .../included_jar/InterfaceIncludedJar.java | 5 + .../included_jar/SuperClassIncludedJar.java | 5 + 10 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/excluded_jar.jar create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/result/doNotDelete.md create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/InterfaceExcludedJar.java create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/SuperClassExcludedJar.java create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/included_jar.jar create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/result/doNotDelete.md create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/InterfaceIncludedJar.java create mode 100644 java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/SuperClassIncludedJar.java diff --git a/java-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java b/java-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java index eeabf5007d..207a319079 100644 --- a/java-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java +++ b/java-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverWithJavassistClassTest.java @@ -24,34 +24,119 @@ import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; +import javassist.NotFoundException; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class SymbolSolverWithJavassistClassTest extends AbstractTest { private TypeSolver typeSolver; private SymbolSolver symbolSolver; - private JavassistClassDeclaration classDeclaration; + private JavassistClassDeclaration classDeclarationConcreteClass; + private JavassistClassDeclaration classDeclarationSubClassOwnJar; + private JavassistClassDeclaration classDeclarationInterfaceUserOwnJar; + private JavassistClassDeclaration classDeclarationSubClassIncludedJar; + private JavassistClassDeclaration classDeclarationInterfaceUserIncludedJar; + private JavassistClassDeclaration classDeclarationSubClassExcludedJar; + private JavassistClassDeclaration classDeclarationInterfaceUserExcludedJar; @Before public void setup() throws IOException { - final String pathToJar = adaptPath("src/test/resources/javassist_symbols/main_jar/main_jar.jar"); - typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToJar), new ReflectionTypeSolver()); + final String pathToMainJar = adaptPath("src/test/resources/javassist_symbols/main_jar/main_jar.jar"); + final String pathToIncludedJar = adaptPath("src/test/resources/javassist_symbols/included_jar/included_jar.jar"); + typeSolver = new CombinedTypeSolver(new JarTypeSolver(pathToIncludedJar), new JarTypeSolver(pathToMainJar), new ReflectionTypeSolver()); symbolSolver = new SymbolSolver(typeSolver); - classDeclaration = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.ConcreteClass"); + classDeclarationConcreteClass = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.ConcreteClass"); + classDeclarationSubClassOwnJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubClassOwnJar"); + classDeclarationSubClassIncludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubClassIncludedJar"); + classDeclarationSubClassExcludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.SubClassExcludedJar"); + classDeclarationInterfaceUserOwnJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.InterfaceUserOwnJar"); + classDeclarationInterfaceUserIncludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.InterfaceUserIncludedJar"); + classDeclarationInterfaceUserExcludedJar = (JavassistClassDeclaration) typeSolver.solveType("com.github.javaparser.javasymbolsolver.javassist_symbols.main_jar.InterfaceUserExcludedJar"); } @Test - public void testSolveSymbolCanSolveFirstOwnField() { - SymbolReference solvedSymbol = symbolSolver.solveSymbolInType(classDeclaration, "STATIC_STRING"); + public void testSolveSymbolInTypeCanSolveFirstOwnField() { + assertCanSolveSymbol("STATIC_STRING", classDeclarationConcreteClass); + } + + @Test + public void testSolveSymbolInTypeCanSolveSecondOwnField() { + assertCanSolveSymbol("SECOND_STRING", classDeclarationConcreteClass); + } + + @Test + public void testSolveSymbolInTypeCantResolveNonExistantField() { + SymbolReference solvedSymbol = symbolSolver.solveSymbolInType(classDeclarationConcreteClass, "FIELD_THAT_DOES_NOT_EXIST"); + + assertFalse(solvedSymbol.isSolved()); + + try { + solvedSymbol.getCorrespondingDeclaration(); + } catch (Exception e) { + assertTrue(e instanceof UnsupportedOperationException); + assertNull(e.getMessage()); + return; + } + fail("Expected UnsupportedOperationException when requesting CorrespondingDeclaration on unsolved SymbolRefernce"); + } + + @Test + public void testSolveSymbolInTypeCanResolveFieldInSuper() { + assertCanSolveSymbol("SUPER_FIELD", classDeclarationSubClassOwnJar); + } + + @Test + @Ignore // TODO This fails at the moment, I think it might be an issue -- discussion ongoing on Gitter + public void testSolveSymbolInTypeCanResolveFieldInSuperIncludedJar() { + assertCanSolveSymbol("SUPER_FIELD", classDeclarationSubClassIncludedJar); + } + + @Test + public void testSolveSymbolInTypeThrowsExceptionOnResolveFieldInSuperExcludedJar() { + try { + symbolSolver.solveSymbolInType(classDeclarationSubClassExcludedJar, "SUPER_FIELD"); + } catch (Exception e) { + assertTrue(e.getCause() instanceof NotFoundException); + assertEquals("com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar.SuperClassExcludedJar", e.getCause().getMessage()); + return; + } + fail("Excepted NotFoundException wrapped in a RuntimeException, but got no exception."); + } + + @Test + public void testSolveSymbolInTypeCanResolveFieldInInterface() { + assertCanSolveSymbol("INTERFACE_FIELD", classDeclarationInterfaceUserOwnJar); + } + + @Test + @Ignore // TODO This fails at the moment, I think it might be an issue -- discussion ongoing on Gitter + public void testSolveSymbolInTypeCanResolveFieldInInterfaceIncludedJar() { + assertCanSolveSymbol("INTERFACE_FIELD", classDeclarationInterfaceUserIncludedJar); + } + + @Test + public void testSolveSymbolInTypeThrowsExceptionOnResolveFieldInInterfaceExcludedJar() { + try { + symbolSolver.solveSymbolInType(classDeclarationInterfaceUserExcludedJar, "INTERFACE_FIELD"); + } catch (Exception e) { + assertTrue(e.getCause() instanceof NotFoundException); + assertEquals("com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar.InterfaceExcludedJar", e.getCause().getMessage()); + return; + } + fail("Excepted NotFoundException wrapped in a RuntimeException, but got no exception."); + } + + private void assertCanSolveSymbol(String symbolName, JavassistClassDeclaration classDeclaration) { + SymbolReference solvedSymbol = symbolSolver.solveSymbolInType(classDeclaration, symbolName); assertTrue(solvedSymbol.isSolved()); - assertEquals("STATIC_STRING", solvedSymbol.getCorrespondingDeclaration().asField().getName()); + assertEquals(symbolName, solvedSymbol.getCorrespondingDeclaration().asField().getName()); } } diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/README.md b/java-symbol-solver-testing/src/test/resources/javassist_symbols/README.md index 539951ff04..0c58f888fd 100644 --- a/java-symbol-solver-testing/src/test/resources/javassist_symbols/README.md +++ b/java-symbol-solver-testing/src/test/resources/javassist_symbols/README.md @@ -1,15 +1,33 @@ For the tests regarding resolving symbols in Jar files, we need some jar files. Some other tests within JavaSymbolSolver use established external jars for that purpose. Given the very specific cases we need here, that would severly complicate writing and maintaining tests. Therefore, I've decided to write custom jars for the cases we need. -`main_jar` contains most of the necessary classes, while `extra_jar` (TODO) is used for main_jar to refer to with the goal that it would not be included in the SymbolSolver and thus trigger an error. +`main_jar` contains most of the necessary classes, `included_jar` and `excluded_jar` both contain an interface and a superclass. Included_jar is included in the combined type solver, while excluded_jar is not. If you need to make changes to either jar, run the following commands to generate the new jars (assuming that a JDK bin directory is in your path). When you need to rebuild the jar, it is important to make sure you actually update the jar in git. Jar-files are in the git-ignore, so you'll have to force-add them using `git -f main_jar.jar`. +## Excluded jar + +``` +In ./java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar +javac -d result/ src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/*.java +cd result/ +jar cf ../excluded_jar.jar com/* +``` + +## Included jar + +``` +In ./java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar +javac -d result/ src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/*.java +cd result/ +jar cf ../included_jar.jar com/* +``` + ## Main jar ``` In ./java-symbol-solver-testing/src/test/resources/javassist_symbols/main_jar -javac -d result/ src/com/github/javaparser/javasymbolsolver/javassist_symbols/main_jar/ConcreteClass.java +javac -cp ../included_jar/included_jar.jar;../excluded_jar/excluded_jar.jar -d result/ src/com/github/javaparser/javasymbolsolver/javassist_symbols/main_jar/*.java cd result/ jar cf ../main_jar.jar com/* ``` diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/excluded_jar.jar b/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/excluded_jar.jar new file mode 100644 index 0000000000000000000000000000000000000000..93476bc08c24f1eab1beadd9f9289492c83bfd34 GIT binary patch literal 2183 zcmWIWW@Zs#;Nak3I9?Ux&42_r8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1gZlG*(ey)CcW=TeAl0HJ=UNnVbs0yKc_f9 zrwp$lmc$zZHnljjxFjBGHXgURQDSUrMRHDQN@_}cRwBgzko18bW(icY!!xfWwJ0qy zIn@tUz2yH-ux`{O;+!#Dol_T^3O zIa#{#(n6le@;?MkSpKad4Yw#xW+VhL%plnoG5tMKZ7=n_FkOYi9j1#FA z#=)fpsYTA9FvSey36B0uh61hekqL#2j(M{xJ}i@ab98pw5e1bQy;9;kD{hobXY)EW zZAK|9I2(a`U4kZr(QnHcPWypC8iu z)FM`KcFV(EIcHC61zytF`IFU6LOS2@>Fw5!lQMt3mu-3%zioHQ$>7(Ee8mp+oW1HF zCbRI-KQ@IM?xLpQug`@(*xe`MUm|5u6j8OH>=)aoC_a<9*Sud?=1xt1n-7Ym4O;86 z#DOtX0*)m{CJ_eIvJzGhg33x%05AMNC1-#)s#fIE3sh1ffGv;-*NRkbf=u9Iz+K8A zOgIc=qLg_Ejp#WTRO%tX8z2)&BT5;F+YC@ChyV(}aKdf|mNF5yp`cO`0aA%K6k8dI z+Zs?Qi2!>ju?DToL_{|z%#rhY0>VNdO97aGhzu`Guc6q9y9`B6d?42#r|Co#*R(KG Z%QbjPn*eWCHju5HKU7B0|31Et8M@Q literal 0 HcmV?d00001 diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/result/doNotDelete.md b/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/result/doNotDelete.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/InterfaceExcludedJar.java b/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/InterfaceExcludedJar.java new file mode 100644 index 0000000000..0dd82c2539 --- /dev/null +++ b/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/InterfaceExcludedJar.java @@ -0,0 +1,5 @@ +package com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar; + +public interface InterfaceExcludedJar { + public static final String INTERFACE_FIELD = "ThisIsAString"; +} \ No newline at end of file diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/SuperClassExcludedJar.java b/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/SuperClassExcludedJar.java new file mode 100644 index 0000000000..6eb45f0fe0 --- /dev/null +++ b/java-symbol-solver-testing/src/test/resources/javassist_symbols/excluded_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/excluded_jar/SuperClassExcludedJar.java @@ -0,0 +1,5 @@ +package com.github.javaparser.javasymbolsolver.javassist_symbols.excluded_jar; + +public class SuperClassExcludedJar { + public static final String SUPER_FIELD = "ThisIsAString"; +} \ No newline at end of file diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/included_jar.jar b/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/included_jar.jar new file mode 100644 index 0000000000000000000000000000000000000000..b3d2f946d848187e8470146a4c60a2862986d36e GIT binary patch literal 2183 zcmWIWW@Zs#;Nak3xEvMa&42_r8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1g79=Hiqv%@p5B(*3lF*(%} zYO_~jkzR66VsUY9|3N<{LlM{a&Zz>XQsw_z?(QgdEl^vjIEf?iVA>_k(icm%EPFfQ zN4DM{2K!SHY#q|!@Aqxq@qW+y`RDZ+_;;Ksn3w3WQ^GRocb>@*U z1Ld5vX&1Aj?S6T@+N6{8-<;hEWcLt4$c3XbQ7{PXoVy4K{a*V=il`|pbi zPP>#FvG(zGG;TBem;4 zquAx#s(;!wUhwu;_nh;<-svP_S<*nH6zkW$Wb|nLcN@INMefPCV9hMo(D6$lCi^ z`;p_Dj5dB?tkHPp`GEf9WsDq`82DW1orZzyxTdOr|`Qb@+ED5W;N-|jEP=LXMg^wdpZ5+Q8TFEZ&I& zW2giiON>k+45(!#tRMuHm8bw-_<>5!0B=;S$fXykq(lH)AQP??soVsaz{P;OltY+s z7|28^^Kfefm3j#92FOIxh*AdPHUm@&B7g!goUogLrA)+aD5z9KfK=iQ#a2e*wgyy6 zBETL>tU)U?5z!4QHIegr0>VNdO97aGhzu`Guc6q9y9`B6d?42#r|Co#*R(KG%QbjP Vn*eWCHju5HKU7B0|1fEse%9i literal 0 HcmV?d00001 diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/result/doNotDelete.md b/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/result/doNotDelete.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/InterfaceIncludedJar.java b/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/InterfaceIncludedJar.java new file mode 100644 index 0000000000..6afbd0974d --- /dev/null +++ b/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/InterfaceIncludedJar.java @@ -0,0 +1,5 @@ +package com.github.javaparser.javasymbolsolver.javassist_symbols.included_jar; + +public interface InterfaceIncludedJar { + public static final String INTERFACE_FIELD = "ThisIsAString"; +} \ No newline at end of file diff --git a/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/SuperClassIncludedJar.java b/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/SuperClassIncludedJar.java new file mode 100644 index 0000000000..44be5ca2b9 --- /dev/null +++ b/java-symbol-solver-testing/src/test/resources/javassist_symbols/included_jar/src/com/github/javaparser/javasymbolsolver/javassist_symbols/included_jar/SuperClassIncludedJar.java @@ -0,0 +1,5 @@ +package com.github.javaparser.javasymbolsolver.javassist_symbols.included_jar; + +public class SuperClassIncludedJar { + public static final String SUPER_FIELD = "ThisIsAString"; +} \ No newline at end of file