/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.core.tests.model; import java.io.FileInputStream; import java.io.IOException; import java.util.Vector; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.*; import org.eclipse.jdt.core.*; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.search.*; import org.eclipse.jdt.core.tests.model.Semaphore.TimeOutException; import org.eclipse.jdt.core.tests.util.Util; import org.eclipse.jdt.internal.core.JavaElement; import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.core.LocalVariable; import org.eclipse.jdt.internal.core.search.BasicSearchEngine; import org.eclipse.jdt.internal.core.search.indexing.IndexManager; import org.eclipse.jdt.internal.core.search.processing.IJob; import junit.framework.Test; /* * Test indexing support. */ @SuppressWarnings({"rawtypes", "unchecked"}) public class SearchTests extends ModifyingResourceTests implements IJavaSearchConstants { /* * Empty jar contents. * Generated using the following code: String filePath = "d:\\temp\\empty.jar"; new JarOutputStream(new FileOutputStream(filePath), new Manifest()).close(); byte[] contents = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(filePath)); System.out.print("{"); for (int i = 0, length = contents.length; i < length; i++) { System.out.print(contents[i]); System.out.print(", "); } System.out.print("}"); */ static final byte[] EMPTY_JAR = {80, 75, 3, 4, 20, 0, 8, 0, 8, 0, 106, -100, 116, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 4, 0, 77, 69, 84, 65, 45, 73, 78, 70, 47, 77, 65, 78, 73, 70, 69, 83, 84, 46, 77, 70, -2, -54, 0, 0, -29, -27, 2, 0, 80, 75, 7, 8, -84, -123, -94, 20, 4, 0, 0, 0, 2, 0, 0, 0, 80, 75, 1, 2, 20, 0, 20, 0, 8, 0, 8, 0, 106, -100, 116, 46, -84, -123, -94, 20, 4, 0, 0, 0, 2, 0, 0, 0, 20, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 84, 65, 45, 73, 78, 70, 47, 77, 65, 78, 73, 70, 69, 83, 84, 46, 77, 70, -2, -54, 0, 0, 80, 75, 5, 6, 0, 0, 0, 0, 1, 0, 1, 0, 70, 0, 0, 0, 74, 0, 0, 0, 0, 0, }; class WaitUntilReadyMonitor implements IProgressMonitor { public Semaphore sem = new Semaphore(); public void beginTask(String name, int totalWork) { } public void internalWorked(double work) { } public void done() { } public boolean isCanceled() { return false; } public void setCanceled(boolean value) { } public void setTaskName(String name) { } public void subTask(String name) { // concurrent job is signaling it is working this.sem.release(); } public void worked(int work) { } } public static class SearchMethodNameRequestor extends MethodNameRequestor { Vector results = new Vector<>(); @Override public void acceptMethod( char[] methodName, int parameterCount, char[] declaringQualifier, char[] simpleTypeName, int typeModifiers, char[] packageName, char[] signature, char[][] parameterTypes, char[][] parameterNames, char[] returnType, int modifiers, String path, int methodIndex) { StringBuffer buffer = new StringBuffer(); char c = '.'; char[] noname = new String("<NONAME>").toCharArray(); buffer.append(path); buffer.append(' '); buffer.append(returnType == null ? CharOperation.NO_CHAR: returnType); buffer.append(' '); checkAndAddtoBuffer(buffer, packageName, c); checkAndAddtoBuffer(buffer, declaringQualifier, c); checkAndAddtoBuffer(buffer, simpleTypeName == null ? noname : simpleTypeName, c); buffer.append(methodName); buffer.append('('); parameterTypes = signature == null ? parameterTypes : Signature.getParameterTypes(signature); for (int i = 0; i < parameterCount; i++) { if (parameterTypes != null) { char[] parameterType; if (parameterTypes.length != parameterCount) { System.out.println("Error"); } if (signature != null) { parameterType = Signature.toCharArray(Signature.getTypeErasure(parameterTypes[i])); CharOperation.replace(parameterType, '/', '.'); } else { parameterType = parameterTypes[i]; } buffer.append(parameterType); } else { buffer.append('?'); // parameter type names are not stored in the indexes buffer.append('?'); buffer.append('?'); } buffer.append(' '); if (parameterNames != null) { buffer.append(parameterNames[i]); } else { buffer.append("arg"+i); } if (parameterCount > 1 && i < parameterCount - 1) buffer.append(','); } buffer.append(')'); this.results.addElement(buffer.toString()); } static void checkAndAddtoBuffer(StringBuffer buffer, char[] precond, char c) { if (precond == null || precond.length == 0) return; buffer.append(precond); buffer.append(c); } public String toString(){ int length = this.results.size(); String[] strings = new String[length]; this.results.toArray(strings); org.eclipse.jdt.internal.core.util.Util.sort(strings); StringBuffer buffer = new StringBuffer(100); for (int i = 0; i < length; i++){ buffer.append(strings[i]); if (i != length-1) { buffer.append('\n'); } } return buffer.toString(); } public int size() { return this.results.size(); } } public static class SearchTypeNameRequestor extends TypeNameRequestor { Vector results = new Vector(); public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) { char[] typeName = CharOperation.concat( CharOperation.concatWith(enclosingTypeNames, '$'), simpleTypeName, '$'); this.results.addElement(new String(CharOperation.concat(packageName, typeName, '.'))); } public String toString(){ int length = this.results.size(); String[] strings = new String[length]; this.results.toArray(strings); org.eclipse.jdt.internal.core.util.Util.sort(strings); StringBuffer buffer = new StringBuffer(100); for (int i = 0; i < length; i++){ buffer.append(strings[i]); if (i != length-1) { buffer.append('\n'); } } return buffer.toString(); } public String unsortedString() { int length = this.results.size(); String[] strings = new String[length]; this.results.toArray(strings); StringBuffer buffer = new StringBuffer(100); for (int i = 0; i < length; i++){ buffer.append(strings[i]); if (i != length-1) { buffer.append('\n'); } } return buffer.toString(); } public int size() { return this.results.size(); } } static class WaitingJob implements IJob { private static final int MAX_WAIT = 30000; // wait 30s max private Semaphore startingSem = new Semaphore(); private Semaphore runningSem = new Semaphore(); public boolean belongsTo(String jobFamily) { return false; } public void cancel() { } public void ensureReadyToRun() { } public boolean execute(IProgressMonitor progress) { this.startingSem.release(); try { this.runningSem.acquire(MAX_WAIT); } catch (TimeOutException e) { e.printStackTrace(); } return true; } public String getJobFamily() { return "SearchTests.Waiting"; } public void suspend() throws Semaphore.TimeOutException, CoreException { runAndSuspend(null); } public void runAndSuspend(IWorkspaceRunnable runnable) throws Semaphore.TimeOutException, CoreException { IndexManager indexManager = JavaModelManager.getIndexManager(); indexManager.disable(); if (runnable != null) { runnable.run(null); } indexManager.request(this); indexManager.enable(); this.startingSem.acquire(30000); // wait for job to start (wait 30s max) } public void resume() { this.runningSem.release(); JavaModelManager.getIndexManager().enable(); } } static { //TESTS_PREFIX = "testSearchPatternValidateMatchRule"; } public static Test suite() { return buildModelTestSuite(SearchTests.class); } public SearchTests(String name) { super(name); } protected void assertAllTypes(int waitingPolicy, IProgressMonitor progressMonitor, String expected) throws JavaModelException { assertAllTypes("Unexpected all types", null/* no specific project*/, waitingPolicy, progressMonitor, expected); } protected void assertAllTypes(String expected) throws JavaModelException { assertAllTypes(WAIT_UNTIL_READY_TO_SEARCH, null/* no progress monitor*/, expected); } protected void assertAllTypes(String message, IJavaProject project, String expected) throws JavaModelException { assertAllTypes(message, project, WAIT_UNTIL_READY_TO_SEARCH, null/* no progress monitor*/, expected); } protected void assertAllTypes(String message, IJavaProject project, int waitingPolicy, IProgressMonitor progressMonitor, String expected) throws JavaModelException { IJavaSearchScope scope = project == null ? SearchEngine.createWorkspaceScope() : SearchEngine.createJavaSearchScope(new IJavaElement[] {project}); SearchEngine searchEngine = new SearchEngine(); SearchTypeNameRequestor requestor = new SearchTypeNameRequestor(); searchEngine.searchAllTypeNames( null, SearchPattern.R_EXACT_MATCH, null, SearchPattern.R_PATTERN_MATCH, // case insensitive TYPE, scope, requestor, waitingPolicy, progressMonitor); String actual = requestor.toString(); if (!expected.equals(actual)){ System.out.println(Util.displayString(actual, 3)); } assertEquals( message, expected, actual); } protected void assertPattern(String expected, SearchPattern actualPattern) { String actual = actualPattern == null ? null : actualPattern.toString(); if (!expected.equals(actual)) { System.out.print(actual == null ? "null" : Util.displayString(actual, 2)); System.out.println(","); } assertEquals( "Unexpected search pattern", expected, actual); } protected void assertValidMatchRule(String pattern, int rule) { assertValidMatchRule(pattern, rule, rule); } protected void assertValidMatchRule(String pattern, int rule, int expected) { int validated = SearchPattern.validateMatchRule(pattern, rule); String givenRule = BasicSearchEngine.getMatchRuleString(rule); String validatedRule = BasicSearchEngine.getMatchRuleString(validated); String expectedRule = BasicSearchEngine.getMatchRuleString(expected); if (!validatedRule.equals(expectedRule)) { System.out.println("Test "+getName()); System.out.print(" assertValidMatchRule(\""); System.out.print(pattern); System.out.println("\","); System.out.print(" SearchPattern."); System.out.print(givenRule); System.out.println("\","); System.out.print(" SearchPattern."); System.out.print(validatedRule); System.out.println(");"); assertEquals(pattern+"' does not match expected match rule!", expectedRule, validatedRule); } } public void setUpSuite() throws Exception { super.setUpSuite(); createJavaProject("P"); createFolder("/P/x/y/z"); createFile( "/P/x/y/z/Foo.java", "package x.y,z;\n" + "import x.y.*;\n" + "import java.util.Vector;\n" + "public class Foo {\n" + " int field;\n" + " void bar() {\n" + " }\n" + "}" ); createFile( "/P/x/y/z/I.java", "package x.y,z;\n" + "public interface I {\n" + "}" ); } public void tearDownSuite() throws Exception { deleteProject("P"); super.tearDownSuite(); } /* * Ensure that changing the classpath in the middle of reindexing * a project causes another request to reindex. */ public void testChangeClasspath() throws CoreException, TimeOutException { WaitingJob job = new WaitingJob(); try { // setup: suspend indexing and create a project (prj=src) with one cu job.runAndSuspend(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { JavaCore.run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor2) throws CoreException { createJavaProject("P1"); createFile( "/P1/X.java", "public class X {\n" + "}" ); } }, monitor); } }); // remove source folder from classpath IJavaProject project = getJavaProject("P1"); project.setRawClasspath( new IClasspathEntry[0], null); // resume waiting job job.resume(); assertAllTypes( "Unexpected all types after removing source folder", project, "" ); } finally { job.resume(); deleteProject("P1"); } } /* * Ensure that removing a project source folder and adding another source folder removes the existing cus from the index * (regression test for bug 73356 Index not updated after adding a source folder */ public void testChangeClasspath2() throws CoreException { try { final IJavaProject project = createJavaProject("P1", new String[] {""}, "bin"); createFile( "/P1/X.java", "public class X {}" ); assertAllTypes( "Unexpected types before changing the classpath", null, // workspace search "X\n" + "java.io.Serializable\n" + "java.lang.Class\n" + "java.lang.CloneNotSupportedException\n" + "java.lang.Error\n" + "java.lang.Exception\n" + "java.lang.IllegalMonitorStateException\n" + "java.lang.InterruptedException\n" + "java.lang.Object\n" + "java.lang.RuntimeException\n" + "java.lang.String\n" + "java.lang.Throwable\n" + "x.y.Foo\n" + "x.y.I" ); getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { createFolder("/P1/src"); project.setRawClasspath(createClasspath(new String[] {"/P1/src"}, false, false), null); } }, null); assertAllTypes( "Unexpected types after changing the classpath", null, // workspace search "java.io.Serializable\n" + "java.lang.Class\n" + "java.lang.CloneNotSupportedException\n" + "java.lang.Error\n" + "java.lang.Exception\n" + "java.lang.IllegalMonitorStateException\n" + "java.lang.InterruptedException\n" + "java.lang.Object\n" + "java.lang.RuntimeException\n" + "java.lang.String\n" + "java.lang.Throwable\n" + "x.y.Foo\n" + "x.y.I" ); } finally { deleteProject("P1"); } } /* * Ensure that performing a concurrent job while indexing a jar doesn't use the old index. * (regression test for bug 35306 Index update request can be incorrectly handled) */ public void testConcurrentJob() throws CoreException, InterruptedException, IOException, TimeOutException { WaitingJob job = new WaitingJob(); try { // setup: suspend indexing and create a project with one empty jar on its classpath job.runAndSuspend(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { JavaCore.run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor2) throws CoreException { createJavaProject("P1", new String[] {}, new String[] {"/P1/jclMin.jar"}, "bin"); createFile("/P1/jclMin.jar", EMPTY_JAR); } }, monitor); } }); final IJavaProject project = getJavaProject("P1"); // start concurrent job final boolean[] success = new boolean[1]; final WaitUntilReadyMonitor monitor = new WaitUntilReadyMonitor(); Thread thread = new Thread() { public void run() { try { assertAllTypes( "Unexpected all types", project, WAIT_UNTIL_READY_TO_SEARCH, monitor, "java.io.Serializable\n" + "java.lang.Class\n" + "java.lang.CloneNotSupportedException\n" + "java.lang.Error\n" + "java.lang.Exception\n" + "java.lang.IllegalMonitorStateException\n" + "java.lang.InterruptedException\n" + "java.lang.Object\n" + "java.lang.RuntimeException\n" + "java.lang.String\n" + "java.lang.Throwable" ); } catch (JavaModelException e) { e.printStackTrace(); return; } success[0] = true; } }; thread.setDaemon(true); thread.start(); // wait for concurrent job to start monitor.sem.acquire(30000); // wait 30s max // change jar contents getFile("/P1/jclMin.jar").setContents(new FileInputStream(getExternalJCLPathString()), IResource.NONE, null); // setContents closes the stream // resume waiting job job.resume(); // wait for concurrent job to finish thread.join(10000); // 10s max assertTrue("Failed to get all types", success[0]); } finally { job.resume(); deleteProject("P1"); } } /* * Ensures that passing a null progress monitor with a CANCEL_IF_NOT_READY_TO_SEARCH * waiting policy doesn't throw a NullPointerException but an OperationCanceledException. * (regression test for bug 33571 SearchEngine.searchAllTypeNames: NPE when passing null as progress monitor) */ public void testNullProgressMonitor() throws CoreException, TimeOutException { WaitingJob job = new WaitingJob(); try { job.suspend(); // query all type names with a null progress monitor boolean operationCanceled = false; try { assertAllTypes( CANCEL_IF_NOT_READY_TO_SEARCH, null, // null progress monitor "Should not get any type" ); } catch (OperationCanceledException e) { operationCanceled = true; } assertTrue("Should throw an OperationCanceledException", operationCanceled); } finally { job.resume(); } } /* * Ensures that types are found if the project is a lib folder * (regression test for bug 83822 Classes at root of project not found in Open Type dialog) */ public void testProjectLib() throws CoreException { try { IJavaProject javaProject = createJavaProject("P1", new String[0], new String[] {"/P1"}, "bin"); createClassFile("/P1", "X.class", "public class X {}"); IProject project = javaProject.getProject(); project.close(null); waitUntilIndexesReady(); project.open(null); assertAllTypes( "Unexpected types in P1", javaProject, "X" ); } finally { deleteProject("P1"); } } /* * Ensure that removing the outer folder from the classpath doesn't remove cus in inner folder * from index * (regression test for bug 32607 Removing outer folder removes nested folder's cus from index) */ public void testRemoveOuterFolder() throws CoreException { try { // setup: one cu in a nested source folder JavaCore.run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { IJavaProject project = createJavaProject("P1"); project.setRawClasspath( createClasspath(new String[] {"/P1/src1", "src2/", "/P1/src1/src2", ""}, false/*no inclusion*/, true/*exclusion*/), new Path("/P1/bin"), null); createFolder("/P1/src1/src2"); createFile( "/P1/src1/src2/X.java", "public class X {\n" + "}" ); } }, null); IJavaProject project = getJavaProject("P1"); assertAllTypes( "Unexpected all types after setup", project, "X" ); // remove outer folder from classpath project.setRawClasspath( createClasspath(new String[] {"/P1/src1/src2", ""}, false/*no inclusion*/, true/*exclusion*/), null); assertAllTypes( "Unexpected all types after removing outer folder", project, "X" ); } finally { deleteProject("P1"); } } /** * Test pattern creation */ public void testSearchPatternCreation01() { SearchPattern searchPattern = createPattern( "main(*)", IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "MethodReferencePattern: main(*), pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation02() { SearchPattern searchPattern = createPattern( "main(*) void", IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "MethodReferencePattern: main(*) --> void, pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation03() { SearchPattern searchPattern = createPattern( "main(String*) void", IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "MethodReferencePattern: main(String*) --> void, pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation04() { SearchPattern searchPattern = createPattern( "main(*[])", IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "MethodReferencePattern: main(*[]), pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation05() { SearchPattern searchPattern = createPattern( "java.lang.*.main ", IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "MethodReferencePattern: java.lang.*.main(...), pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation06() { SearchPattern searchPattern = createPattern( "java.lang.* ", IJavaSearchConstants.CONSTRUCTOR, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "ConstructorReferencePattern: java.lang.*(...), pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation07() { SearchPattern searchPattern = createPattern( "X(*,*)", IJavaSearchConstants.CONSTRUCTOR, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "ConstructorReferencePattern: X(*, *), pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation08() { SearchPattern searchPattern = createPattern( "main(String*,*) void", IJavaSearchConstants.METHOD, IJavaSearchConstants.REFERENCES, true); // case sensitive assertPattern( "MethodReferencePattern: main(String*, *) --> void, pattern match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation10() { SearchPattern searchPattern = createPattern( "x.y.z.Bar.field Foo", IJavaSearchConstants.FIELD, IJavaSearchConstants.DECLARATIONS, true); // case sensitive assertPattern( "FieldDeclarationPattern: x.y.z.Bar.field --> Foo, exact match, case sensitive, generic full match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation12() { IField field = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo").getField("field"); SearchPattern searchPattern = createPattern( field, IJavaSearchConstants.REFERENCES); assertPattern( "FieldReferencePattern: x.y.z.Foo.field --> int, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation13() { IField field = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo").getField("field"); SearchPattern searchPattern = createPattern( field, IJavaSearchConstants.DECLARATIONS); assertPattern( "FieldDeclarationPattern: x.y.z.Foo.field --> int, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation14() { IField field = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo").getField("field"); SearchPattern searchPattern = createPattern( field, IJavaSearchConstants.ALL_OCCURRENCES); assertPattern( "FieldCombinedPattern: x.y.z.Foo.field --> int, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation15() { IImportDeclaration importDecl = getCompilationUnit("/P/x/y/z/Foo.java").getImport("x.y.*"); SearchPattern searchPattern = createPattern( importDecl, IJavaSearchConstants.REFERENCES); assertPattern( "PackageReferencePattern: <x.y>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation16() { IMethod method = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo").getMethod("bar", new String[] {}); SearchPattern searchPattern = createPattern( method, IJavaSearchConstants.DECLARATIONS); assertPattern( "MethodDeclarationPattern: x.y.z.Foo.bar() --> void, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation17() { IMethod method = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo").getMethod("bar", new String[] {}); SearchPattern searchPattern = createPattern( method, IJavaSearchConstants.REFERENCES); assertPattern( "MethodReferencePattern: x.y.z.Foo.bar() --> void, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation18() { IMethod method = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo").getMethod("bar", new String[] {}); SearchPattern searchPattern = createPattern( method, IJavaSearchConstants.ALL_OCCURRENCES); assertPattern( "MethodCombinedPattern: x.y.z.Foo.bar() --> void, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation19() { IType type = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo"); SearchPattern searchPattern = createPattern( type, IJavaSearchConstants.DECLARATIONS); assertPattern( "TypeDeclarationPattern: pkg<x.y.z>, enclosing<>, type<Foo>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation20() { IType type = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo"); SearchPattern searchPattern = createPattern( type, IJavaSearchConstants.REFERENCES); assertPattern( "TypeReferencePattern: qualification<x.y.z>, type<Foo>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation21() { IType type = getCompilationUnit("/P/x/y/z/I.java").getType("I"); SearchPattern searchPattern = createPattern( type, IJavaSearchConstants.IMPLEMENTORS); assertPattern( "SuperInterfaceReferencePattern: <I>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation22() { IType type = getCompilationUnit("/P/x/y/z/Foo.java").getType("Foo"); SearchPattern searchPattern = createPattern( type, IJavaSearchConstants.ALL_OCCURRENCES); assertPattern( "TypeDeclarationPattern: pkg<x.y.z>, enclosing<>, type<Foo>, exact match, case sensitive, generic erasure match, fine grain: none\n" + "| TypeReferencePattern: qualification<x.y.z>, type<Foo>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation23() { IPackageDeclaration pkg = getCompilationUnit("/P/x/y/z/Foo.java").getPackageDeclaration("x.y.z"); SearchPattern searchPattern = createPattern( pkg, IJavaSearchConstants.REFERENCES); assertPattern( "PackageReferencePattern: <x.y.z>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation24() { IPackageFragment pkg = getPackage("/P/x/y/z"); SearchPattern searchPattern = createPattern( pkg, IJavaSearchConstants.REFERENCES); assertPattern( "PackageReferencePattern: <x.y.z>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation25() { IImportDeclaration importDecl = getCompilationUnit("/P/x/y/z/Foo.java").getImport("java.util.Vector"); SearchPattern searchPattern = createPattern( importDecl, IJavaSearchConstants.REFERENCES); assertPattern( "TypeReferencePattern: qualification<java.util>, type<Vector>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation26() { IPackageFragment pkg = getPackage("/P/x/y/z"); SearchPattern searchPattern = createPattern( pkg, IJavaSearchConstants.DECLARATIONS); assertPattern( "PackageDeclarationPattern: <x.y.z>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation27() { IPackageDeclaration pkg = getCompilationUnit("/P/x/y/z/Foo.java").getPackageDeclaration("x.y.z"); SearchPattern searchPattern = createPattern( pkg, IJavaSearchConstants.DECLARATIONS); assertPattern( "PackageDeclarationPattern: <x.y.z>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation28() { IImportDeclaration importDecl = getCompilationUnit("/P/x/y/z/Foo.java").getImport("x.y.*"); SearchPattern searchPattern = createPattern( importDecl, IJavaSearchConstants.DECLARATIONS); assertPattern( "PackageDeclarationPattern: <x.y>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test pattern creation */ public void testSearchPatternCreation29() { IPackageFragment pkg = getPackage("/P/x/y/z"); SearchPattern searchPattern = createPattern( pkg, IJavaSearchConstants.ALL_OCCURRENCES); assertPattern( "PackageDeclarationPattern: <x.y.z>, exact match, case sensitive, generic erasure match, fine grain: none\n" + "| PackageReferencePattern: <x.y.z>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test LocalVarDeclarationPattern creation */ public void testSearchPatternCreation30() { ILocalVariable localVar = new LocalVariable((JavaElement)getCompilationUnit("/P/X.java").getType("X").getMethod("foo", new String[0]), "var", 1, 2, 3, 4, "Z", null, 0, false); SearchPattern searchPattern = createPattern( localVar, IJavaSearchConstants.DECLARATIONS); assertPattern( "LocalVarDeclarationPattern: var [in foo() [in X [in X.java [in <default> [in <project root> [in P]]]]]], exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test LocalVarReferencePattern creation */ public void testSearchPatternCreation31() { ILocalVariable localVar = new LocalVariable((JavaElement)getCompilationUnit("/P/X.java").getType("X").getMethod("foo", new String[0]), "var", 1, 2, 3, 4, "Z", null, 0, false); SearchPattern searchPattern = createPattern( localVar, IJavaSearchConstants.REFERENCES); assertPattern( "LocalVarReferencePattern: var [in foo() [in X [in X.java [in <default> [in <project root> [in P]]]]]], exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test LocalVarCombinedPattern creation */ public void testSearchPatternCreation32() { ILocalVariable localVar = new LocalVariable((JavaElement)getCompilationUnit("/P/X.java").getType("X").getMethod("foo", new String[0]), "var", 1, 2, 3, 4, "Z", null, 0, false); SearchPattern searchPattern = createPattern( localVar, IJavaSearchConstants.ALL_OCCURRENCES); assertPattern( "LocalVarCombinedPattern: var [in foo() [in X [in X.java [in <default> [in <project root> [in P]]]]]], exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test TypeDeclarationPattern creation */ public void testSearchPatternCreation33() { IType localType = getCompilationUnit("/P/X.java").getType("X").getMethod("foo", new String[0]).getType("Y", 2); SearchPattern searchPattern = createPattern( localType, IJavaSearchConstants.DECLARATIONS); assertPattern( "TypeDeclarationPattern: pkg<>, enclosing<X.*>, type<Y>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test TypeReferencePattern creation */ public void testSearchPatternCreation34() { IType localType = getCompilationUnit("/P/X.java").getType("X").getMethod("foo", new String[0]).getType("Y", 3); SearchPattern searchPattern = createPattern( localType, IJavaSearchConstants.REFERENCES); assertPattern( "TypeReferencePattern: qualification<X.*>, type<Y>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test TypeDeclarationPattern creation */ public void testSearchPatternCreation35() { IType localType = getCompilationUnit("/P/X.java").getType("X").getInitializer(1).getType("Y", 2); SearchPattern searchPattern = createPattern( localType, IJavaSearchConstants.DECLARATIONS); assertPattern( "TypeDeclarationPattern: pkg<>, enclosing<X.*>, type<Y>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Test TypeReferencePattern creation */ public void testSearchPatternCreation36() { IType localType = getCompilationUnit("/P/X.java").getType("X").getInitializer(2).getType("Y", 3); SearchPattern searchPattern = createPattern( localType, IJavaSearchConstants.REFERENCES); assertPattern( "TypeReferencePattern: qualification<X.*>, type<Y>, exact match, case sensitive, generic erasure match, fine grain: none", searchPattern); } /** * Fine grain patterns */ public void testSearchPatternCreation37() { int allFlags = 0xFFFFFFF0; SearchPattern searchPattern = createPattern("*", TYPE, allFlags, true); assertPattern( "TypeReferencePattern: qualification<*>, type<*>, pattern match, case sensitive, generic full match, " + "fine grain: FIELD_DECLARATION_TYPE_REFERENCE | " + "LOCAL_VARIABLE_DECLARATION_TYPE_REFERENCE | " + "PARAMETER_DECLARATION_TYPE_REFERENCE | " + "SUPERTYPE_TYPE_REFERENCE | " + "THROWS_CLAUSE_TYPE_REFERENCE | " + "CAST_TYPE_REFERENCE | " + "CATCH_TYPE_REFERENCE | " + "CLASS_INSTANCE_CREATION_TYPE_REFERENCE | " + "RETURN_TYPE_REFERENCE | " + "IMPORT_DECLARATION_TYPE_REFERENCE | " + "ANNOTATION_TYPE_REFERENCE | " + "TYPE_ARGUMENT_TYPE_REFERENCE | " + "TYPE_VARIABLE_BOUND_TYPE_REFERENCE | " + "WILDCARD_BOUND_TYPE_REFERENCE | " + " | " + // unused slots " | " + " | " + " | " + "SUPER_REFERENCE | " + "QUALIFIED_REFERENCE | " + "THIS_REFERENCE | " + "IMPLICIT_THIS_REFERENCE | " + "METHOD_REFERENCE_EXPRESSION | " + // unused slots " | " + " | ", searchPattern); } /** * Test pattern validation */ public void testSearchPatternValidMatchRule01() { assertValidMatchRule("foo", SearchPattern.R_EXACT_MATCH, SearchPattern.R_EXACT_MATCH); } public void testSearchPatternValidMatchRule02() { assertValidMatchRule("foo", SearchPattern.R_PREFIX_MATCH, SearchPattern.R_PREFIX_MATCH); } public void testSearchPatternValidMatchRule03() { assertValidMatchRule("foo", SearchPattern.R_PATTERN_MATCH, SearchPattern.R_EXACT_MATCH); } public void testSearchPatternValidMatchRule04() { assertValidMatchRule("foo", SearchPattern.R_PATTERN_MATCH | SearchPattern.R_PREFIX_MATCH, SearchPattern.R_PREFIX_MATCH); } public void testSearchPatternValidMatchRule05() { assertValidMatchRule("foo", SearchPattern.R_CAMELCASE_MATCH, SearchPattern.R_PREFIX_MATCH); } public void testSearchPatternValidMatchRule06() { assertValidMatchRule("foo", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH, SearchPattern.R_EXACT_MATCH); } public void testSearchPatternValidMatchRule10() { assertValidMatchRule("CP*P", SearchPattern.R_EXACT_MATCH, SearchPattern.R_PATTERN_MATCH); } public void testSearchPatternValidMatchRule11() { assertValidMatchRule("CP*P", SearchPattern.R_PREFIX_MATCH, SearchPattern.R_PATTERN_MATCH); } public void testSearchPatternValidMatchRule12() { assertValidMatchRule("CP*P", SearchPattern.R_PATTERN_MATCH, SearchPattern.R_PATTERN_MATCH); } public void testSearchPatternValidMatchRule13() { assertValidMatchRule("CP*P", SearchPattern.R_PATTERN_MATCH | SearchPattern.R_PREFIX_MATCH, SearchPattern.R_PATTERN_MATCH); } public void testSearchPatternValidMatchRule14() { assertValidMatchRule("CP*P", SearchPattern.R_CAMELCASE_MATCH, SearchPattern.R_PATTERN_MATCH); } public void testSearchPatternValidMatchRule15() { assertValidMatchRule("CP*P", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH, SearchPattern.R_PATTERN_MATCH); } public void testSearchPatternValidMatchRule20() { assertValidMatchRule("NPE", SearchPattern.R_CAMELCASE_MATCH); } public void testSearchPatternValidMatchRule21() { assertValidMatchRule("NPE", SearchPattern.R_CAMELCASE_MATCH | SearchPattern.R_PREFIX_MATCH | SearchPattern.R_CASE_SENSITIVE, SearchPattern.R_CAMELCASE_MATCH | SearchPattern.R_CASE_SENSITIVE); } public void testSearchPatternValidMatchRule22() { assertValidMatchRule("nPE", SearchPattern.R_CAMELCASE_MATCH); } public void testSearchPatternValidMatchRule23() { assertValidMatchRule("NuPoEx", SearchPattern.R_CAMELCASE_MATCH); } public void testSearchPatternValidMatchRule24() { assertValidMatchRule("oF", SearchPattern.R_CAMELCASE_MATCH); } public void testSearchPatternValidMatchRule30() { assertValidMatchRule("NPE", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH); } public void testSearchPatternValidMatchRule31() { assertValidMatchRule("NPE", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH | SearchPattern.R_PREFIX_MATCH, SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH); } public void testSearchPatternValidMatchRule32() { assertValidMatchRule("NPE", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH | SearchPattern.R_CASE_SENSITIVE); } public void testSearchPatternValidMatchRule33() { assertValidMatchRule("NPE", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH | SearchPattern.R_PREFIX_MATCH | SearchPattern.R_CASE_SENSITIVE, SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH | SearchPattern.R_CASE_SENSITIVE); } public void testSearchPatternValidMatchRule34() { assertValidMatchRule("nPE", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH); } public void testSearchPatternValidMatchRule35() { assertValidMatchRule("NuPoEx", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH); } public void testSearchPatternValidMatchRule36() { assertValidMatchRule("oF", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH); } public void testSearchPatternValidMatchRule40() { assertValidMatchRule("Nu/Po/Ex", SearchPattern.R_CAMELCASE_MATCH, SearchPattern.R_PREFIX_MATCH); } public void testSearchPatternValidMatchRule41() { assertValidMatchRule("Nu.Po.Ex", SearchPattern.R_CAMELCASE_MATCH | SearchPattern.R_PREFIX_MATCH, SearchPattern.R_PREFIX_MATCH); } public void testSearchPatternValidMatchRule42() { assertValidMatchRule("hashMap", SearchPattern.R_CAMELCASE_MATCH); } public void testSearchPatternValidMatchRule43() { assertValidMatchRule("Hashmap", SearchPattern.R_CAMELCASE_MATCH, SearchPattern.R_PREFIX_MATCH); } public void testSearchPatternValidMatchRule44() { assertValidMatchRule("Nu/Po/Ex", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH, SearchPattern.R_EXACT_MATCH); } public void testSearchPatternValidMatchRule45() { assertValidMatchRule("Nu.Po.Ex", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH | SearchPattern.R_PREFIX_MATCH, SearchPattern.R_EXACT_MATCH); } public void testSearchPatternValidMatchRule46() { assertValidMatchRule("hashMap", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH); } public void testSearchPatternValidMatchRule47() { assertValidMatchRule("Hashmap", SearchPattern.R_CAMELCASE_SAME_PART_COUNT_MATCH, SearchPattern.R_EXACT_MATCH); } }