1 /******************************************************************************* 2 * Copyright (c) 2000, 2020 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 package org.eclipse.jdt.ui.tests.packageview; 15 16 import static org.junit.Assert.assertEquals; 17 import static org.junit.Assert.assertNotNull; 18 import static org.junit.Assert.assertSame; 19 import static org.junit.Assert.assertTrue; 20 import static org.junit.Assert.fail; 21 22 import java.io.File; 23 24 import org.junit.After; 25 import org.junit.Before; 26 import org.junit.Test; 27 import org.junit.runner.RunWith; 28 import org.junit.runners.JUnit4; 29 30 import org.eclipse.jdt.testplugin.JavaProjectHelper; 31 import org.eclipse.jdt.testplugin.JavaTestPlugin; 32 33 import org.eclipse.core.runtime.Path; 34 35 import org.eclipse.core.resources.IFile; 36 import org.eclipse.core.resources.IResource; 37 import org.eclipse.core.resources.IWorkspace; 38 import org.eclipse.core.resources.IWorkspaceDescription; 39 import org.eclipse.core.resources.ResourcesPlugin; 40 41 import org.eclipse.jface.viewers.ITreeContentProvider; 42 43 import org.eclipse.ui.IViewPart; 44 import org.eclipse.ui.IWorkbench; 45 import org.eclipse.ui.IWorkbenchPage; 46 import org.eclipse.ui.PlatformUI; 47 48 import org.eclipse.jdt.core.IClassFile; 49 import org.eclipse.jdt.core.ICompilationUnit; 50 import org.eclipse.jdt.core.IJavaElement; 51 import org.eclipse.jdt.core.IJavaProject; 52 import org.eclipse.jdt.core.IPackageFragment; 53 import org.eclipse.jdt.core.IPackageFragmentRoot; 54 55 import org.eclipse.jdt.internal.ui.util.CoreUtility; 56 57 58 /** 59 * Tests for the PackageExplorerContentProvider. 60 * 61 * @since 2.1 62 */ 63 @RunWith(JUnit4.class) 64 public class ContentProviderTests4{ 65 66 private IPackageFragmentRoot fRoot1; 67 private IPackageFragment fPack1; 68 private IPackageFragment fPack2; 69 private IPackageFragment fPack4; 70 private IPackageFragment fPack3; 71 private IWorkspace fWorkspace; 72 private IWorkbench fWorkbench; 73 private MockPluginView fMyPart; 74 75 private ITreeContentProvider fProvider; 76 77 private IPackageFragment fPack5; 78 private IJavaProject fJProject3; 79 private IPackageFragment fPack6; 80 private IPackageFragmentRoot fInternalRoot1; 81 private IPackageFragment fA; 82 private IPackageFragment fX; 83 private IPackageFragment fC; 84 private IPackageFragment fD; 85 private IPackageFragment fY; 86 private IPackageFragment fDefaultPackage; 87 private ICompilationUnit fCU1; 88 private ICompilationUnit fCU2; 89 private IClassFile fYClassFile; 90 91 private IPackageFragmentRoot jdk; 92 private IFile fFile1; 93 private IFile fFile2; 94 private IClassFile fAClassFile; 95 96 private IWorkbenchPage page; 97 private ICompilationUnit fCUinDefault; 98 private File myInternalLibJar; 99 private boolean fEnableAutoBuildAfterTesting; 100 101 @Test testGetChildrenProject()102 public void testGetChildrenProject() throws Exception{ 103 Object[] expectedChildren= new Object[]{fPack1, fPack2, fPack3, fDefaultPackage, fFile1, fFile2,fInternalRoot1,jdk}; 104 Object[] children= fProvider.getChildren(fJProject3); 105 assertTrue("Wrong children found for project with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$ 106 } 107 108 @Test testGetChildrenDefaultProject()109 public void testGetChildrenDefaultProject(){ 110 Object[] expectedChildren= new Object[]{fCUinDefault}; 111 Object[] children= fProvider.getChildren(fDefaultPackage); 112 assertTrue("Wrong children found for default package with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$ 113 } 114 115 @Test testGetChildrentMidLevelFragment()116 public void testGetChildrentMidLevelFragment() throws Exception{ 117 Object[] expectedChildren= new Object[]{fPack4, fPack6}; 118 Object[] children= fProvider.getChildren(fPack3); 119 assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$ 120 } 121 122 @Test testGetChildrenBottomLevelFragment()123 public void testGetChildrenBottomLevelFragment() throws Exception{ 124 Object[] expectedChildren= new Object[]{}; 125 Object[] children= fProvider.getChildren(fPack1); 126 assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$ 127 } 128 129 @Test testGetChildrenBottomLevelFragmentWithCU()130 public void testGetChildrenBottomLevelFragmentWithCU() throws Exception{ 131 Object[] expectedChildren= new Object[]{fCU1}; 132 Object[] children= fProvider.getChildren(fPack2); 133 assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$ 134 } 135 136 @Test testGetChildrenBottomLevelFragmenWithCU2()137 public void testGetChildrenBottomLevelFragmenWithCU2() throws Exception{ 138 Object[] expectedChildren= new Object[]{fCU2}; 139 Object[] children= fProvider.getChildren(fPack6); 140 assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$ 141 } 142 143 @Test testGetChildrenMidLevelFragmentInInternalArchive()144 public void testGetChildrenMidLevelFragmentInInternalArchive() throws Exception{ 145 Object[] expectedChildren= new Object[]{fC, fD, fAClassFile}; 146 Object[] children= fProvider.getChildren(fA); 147 assertTrue("wrong children found for a NON bottom PackageFragment in PackageFragmentRoot Internal Archive with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$ 148 } 149 150 @Test testGetChildrenBottomLevelFragmentInInternalArchive()151 public void testGetChildrenBottomLevelFragmentInInternalArchive() throws Exception{ 152 Object[] expectedChildren= new Object[]{fYClassFile}; 153 Object[] children= fProvider.getChildren(fY); 154 assertTrue("wrong children found for a bottom PackageFragment in PackageFragmentRoot Internal Archive with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$ 155 } 156 getChildrenInternalArchive()157 public void getChildrenInternalArchive() throws Exception{ 158 Object[] expectedChildren= new Object[]{fX,fA, fInternalRoot1.getPackageFragment("")}; //$NON-NLS-1$ 159 Object[] children= fProvider.getChildren(fInternalRoot1); 160 assertTrue("Wrong child found for PackageFragmentRoot Internal Archive with folding", compareArrays(children,expectedChildren)); //$NON-NLS-1$ 161 } 162 163 //---------------Get Parent Tests----------------------------- 164 165 @Test testGetParentArchive()166 public void testGetParentArchive() throws Exception{ 167 Object parent= fProvider.getParent(fInternalRoot1); 168 assertSame("Wrong parent found for PackageFragmentRoot Archive with folding", parent, fJProject3);//$NON-NLS-1$ 169 } 170 171 @Test testGetParentMidLevelFragmentInArchive()172 public void testGetParentMidLevelFragmentInArchive() throws Exception{ 173 Object expectedParent= fA; 174 Object parent= fProvider.getParent(fC); 175 assertEquals("Wrong parent found for a NON top level PackageFragment in an Archive with folding", expectedParent, parent);//$NON-NLS-1$ 176 } 177 178 @Test testGetParentTopLevelFragmentInArchive()179 public void testGetParentTopLevelFragmentInArchive() throws Exception{ 180 Object expectedParent= fInternalRoot1; 181 Object parent= fProvider.getParent(fA); 182 assertEquals("Wrong parent found for a top level PackageFragment in an Archive with folding", expectedParent, parent); //$NON-NLS-1$ 183 } 184 185 @Test testGetParentTopLevelFragment()186 public void testGetParentTopLevelFragment() throws Exception{ 187 Object expectedParent= fJProject3; 188 Object parent= fProvider.getParent(fPack3); 189 assertEquals("Wrong parent found for a top level PackageFragment with folding", expectedParent, parent);//$NON-NLS-1$ 190 } 191 192 @Test testGetParentMidLevelFragment()193 public void testGetParentMidLevelFragment() throws Exception{ 194 Object expectedParent= fPack3; 195 Object parent= fProvider.getParent(fPack6); 196 assertEquals("Wrong parent found for a NON top level PackageFragment with folding", expectedParent, parent);//$NON-NLS-1$ 197 } 198 199 @Test testGetParentMidLevelFragment2()200 public void testGetParentMidLevelFragment2() throws Exception{ 201 Object expectedParent= fPack3; 202 Object parent= fProvider.getParent(fPack5); 203 assertEquals("Wrong parent found for a NON top level PackageFragment with folding", expectedParent, parent);//$NON-NLS-1$ 204 } 205 206 207 //-------------------Set up methods-------------------------------- 208 @Before setUp()209 public void setUp() throws Exception { 210 fWorkspace= ResourcesPlugin.getWorkspace(); 211 assertNotNull(fWorkspace); 212 IWorkspaceDescription workspaceDesc= fWorkspace.getDescription(); 213 fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding(); 214 if (fEnableAutoBuildAfterTesting) 215 CoreUtility.setAutoBuilding(false); 216 217 //create project 218 fJProject3 = JavaProjectHelper.createJavaProject("TestProject3", "bin");//$NON-NLS-1$//$NON-NLS-2$ 219 assertNotNull("project3 null", fJProject3);//$NON-NLS-1$ 220 221 for (Object object : fJProject3.getNonJavaResources()) { 222 if (object instanceof IFile) { 223 IFile file = (IFile) object; 224 if (".classpath".equals(file.getName()))//$NON-NLS-1$ 225 fFile1 = file; 226 else if (".project".equals(file.getName()))//$NON-NLS-1$ 227 fFile2 = file; 228 } 229 } 230 assertNotNull(fFile1); 231 assertNotNull(fFile2); 232 233 //add rt.jar 234 jdk= JavaProjectHelper.addVariableRTJar(fJProject3, "JRE_LIB_TEST", null, null);//$NON-NLS-1$ 235 assertNotNull("jdk not found", jdk);//$NON-NLS-1$ 236 237 //create the PackageFragmentRoot that represents the project as source folder 238 fRoot1= JavaProjectHelper.addSourceContainer(fJProject3, "");//$NON-NLS-1$ 239 assertNotNull("getting default package", fRoot1);//$NON-NLS-1$ 240 241 fDefaultPackage= fRoot1.createPackageFragment("",true,null);//$NON-NLS-1$ 242 fCUinDefault= fDefaultPackage.createCompilationUnit("Object.java","",true, null);//$NON-NLS-1$//$NON-NLS-2$ 243 244 //set up project #3: file system structure with project as source folder 245 //add an internal jar 246 myInternalLibJar = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/myinternallib.jar"));//$NON-NLS-1$ 247 assertNotNull("lib not found", myInternalLibJar); //$NON-NLS-1$ 248 assertTrue("lib not found", myInternalLibJar.exists()); //$NON-NLS-1$ 249 fInternalRoot1= JavaProjectHelper.addLibraryWithImport(fJProject3, Path.fromOSString(myInternalLibJar.getPath()), null, null); 250 251 //create internal PackageFragments 252 fA= fInternalRoot1.getPackageFragment("a");//$NON-NLS-1$ 253 fX= fInternalRoot1.getPackageFragment("x");//$NON-NLS-1$ 254 fInternalRoot1.getPackageFragment("a.b");//$NON-NLS-1$ 255 fC= fInternalRoot1.getPackageFragment("a.b.c");//$NON-NLS-1$ 256 fD= fInternalRoot1.getPackageFragment("a.d");//$NON-NLS-1$ 257 fY= fInternalRoot1.getPackageFragment("x.y");//$NON-NLS-1$ 258 259 fYClassFile= fY.getClassFile("Y.class");//$NON-NLS-1$ 260 fAClassFile= fA.getClassFile("A.class");//$NON-NLS-1$ 261 262 //create PackageFragments 263 fPack1= fRoot1.createPackageFragment("pack1", true, null);//$NON-NLS-1$ 264 fPack2= fRoot1.createPackageFragment("pack2", true, null);//$NON-NLS-1$ 265 fPack3= fRoot1.createPackageFragment("pack3",true,null);//$NON-NLS-1$ 266 fPack4= fRoot1.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$ 267 fPack5= fRoot1.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$ 268 fPack6= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$ 269 270 fCU1= fPack2.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$ 271 fCU2= fPack6.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$ 272 273 //set up the mock view 274 setUpMockView(); 275 } 276 setUpMockView()277 public void setUpMockView() throws Exception { 278 // fWorkspace = ResourcesPlugin.getWorkspace(); 279 // assertNotNull(fWorkspace); 280 281 fWorkbench = PlatformUI.getWorkbench(); 282 assertNotNull(fWorkbench); 283 284 page = fWorkbench.getActiveWorkbenchWindow().getActivePage(); 285 assertNotNull(page); 286 287 //just testing to make sure my part can be created 288 IViewPart myPart = new MockPluginView(); 289 assertNotNull(myPart); 290 291 myPart = page.showView("org.eclipse.jdt.ui.tests.packageview.MockPluginView");//$NON-NLS-1$ 292 if (myPart instanceof MockPluginView) { 293 fMyPart = (MockPluginView) myPart; 294 fMyPart.setFolding(true); 295 fMyPart.setFlatLayout(false); 296 // above call might cause a property change event being sent 297 fMyPart.clear(); 298 fProvider = (ITreeContentProvider) fMyPart.getTreeViewer().getContentProvider(); 299 } else 300 fail("Unable to get view");//$NON-NLS-1$ 301 302 assertNotNull(fProvider); 303 } 304 305 @After tearDown()306 public void tearDown() throws Exception { 307 308 fInternalRoot1.close(); 309 JavaProjectHelper.delete(fJProject3); 310 page.hideView(fMyPart); 311 312 if (fEnableAutoBuildAfterTesting) 313 CoreUtility.setAutoBuilding(true); 314 315 } 316 317 /** 318 * Method compareArrays. Both arrays must be of IPackageFragments or compare will fail. 319 * @param children 320 * @param expectedChildren 321 * @return boolean 322 */ compareArrays(Object[] children, Object[] expectedChildren)323 private boolean compareArrays(Object[] children, Object[] expectedChildren) { 324 if(children.length!=expectedChildren.length) 325 return false; 326 for (Object child : children) { 327 if (child instanceof IJavaElement) { 328 IJavaElement el= (IJavaElement) child; 329 if(!contains(el, expectedChildren)) 330 return false; 331 } else if(child instanceof IResource){ 332 IResource res = (IResource) child; 333 if(!contains(res, expectedChildren)){ 334 return false; 335 } 336 } 337 } 338 return true; 339 } 340 /** 341 * Method contains. 342 * @param res 343 * @param expectedChildren 344 * @return boolean 345 */ contains(IResource res, Object[] expectedChildren)346 private boolean contains(IResource res, Object[] expectedChildren) { 347 for (Object object : expectedChildren) { 348 if (object instanceof IResource) { 349 IResource expres= (IResource) object; 350 if(expres.equals(res)) 351 return true; 352 } 353 } 354 return false; 355 } 356 357 /** 358 * Method contains. 359 * @param fragment 360 * @param expectedChildren 361 * @return boolean 362 */ contains(IJavaElement fragment, Object[] expectedChildren)363 private boolean contains(IJavaElement fragment, Object[] expectedChildren) { 364 for (Object object : expectedChildren) { 365 if (object instanceof IJavaElement) { 366 IJavaElement expfrag= (IJavaElement) object; 367 if(expfrag.equals(fragment)) 368 return true; 369 } 370 } 371 return false; 372 } 373 } 374